sbk100 发表于 2025-12-4 09:26:47

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

实验内容
掌握熟悉 165 的使用环境与要求。
掌握 165 的基本编程方法。

先上电路



    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 的活动状态
发生位移。


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




    具体时序图如下:





实验测试
连线: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;         // 数码管显示
}

/*******************************************************
* 函数名称: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;
}

流程图




芯映芯 发表于 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不停电下载, 演示视频链接
https://v.stcai.com/sv/1c5eec2-197fcd9b766/1c5eec2-197fcd9b766.mp4
https://v.stcai.com/sv/1fce8086-197cf2b9dd4/1fce8086-197cf2b9dd4.mp4

神农鼎 发表于 2025-12-4 10:11:50

串行 扩展,尽量只用一种,
串行转并行输出 74HC595,
用强推挽控制 74HC595。



输入直接用 MCU的 I/O
页: [1]
查看完整版本: 新手学STC单片机 实验五 165并串转换