资讯详情

单片机学习 7-IO拓展(串转并)-74HC595

I/O拓展-串转并

74HC595芯片介绍

在这里插入图片描述

以上两张都是 74HC595 芯片管脚图,左侧 1 脚是 QB,右芯片 1 脚是 Q1.左芯片 11 脚是 SCK,右芯片 11 脚是 SH_CP,还有很多其他的管脚是不同的。事实上,这没什么。每个人在绘制芯片管脚图时可能会有不同的名称。看芯片,关键是管脚功能。

  1. 15 和 1 到 7 脚 QA–QH:并行数据输出

  2. 9 脚 QH 非:串行数据输出

  3. 10 脚 SCLK 非( MR) : 低电平复位引脚

  4. 11 脚 SCK( SHCP) : 输入移位寄存器时钟

  5. 12 脚 RCK( STCP) : 输入存储器时钟

  6. 13 脚 G 非( OE) : 低电平输出有效

  7. 14 脚 SER( DS) : 串行数据输入

74HC595 是具有 8 位移寄存器(SCK)和一个存储器(RCK),三态输出功能。移位寄存器和存储器是单独的时钟。数据在 SCK 在 RCK 上升沿进入存储器。如果两个时钟连接在一起,移位寄存器总是比存储器早一个脉冲。移位寄存器有串行输入(DS),串行输出(Q7 非),和一个异步的低电平复位,存储寄存器有一个并行 8 三态总线输出为位 MR 为高电平,OE 数据在低电平时 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。前芯片Q7不连接下一片DS,则两个74HC595芯片实现了级联。

硬件设计

本实验使用的硬件资源如下: (1)8*8LED 点阵模块 (2)74HC595(A)模块 开发板上的 74HC595 模块电路如下图所示:

A2-A4:

A5-A7:

在A2-A4板子上:当J24端子上的VCC与OE短接时,OE74HC595芯片是OE输入低电平有效,不能使用LED点阵。而GND与OE短接时,OE输出低电平,此时使用LED点阵。

在A5-A7板子上:GND直接连接OE非,因此默认使用LED点阵。而在J用于连接74端子上的三只脚HC595芯片上的RCLK、SRCLK和SER的。可和A2-A同样使用开发板P35连接第一只脚,P36连接第二只脚,P34连接第三脚。

芯片工作时通过SER根据字节的八位从高到低传入字节QA到QH输出SER的八位。QA为最低位,QH为最高位。SER每个数据都在SRCLK时钟脉冲沿着每次上升的时钟脉冲上升,在寄存器中存储一个数据SCK中,在RCLK上升沿一次性传输到存储器RCK中。


从上图可以看出,该电路是独立的,74HC595 在模块中使用 2 块 74HC595芯片采用级联法,即 RCLK 和 SRCLK 管脚并联, 74HC595(A)的输出 QH 非连接到 74HC595(B)串行输入口 SER。74HC595(A)输出连接到 J27 端子,74HC595(B)输出连接到 J32 端子。74HC595 控制管脚需要使用 RCLK、SRCLK、SER 没有直接连接 51 单片机的 IO 上,但连接 J24 端子上。

如果要想 51 单片机可以控制 74HC595 输出数据时,必须通过导线连接单片机管脚 J24 端子上。因此需使用 3 根杜邦线将单片机的管脚与 J24 端子连接。由于 74HC595 模块电路是独立的,因此可以使用任何单片机管脚与之相匹配A2-A4开发板同步法在这里使用 P3.4-P3.6 管脚来控制 74HC595 输出数据,将 74HC595(A)的输出端子 J27 将单片机连接到点阵模块行端口 P0 端口连接到点阵模块列端口,即行端口连接 LED 阳极发光二极管,LED 点阵列连接发光二极管的阴极。若要点亮发光二极管,阴极为低电平,阴极为高电平。

软件编程

#include"reg52.h"  typedef unsigned char u8; typedef unsigned int u16;  sbit SRCLK=P3^6; sbit rCLK=P3^5;//RCLK c已在51内定义,避免重定义,所以定义为rCLK sbit SER=P3^4;  #define LEDDZ_COL_PORT P0///定义点阵列的控制端口P0  u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//全局数组存储595输入数据缓存,点阵从下到上点亮  void delay_10us(u16 ten_us) {  while(ten_us--); }  //HC595发送数据函数 void hc595_write_data(u8 dat)//不能定义u8 data,因为data为c51内部关键字。 {   u8 i=0;   for(i=0;i<8;i  )   {     SER=dat>>7;     dat<<=1; //dat=dat<<1     SRCLK=0;   //设置时钟脉冲     delay_10us(1)//设置持续时间     SRCLK=1;     delay_10us(1);     }   rCLK=0;   delay_10us(1);   rCLK=1; }  void main() {   u8 i=0;//c51变量必须在开头定义,否则会报错   LEDDZ_COL_PORT=0x00;      while(1)   {     for(i=0;i<8;i  )    {     hc595_write_data(ghc595_buf[i]);     delay_10us(50000)ms     hc595_write_data(ghc595_buf[0x);//消隐    }   } } 

