一、原理介绍
595有两个寄存器,都是8位的,如下所示:
595是串入并出带有锁存功能移位寄存器,它的使用方法简单:
- - 在正常使用时 /SCLR接高电平,/G接低电平。
- - 从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,直到八位数据输入完毕
- - 输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
不同的595引脚名称会不一样,但是功能是一样的。大家看引脚序号即可。以下是595引脚图:
595具体使用的步骤:
第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。(用到SER数据输入引脚)
方法:送位数据到595。
第二步:目的:将位数据逐位移入74HC595,即数据串入(用到SCK引脚,移位寄存器)
方法:SCK 产生一上升沿,将595上的数据移入74HC595中的移位寄存器中,从低到高
第三步:目的:并行输出数据。即数据并出(用到RCK引脚,锁存器)
方法:RCK 产生一上升沿,将由SER上已移入数据寄存器中的数据送入到输出锁存器。
二、proteus 仿真画图
由于手头上没有595的硬件,用proteus进行仿真。
接线:
单片机的P1.4接按键;
单片机的P1.5接 LED;(起初用来测试按键,可忽略)
单片机的P2.0接595的DS(即SER)
单片机的P2.1接595的SH_CP(即SCK)
单片机的P2.2接595的ST_CP(即RCK)
595的8个输出口,接8个LED灯的正极
功能:
按下按键,8个LED灯亮起;(长按、短按)
松开按键,8个LED灯熄灭;
三、单片机程序
1、定义io、标志位
sbit SER_595=P2^0; // DS 串行数据输入端 sbit RCK_595=P2^2; // ST_CP 数据:移位寄存器--To--存储寄存器 (上升沿) sbit SCK_595=P2^1; // SH_CP 数据移位:QA--QB--QC-- ... --QH (上升沿) sbit Button=P1^4; //按键 sbit LED=P1^5; uchar Btn_State=1; //按键状态标志 uchar Count_Put=0xFF; //取反标志
2、发送数据函数:
//发送数据 void HC595_Send_Data(uchar send_data) { uchar i; for(i=0;i<8;i++) { if((send_data<<i)&0x80)//判断最高位是否是1 SER_595=1; //是1,则使SER=1, else SER_595=0; //是0,则使SER=0 SCK_595=0;//上升沿(移入数据) _nop_(); _nop_(); SCK_595=1; } }
函数功能解释:
(1)一次只能发送8位数据,循环8次以下工作:
- - 将这8位数据和先向左移 i 位,再和0x80做与运算,从而判断数据的第一位是0还是1,进而使SER=0或者1
- - 接着给SCK_595一个上升沿脉冲,微妙级,将最高位数据0或者1送入595的移位寄存器
(2)i从0开始,也就是从数据的最高位开始,假如数据为01101100,则0先被送至移位寄存器,接着是1,以此类推。
3、输出数据函数:
//输出数据 void HC595_Put_Data() { RCK_595=0; _nop_(); _nop_(); RCK_595=1; }
4、主函数:
void main() { LED=1;//初始关闭 while(1){ //按键控制8个LED灯 if(Button!=Btn_State) //按下 Button=0 Btn_State=1 { HC595_Send_Data(0xFF&Count_Put); HC595_Put_Data(); Count_Put=~Count_Put; LED=~LED; Btn_State=Button; //Button=0 Btn_State=0 } } }
四、现象
另外:看到有篇文章写的很好,大家可以去看看这个:
http://www.21ic.com/jichuzhishi/datasheet/74HC595/data/757249.html
原文地址:https://www.cnblogs.com/zeng-1995/p/11704557.html