51单片机 74hc595使用用法(利用proteus仿真)

文章为原创文章,转载注明源地址。

一、介绍

百度百科介绍:

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7'输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。而当OE为高电位,也就是输出关闭时,并行输出端会维持在高阻抗状态。

 

自我理解:一个口串行输入,然后八个口并行输出,减少占用管脚的数目。

二、管脚说明

管脚编号:缺口左边为1号角,然后按照逆时针编号。

1~7脚 ,15脚(Q n):并行输出脚

8脚(GND):接地

9脚(SOUT也称Q7'):用于级联,移位寄存器中数据多于八位时,就会这八位数据送到下一个595

10脚(MR):低电平时触发,清空移位寄存器中已有数据,接高电平即可。

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_();

}

 

  • 51
    点赞
  • 237
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值