文章为原创文章,转载注明源地址。
一、介绍
百度百科介绍:
74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,并行输出端会维持在高阻抗状态。
自我理解:一个口串行输入,然后八个口并行输出,减少占用管脚的数目。
二、管脚说明
管脚编号:缺口左边为1号角,然后按照逆时针编号。
1~7脚 ,15脚(Q n):并行输出脚
8脚(GND):接地
9脚(SOUT也称Q7'):用于级联,移位寄存器中数据多于八位时,就会这八位数据送到下一个595
10脚(OE):低电平时触发,清空移位寄存器中已有数据,接高电平即可。
11脚(SH_CP):移位寄存器时钟,每一次上升沿(低电平到高电平)寄存器做一次移位,接受一位数据
12脚(ST_CP):存储寄存器时钟。上升沿时,数据从移位寄存器转存带存储寄存器
13脚(OE):595使能管脚,接低电平即可以让595输出数据
14脚(DS):输入串行数据
16脚(VCC):电源脚
三、使用方法
如果DS串行输入的数据为0111 1111 则可以用下图表示
注意:最先输入的数据由Q7输出
此过程为:串行数据输入时钟(11脚 SH_CP)寄存器时钟(12脚 ST_CP)为低电平,DS输入数据0;然后SH_CP变为高电平(上升沿触发),DS数据进入Q0中,紧接着SH_CP变成0,来为下一次数据输入准备。然后DS得到数据1,SH_CP再次变为高电平,Q0中的0进入Q1,1进入Q0。等八位数据进入寄存器后,SH_CP变为高电平,则可以输出数据。然后变为低电平,为下一次数据输出做准备。
从这个过程中就了一知道11脚与12脚的作用,SH_CP就好比一个开门的,有人在门口等着(DS得到数据),看门人(SH_CP)得到开门指令(上升沿指令),然后人就出去了,看门人在关上门,等待下一个人来。ST_CP也是类似的道理
四、代码及proteus仿真
我们通过595控制8个led灯的亮灭,输入的数据为0101 0101
proteus中接线方法:
14脚DS 接 单片机P3.4
11脚SH_CP 接单片机P3.6
12脚ST_CP 接单片机P3.5
13脚OE接GND
10脚MR接VCC
注意:proteus中595VCC与GND已默认连接。
#include<reg52.h>
#include<intrins.h>
//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令_nop_();字符循环移位指令_crol_等时使用
typedef unsigned char uchar;
typedef unsigned int uint;
/**********函数声明********************/
void SendTo595(uchar byteData);
/***********************************/
sbit DS = P3^4; //p3.4串行数据输入 DS
sbit SH_CP = P3^6; //串行输入时钟,上升沿有效
sbit ST_CP = P3^5; //串行寄存器时钟,上升沿有效
void main()
{
ST_CP = 0;
SendTo595(0x55); //二进制:0101 0101
while(1);
}
//发送一个字节数据给595再并行输出
void SendTo595(uchar Data)
{
char i=0;
for(i;i<8;i++)
{
SH_CP = 0;
DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010
SH_CP = 1; //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
_nop_();
}
/*位移寄存器完毕,转移到存储寄存器*/
ST_CP = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期
_nop_();
_nop_();
}