首先定义好 74HC595 在代码中重新定义了控制管脚和点阵列控制口 ms 级延时函数delay_ms,函数和前面 delay_10us类似地,利用循环占用 CPU 起到延迟作用。然后定义 74HC595 的控制函数hc595_write_data,完全按照函数 74HC595 编写通信时序需要注意 的是 74HC595 首先传输字节的高位,然后传输低位,因此需要将字节的低位移动到高位。传输数据时,应注意移位寄存器时钟和存储寄存器时钟的顺序,并首先将要写入的数据传输到 74HC595 在准备每个数据时,寄存器中应该是 SRCLK此时,数据可以传输到寄存器中进行上升沿变化,待循环 8 当一个字节传输到寄存器时,一个存储时钟可以上升,此时可以 74HC595 寄存器中的所有数据一次传输到 595 端口输出。最后就是在 main 函数中调用 74HC595控制函数,将实验中要实现的效果数据写入控制 LED 点阵阳极,阴极由 P0 默认初始化设置为口控 也就是说,只要 595 输出高电平,然后相应的行就会点亮。

实验现象

74HC595级联硬件设计

硬件设计

第一个发送的字节通过后面发送的字节依次推送。例如,先发送0x01,在发送0x02,在发送0x03,再发送0x04x01存储在第四个595芯片中x02存储在第三个595芯片中x03存储在第二个595芯片中x存储在第一个595芯片中。

74HC595(A和B)连接的是16 *16点阵的行;74HC595(C和D)连接的是16 *16点阵的列。

根据点阵中二极管的特性。点阵列为发光二极管的阴极,点阵列为发光二极管的阳极。如果你想点亮一根二极管,它的行为是高电平和低电平。

软件编程

#include"reg52.h"  typedef unsigned char u8; typedef unsigned int u16;  sbt SRCLK=P3^6;
sbit rCLK=P3^5;//RCLK c51内已经定义过了,避免重定义,所以定义为rCLK
sbit SER=P3^4;


u8 ghc595_buf[8]={ 
        0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//全局数组存储595输入数据的缓存,实现点阵从下往上点亮

void delay_1ms(u16 ms)
{ 
        
	u16 i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);//注意分号
}

//HC595发送数据函数
void hc595_write_data(u8 dat1,u8 dat2,u8 dat3,u8 dat4)//dat1对应HC595芯片A,dat2对应B...
{ 
        
		u8 i=0;
		for(i=0;i<8;i++)
		{ 
        
				SER=dat4>>7;
				dat4<<=1; //dat4=dat4<<1
				SRCLK=0;			//设置时钟脉冲
				delay_1ms(1);//设置持续时间
				SRCLK=1;
				delay_1ms(1);		
		}
		for(i=0;i<8;i++)
		{ 
        
				SER=dat3>>7;
				dat3<<=1; //dat3=dat3<<1
				SRCLK=0;			//设置时钟脉冲
				delay_1ms(1);//设置持续时间
				SRCLK=1;
				delay_1ms(1);		
		}
		for(i=0;i<8;i++)
		{ 
        
				SER=dat2>>7;
				dat2<<=1; //dat2=dat2<<1
				SRCLK=0;			//设置时钟脉冲
				delay_1ms(1);//设置持续时间
				SRCLK=1;
				delay_1ms(1);		
		}
		for(i=0;i<8;i++)
		{ 
        
				SER=dat1>>7;
				dat1<<=1; //dat1=dat1<<1
				SRCLK=0;			//设置时钟脉冲
				delay_1ms(1);//设置持续时间
				SRCLK=1;
				delay_1ms(1);		
		}
		rCLK=0;				
		delay_1m(1);//RCLK的上升沿
		rCLK=1;
}

void main()
{ 
        
		u8 i=0;//c51规定变量必须在开头定义,否则会报错
		
		while(1)
		{ 
        
				for(i=0;i<8;i++)
			{ 
        
				hc595_write_data(ghc595_buf[i],0,0,0);
				delay_1ms(500);//延时500ms
				hc595_write_data(0,0,0,0);//消隐
			}
							for(i=0;i<8;i++)
			{ 
        
				hc595_write_data(0,ghc595_buf[i],0,0);
				delay_1ms(500);//延时500ms
				hc595_write_data(0,0,0,0);//消隐
			}
		}
}

标签: 二极管用来发送脉冲j27射频同轴连接器2二极管a7mr754二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台