51单片机之IO口扩展——74HC595芯片串行转并行实验

   我们都知道通信从大的方面有两种:串行和并行。串行的最大优点是占用总线少,但是传输速率低;并行恰恰相反,占用总线多,传输速率高。市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来),有并入串出的(相对前者而言)。具体用哪种类型要根据我们得实际情况。比如利用单片机显示数码管单纯的显示一个数码管如果仅仅是为了显示 那么动用单片机一个端口(如P0或P1/P2/P3)那没有什么,当然这里我说的数码管是8段的(如果利用BCD类型 16进制数码管那么只需四个即可)就拿51类型的单片机来说,总共32个I/O口,一般如果不是做太大的工程是完全够用的,但有些时候你会恨单片机怎么不多长几条“腿”,怎么省还是不够用。这个时候就需要用到并转串或者串转并芯片来进行IO口的扩展,74HC595就是一种串行转并行的芯片。

 74HC595芯片特点

 8位串行输入 
8位串行或并行输出 
存储状态寄存器,三种状态 
输出寄存器可以直接清除 
100MHz的移位频率 

输出能力

串行输出:标准 中等规模集成电路

并行输出:总线驱动

应用 
串行到并行的数据转换 
Remote control holding register.,远程控制保持寄存器
描述 
595是高速的硅结构的CMOS器件, 
兼容低电压TTL电路,遵守JEDEC标准。 
595是具有8位移位寄存器和一个存储器,IO口有三态输出功能,即IO口电平有高电平、低电平、高阻态三态。 
移位寄存器和存储器使用各自的时钟。 

芯片引脚定义图

51单片机之IO口扩展——74HC595芯片串行转并行实验_第1张图片

引脚说明:

QA--QH(1-7,15引脚):8个并行输出引脚

GND(8引脚):地引脚

Q'H(9引脚):串行输出引脚

/SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。) 
RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。

SER(14引脚):串行输入引脚

芯片真值表:

51单片机之IO口扩展——74HC595芯片串行转并行实验_第2张图片

芯片时序图:

51单片机之IO口扩展——74HC595芯片串行转并行实验_第3张图片

芯片功能介绍:

    74HC595是具有8位移位寄存器和一个存储器,三态输出功能。 移位寄存器和存储器使用分别的时钟。
数据在SCK的上升沿输入,在RCK的上升沿进入的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。 
   移位寄存器有一个串行移位输入(SER),和一个串行输出(QH’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能/G时(为低电平),存储寄存器的数据输出到总线。 

补充说明:

    74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。另外,据网上报价,贴片164每只1元钱,贴片595 0.8元/只。 

74HC595电路图:

51单片机之IO口扩展——74HC595芯片串行转并行实验_第4张图片

实际物理电路接线图:

51单片机之IO口扩展——74HC595芯片串行转并行实验_第5张图片

74HC595旁边的短接片一定要接上,不然74HC595无法正常工作。

示例程序如下:

 

   #include "reg52.h"
   #include "intrins.h"
 

   typedef unsigned char u8;
   typedef unsigned int u16;

   #define GPIO_LED P0
   
   sbit SRCLK = P3^6;//SCK引脚
   sbit RCLK1 = P3^5;//RCK引脚
   sbit SER = P3^4;//SER引脚

void delay(u16 i) //延时函数
{
 while(i --);
}

  void Hc595SendByte(u8 dat) //595芯片将串行数据转换为并行数据
  {
   u8 a;
   for(a = 0; a < 8; a ++) //8位数据依次转换
   {
   SER = dat >> 7; //先将最高位转换
   dat <<=1;  //然后数据左移,次高位成为最高位,循环操作,将8位数据依次传入芯片串行输入

   SRCLK = 0;//移位时钟低电平
   _nop_();
   _nop_();
   SRCLK = 1;//移位时钟高电平,数据会在移位时钟上升沿进行移位

   }

   RCLK1 = 0; //存储时钟低电平
   _nop_();
   _nop_();
   RCLK1 = 1;//存储时钟高电平,数据会在存储时钟上升沿进行存储
  }

  


   void main()
   {
   u8 ledNum;
   ledNum = 0x01;//初始串行数据
   while(1)
   {
   Hc595SendByte(ledNum); //将串行数据发送给595芯片,595芯片并行数据与8位发光二极管相连,会点亮相应的发光二极管
   ledNum = _crol_(ledNum, 1);//将串行数据进行左移,变换串行数据。
   delay(50000);
   }
  
   }

 

你可能感兴趣的:(C语言,嵌入式单片机)