74HC595点亮8个LED灯

Posted zeng-1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了74HC595点亮8个LED灯相关的知识,希望对你有一定的参考价值。

一、原理介绍

技术图片

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

 

以上是关于74HC595点亮8个LED灯的主要内容,如果未能解决你的问题,请参考以下文章

使用 Raspberry Pi Python 使用 74HC595 控制 8 位 7 段显示器

51单片机开发:通过74HC595控制LED点阵

Note-01.arduino和74hc595的使用

ARM GPIO实验程序 求帮填

Arduino实现8*8LED点阵显示爱心显示和Proteus仿真

74HC595并行转串行级联芯片学习记录