单片机学习小组
直播中

李晓鹏

7年用户 1287经验值
私信 关注

74hc595芯片具有哪些功能?

74hc595芯片具有哪些功能?

回帖(1)

陈臻江

2022-1-17 14:26:04

  • 单片机IO扩展(串转并)-74hc595

芯片的功能介绍
说明:8 位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。三态。
应用:串行到并行的数据转换。

15 和 1 到 7 脚 QA–QH:并行数据输出
9 脚 QH 非:串行数据输出
10 脚 SCLK 非( MR) : 低电平复位引脚
11 脚 SCK( SHCP) : 移位寄存器时钟输入
12 脚 RCK( STCP) : 存储寄存器时钟输入
13 脚 G 非( OE) : 输出有效
14 脚 SER( DS) : 串行数据输入
595 是具有 8 位移位寄存器和一个存储器,三态输出功能。
真值表解读
G =1,其他=x;QA-QH为三态状态(可能高或低)
RCK,SCK任意,SCLR
=0,G =0,清空移位寄存器
SCK=上升沿时, SCLR
=1,G =0,数据进入移位寄存器
RCK=上升沿时,SCLR
=1,G *=0, 移位寄存器的内容转移到输出锁存器
时序图
开发板原理图
由真值表可知,对数据读写操作SRCLR*=1,OE*=0就好了,所以分别接GND、VCC

软件设计


void Hc595SendByte(u8 dat)// 74H595 发送一个字节的数据
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送 8 位数
{
SER = dat >> 7; //从最高位开始发送
dat <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}


在main()中
ledNum = ~0x01;
while(1)
{
Hc595SendByte(ledNum);// ~0x01, ~0x02, ~0x04,一次点亮led灯
ledNum = _crol_(ledNum, 1);
delay(50000);
}


课后作业


(1)设计一个 0-9 数字循环显示器。(温馨提示:在 main 函数内使用 for
循环语句,间隔一定时间调用数码管段码数组数据)


while(1)
                {
                        for(i=0;i<15;i++)
                        {
                                delay(50000);
                                Hc595SendByte(~smgduan);
                                delay(50000);
                        }
                }


(2)使用 74HC595(A)的并行输出口连接动态数码管的位选,实现在动态
数码管上显示 0-7。


//595循环位选,smgduan;数码管循环显示。
u8 i,ledNum;
                ledNum = ~0x01;
       
                while(1)
                {
                        for(i=0;i<8;i++)
                        {
                               
                                Hc595SendByte(ledNum);
                                ledNum = _crol_(ledNum, 1);
                                GPIO_DIG=smgduan;
                                delay(100);
                                GPIO_DIG=0x00;//消隐
                        }
                }


LED 点阵实验
开发板原理图


级联时,两条时钟线是连在一起的,输出QH*接到下一个595的串行输入口SER


软件设计


        /*********注意RCLK在reg51文件中已经定义过了,你得起一个新名字
//第一个字节数据,会从SEG传送到最后一个595,最后一个字节数据,送给第一个595;
//第一个字节控制列NEG8~NEG16;最后一个字节数据控制行POS1~POS7
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
{
        u8 a;
        SRCLK = 1;
        RCLK = 1;
        for(a=0;a<8;a++) //发送 8 位数
        {
                SER = dat1 >> 7; //从最高位开始发送
                dat1 <<= 1;
                SRCLK = 0; //发送时序
                _nop_();
                _nop_();
                SRCLK = 1;
        }
        for(a=0;a<8;a++) //发送 8 位数
        {
                SER = dat2 >> 7; //从最高位开始发送
                dat2 <<= 1;
                SRCLK = 0; //发送时序
                _nop_();
                _nop_();
                SRCLK = 1;
        }
        for(a=0;a<8;a++) //发送 8 位数
        {
                SER = dat3 >> 7; //从最高位开始发送
                dat3 <<= 1;
                        SRCLK = 0; //发送时序
                _nop_();
                _nop_();
                SRCLK = 1;
        }
        for(a=0;a<8;a++) //发送 8 位数
        {
                SER = dat4 >> 7; //从最高位开始发送
                dat4 <<= 1;
                SRCLK = 0; //发送时序
                _nop_();
                _nop_();
                SRCLK = 1;
        }
        RCLK = 0;
        _nop_();
        _nop_();
        RCLK = 1;
}


keil错误解析


9.18.c(11): warning C206: ‘Hc595SendByte’: missing function-prototype
原因:这个函数没有定义。需要在调用’Hc595SendByte’这个函数前先声明。
解决方法:添加.h文件


*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
原因:缺函数声明呀,实现函数呀
解决方法:看.c.h,都有不


APP74hc595.h(8): error C231: ‘RCLK’: redefinition
原因:reg52.h中定义过RCLK


很不舍,接下来的日子,我要断更了,人总是要顺应时势发展的,眼看开学在即,借本考试也会接踵而来,我不能再由着性子,搞单片机了,接下来的日子,我要加油!
待到合适的时间,我会卷土重来。
举报

更多回帖

×
20
完善资料,
赚取积分