【51单片机】74HC595串转并 使用

 74HC595通常是用来解决单片机I/O口不够用的情况。

如果你对该芯片没有任何的了解,建议先观看以下两篇文章,它会对你接下来的使用很有帮助。

如果你只想直接快速能上手使用,那么请跳过两篇文章,直接看正文。

单片机芯片之——图解74HC595(第一部分)_Vuko_Coding Zone-CSDN博客_74hc595引脚图  14脚:DS(SER),串行数据输入引脚13脚:OE,  输出使能控制脚,它是低电才使能输出,所以接GND12脚:RCK,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。11脚:SCK,移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入)。10脚:MR,低电平时,清空移位寄存器中已有的bit数据,一般不用,接 高电平即可。...https://vuko-wxh.blog.csdn.net/article/details/80500046

简述74HC595功能_lgzisme的博客-CSDN博客74HC595是串行输入,并行输出的锁存器(可以不用理解)从Q0~Q7是输出端VCC电源端;GND接地端14端口DS是数据输入端Q7‘是串行数据输出端,(与14端口的输入数据相同,不过要晚一步)可用于级联74HC595(一般不用)11,12,是时钟输入端口/MR低电平数据清零,一般接高电平/OE是高电平高阻态,禁止输出,(有的也说是锁存,具体没试过),一般接低电平。连接好的电路图如下(大家根据端口号自己对,VCC和GND省略了)端口介绍完毕,接下来贴...https://blog.csdn.net/lgzisme/article/details/106056948

正文部分:

引脚原理图:

【51单片机】74HC595串转并 使用_第1张图片

接线原理图(已省略VCC、GND):

【51单片机】74HC595串转并 使用_第2张图片

1. P2^0、P2^1、P2^2是可以在程序中自定义的

2.Q0~Q7为输出部分;

3.Q7'为用来联接多个74HC595的,如果引脚已经够用的话就不用管它了,如果还不够用,请看上面第二遍文章。

以下为单个74HC595使用代码部分,可复制直接使用:

#include 
#include 
sbit SRCLK1=P2^0;          //595的SH_CP端 连接单片机 P2^0 口    (可以更改为任意端口)
sbit RCLK1=P2^1;           //595的ST_CP端 连接 P2^1
sbit SER1=P2^2;            //595的DS端 连接 P2^2
#define u8 unsigned char

void HC595(u8 dat1)       //74HC595子程序,如果想快速使用,                      
{                                //不需要过多了解子程序部分,直接看main部分
    u8 a;
    SRCLK1=0;
    RCLK1=0;
    for(a=0;a<8;a++)     //串行输入过程
    {
        SER1=dat1>>7;        
        dat1<<=1;            
        SRCLK1=1;
        _nop_();
        _nop_();
        SRCLK1=0;    
    }

    RCLK1=1;            //并行输出过程
    _nop_();
    _nop_();
    RCLK1=0;
}


void main()     //主程序      //调用子程序(需要修改的芯片I/O口)
{
	HC595(0x03);     //  0  0  0  0   0  0  1  1  //高位先入,低位后进,所以Q0、Q1为高电平
}				     // Q7 Q6 Q5 Q4   Q3 Q2 Q1 Q0    

值得注意的是,如果你是想快速移植使用,并不需要去了解子程序部分内容,直接复制到自己代码中即可,需要注意和修改的是主程序部分。

来看主程序main的部分,参考芯片原理引脚图,Q0~Q7相当于8个I/O口,也是采取16进制原则。与单片机不同的是,74HC595的8个I/O口是以16进制方式进行修改(每次修改8个,非常麻烦)。

由于74HC595的8个口是一个接一个进入并且逐个填满的,就跟排队一样,所以16进制0x03是Q0和Q1为1,Q2~Q7为0。   而如果是0x01的时候就只有Q0为1,其它都是0。

说了这么多,相信你也大概知道怎么用了。附上一个自己用的子程序,这个子程序是用来解决每次修改单独的口都要以16进制进行修改的问题。

void single(u8 date,u8 status)  //单独控制595的每个口  使用方式 single(芯片IO口;高或者低电平)
{
	u8 temp;
	temp = (DisNow >> date)%2;  //取出对应的位
	
	if(temp == status)
	{
		return;
	}
	else if(temp)  //如果该位为1,则减去
	{
		DisNow = DisNow-pow(2, date);
	}	
	else	      //如果该位为0,则加上
	{
		DisNow = DisNow+pow(2, date);
	}

	HC595(DisNow);
}

使用方式在下面

#include 
#include     //移位头文件
#include        //数学头文件

#define u8 unsigned char   //宏定义

u8 DisNow=0xff;        //HC595全局变量初始化,使其Q0~Q7的8个口默认为1

sbit SRCLK1=P2^0;          //595的SH_CP端 连接单片机 P2^0 口    (可以更改为任意端口)
sbit RCLK1=P2^1;           //595的ST_CP端 连接 P2^1
sbit SER1=P2^2;            //595的DS端 连接 P2^2

void HC595(u8 dat1)       //74HC595子程序                   
{                                
    u8 a;
    SRCLK1=0;
    RCLK1=0;
    for(a=0;a<8;a++)     //串行输入过程
    {
        SER1=dat1>>7;        
        dat1<<=1;            
        SRCLK1=1;
        _nop_();
        _nop_();
        SRCLK1=0;    
    }

    RCLK1=1;            //并行输出过程
    _nop_();
    _nop_();
    RCLK1=0;
}

void single(u8 date,u8 status)  //单独控制595的每个口  使用方式 single(芯片IO口;高或者低电平)
{
	u8 temp;
	temp = (DisNow >> date)%2;  //取出对应的位
	
	if(temp == status)
	{
		return;
	}
	else if(temp)  //如果该位为1,则减去
	{
		DisNow = DisNow-pow(2, date);
	}	
	else	      //如果该位为0,则加上
	{
		DisNow = DisNow+pow(2, date);
	}

	HC595(DisNow);
}



void main()     //主程序      调用单独控制I/O口的子程序
{
	
        single(7,0);    //意思是Q7口设置为0  

        single(3,1);    //意思是Q3口设置为1  状态已经默认为1,为方便了解,再次设置为高电平
}				       

和上面一样,两个子程序不需要过多了解,会用就行,直接看主程序部分。

只需要在主程序中直接调用 single这个子程序,修改需要用到的I/O口就行,74hc595的8个口默认状态为1,因为前面已经初始化默认为1了。

这个子程序主要优点是:修改其中的一个口不会影响其它口已存在的状态,也不需要每次以16进制修改。

谢谢观看。

你可能感兴趣的:(单片机,物联网,51单片机)