找回密码
 立即注册
查看: 51|回复: 2

新手学STC单片机 实验五 165并串转换

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:31
  • 最近打卡:2025-12-17 09:44:38

20

主题

29

回帖

85

积分

注册会员

积分
85
发表于 2025-12-4 09:26:47 | 显示全部楼层 |阅读模式
实验内容
  掌握熟悉 165 的使用环境与要求。
  掌握 165 的基本编程方法。

先上电路

截图202512040920395557.jpg

    74HC165 是一款高速 CMOS 器件,74HC165 遵循 JEDEC 标准 no.7A。74HC165 引
脚兼容低功耗肖特基 TTL(LSTTL)系列。
    74HC165 是 8 位并行输入串行输出移位寄存器,可在末级得到互斥的串行输出
(QH 和 QH 非),当并行读取(S/L)输入为低时,从 A 到 H 口输入的并行数据将被
异步地读取进寄存器内。而当 S/L 为高时,数据串行进入寄存器,在每个时钟脉冲
的上升沿向右移动一位(A → B → C,等等)。利用这种特性,只要把 QH 输出绑
定到下一级的 SI 输入,即可实现并转串扩展。
    74HC165 的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效
时钟使能(CLKINH)输入。CLK 和 CLKINH 的引脚分配是独立的并且在必要时,为了
布线的方便可以互换。只有在 CLKINH 为低时,才允许 CLK 由低转高,QH 串行输出。
在 S/L 上升沿来临之前,CLK 或者 CLKINH 应当置高,以防止数据在 S/L 的活动状态
发生位移。
截图202512040921332894.jpg

    上图为 74HC165 芯片的引脚分布,对应上图的真值表如下:


截图202512040922109846.jpg

    具体时序图如下:


截图202512040922566338.jpg


实验测试
  连线:P0 口接 JP71 ,P1.1~P1.3 分别接 JP47,JP74 连接到 JP48 的 IN0-IN3
  实验现象:四位按键控制,数码管显示哪个按键按下。

代码分析
/********************************************************
* 程序功能:利用165实现四位按键并行输入串行输出到MCU,
*          最终显示到数码管
* 程序连线:P0口接JP71 ,P1.1~P1.3分别接JP47,JP74连接
*          到JP48的IN0-IN3
*******************************************************/

#include <intrins.h>
#include "hal.h"

#ifndef FOSC    // 晶振
#define FOSC 12000000L
#endif

#define DATA P0

unsigned char code led[] = {
    0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
    0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x00, 0x40
};  // 显示段码值0~F

bit flag;
sbit HC165_CK = P1^1;
sbit HC165_SL = P1^2;
sbit HC165_QH = P1^3;

unsigned char Temp, key, num;

/*******************************************************
* 函数名称:Timer0Init()
* 函数功能:定时器0初始化函数 10毫秒@12MHz
* 入口参数:无
* 返回参数:无
********************************************************/
void Timer0Init(void)
{
    TIMER_CLK_DIV(0, 12);    // 定时器时钟12T模式
    TIMER_TIME(0);           // 设置定时器0定时模式
    TIMER_MODE(0, 0);        // 设置定时器0模式0
    TL0 = 0x00;              // 设置定时初值
    TH0 = 0xDC;              // 设置定时初值
    CLR_TIMER_FLAG(0);       // 清除TF0标志
}

/*******************************************************
* 函数名称:Display()
* 函数功能:数码管显示
* 入口参数:Num
* 返回参数:无
********************************************************/
void Display(unsigned char Num)
{
    DATA = led[Num];         // 数码管显示
}

/*******************************************************
* 函数名称:HC165()
* 函数功能:165接收
* 入口参数:无
* 返回参数:Temp,即接收值
********************************************************/
unsigned char HC165(void)
{
    unsigned char i;
    unsigned char Temp;

    HC165_CK = 1;
    HC165_SL = 0;            // HC165读按键
    _nop_(); _nop_(); _nop_();
    HC165_SL = 1;            // 暂停HC165读按键

    Temp = 0;
    for (i = 0; i < 8; i++) {
        Temp <<= 1;
        if (HC165_QH) {
            Temp = Temp | 0x01;
        }
        HC165_CK = 0;        // 时钟低
        _nop_();
        _nop_(); _nop_();    // 先接收高位
        HC165_CK = 1;        // 时钟高,上升沿下一个数据移出
        _nop_();
    }

    HC165_CK = 0;
    return Temp;
}

/*******************************************************
* 函数名称:main()
* 函数功能:程序主函数
********************************************************/
void main()
{
    P0M0 = 0xff;
    P0M1 = 0x00;

    Timer0Init();            // 初始化定时器
    TIMER_RUN(0, START);     // 定时器0开始计时
    TIMER_INT_EN(0, ON);     // 开启定时器0中断
    INT_GLOBAL_ENABLE(ON);   // 开启全局中断

    Display(0);

    while (1) {
        if (flag) {
            flag = 0;
            if (key == 0x0e) {      // 如果第一个按键按下,数码管显示1,下同
                Display(1);
            } else if (key == 0x0d) {
                Display(2);
            } else if (key == 0x0b) {
                Display(3);
            } else if (key == 0x07) {
                Display(4);
            }
        }
    }
}

/*******************************************************
* 函数名称:Timer0_ISR()
* 函数功能:定时器0中断服务程序
* 入口参数:无
* 返回参数:无
********************************************************/
void Timer0_ISR() interrupt 1 using 1
{
    key = HC165();
    flag = 1;
}

流程图

截图202512040926132826.jpg


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:42
  • 最近打卡:2025-12-17 10:18:24
已绑定手机

14

主题

94

回帖

824

积分

版主

积分
824
发表于 2025-12-4 09:59:00 | 显示全部楼层
要 做到 USB不停电下载;
要 尝试 图形化配置外设;
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接
www.STCAI.com

下载 最新的 AiCube-ISP-V6.96G 或以上版本软件 !
深圳国芯人工智能有限公司-工具软件


下载 最新的 USB库函数,永远用最新的 USB库函数 !
深圳国芯人工智能有限公司-库函数
下载 最新的 用户手册 !
下载 最新的 上机实践指导书 !
推荐优先看的 printf_usb("Hello World !\r\n")及usb不停电下载, 演示视频链接

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:267
  • 最近打卡:2025-12-17 08:54:37

813

主题

1万

回帖

2万

积分

管理员

积分
21311
发表于 2025-12-4 10:11:50 | 显示全部楼层
串行 扩展,尽量只用一种,
串行转并行输出 74HC595,
用强推挽控制 74HC595。



输入直接用 MCU的 I/O
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-17 18:49 , Processed in 0.104229 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表