74HC595应用
一、简介
本实验使用Arduino MEGA 2560单片机和74HC595芯片在Proteus中仿真,74HC595芯片通过同步串行通信获取单片机产生的随机数并把数据移动到移位寄存器内,再把数据储存到存储寄存器中,并通过并口(Q0->Q7)输出电平。10位LED条形码连接74HC595并口,可更直观的观察74HC595并口输出的电平。
仿真软件为Protues,代码编写软件为Arduino IDE。
01.芯片介绍
74HC595是一款8位串行输入、并行输出的移位寄存器,具有高电平、低电平和高阻抗三种输出状态。11号移位时钟引脚SH_CP为上升沿时,将14号串行数据DS输入引脚的电平数据移动到移位寄存器内。12号存储时钟引脚ST_CP为上升沿时,把移位寄存器内的数据储存到存储寄存器中。13号输出使能引脚OE为低电平时,将存储寄存器中的数据映射到并口,此时,并口就输出高低电平。10号MR为移位寄存器数据清除引脚,低电平有效,低电平时清除移位寄存器内的数据。
图1.74HC595引脚图
02.引脚说明
【15】【1】【2】【3】【4】【5】【6】【7】:<Q0->Q7>并行数据输出引脚。
【8】:<GND>电源负极。
【9】:<Q7'>串行数据输出引脚,用于级联功能。
【10】:<MR>清空移位寄存器中的数据,低电平有效。
【11】:<SH_CP>移位寄存器时钟引脚,上升沿时,移位寄存器中的数据整体后移。
【12】:<ST_CP>存储寄存器时钟引脚,上升沿时,将数据从移位寄存器中转存到存储寄存器中。
【13】:<OE>并口输出使能引脚,低电平有效。
【14】:<DS>串行数据输入引脚,用于级联功能。
【16】:<VCC>电源正极。
03.逻辑表
04.时序图
二、实验1_串行输入并行输出(ID:LJDL000003)
01.实验说明
在本次实验中,单片机产生一个8位的随机数,数据初始值为0xAA,通过串行同步通信把数据传入到74HC595芯片的移位寄存器内,74HC595芯片接收到数据后把数据转存到存储寄存器内,通过13号数据输出使能引脚OE把存储寄存器内的数据映射到并口,并口输出的电平状态通过LED条形码显示出来。
Proteus所需元件:
【1】Arduino MEGA 2560单片机模块
【2】75HC595芯片
【3】LED条形码(LED_BARGRAPH)
02.仿真电路图
图2.Arduino MEGA 2560单片机模块
图3. 外设电路
由图3可知,U2芯片的11号移位寄存器时钟引脚SH_CP连接单片机的IO10;14号串行数据输入引脚DS连接单片机的IO11;12号存储寄存器时钟引脚ST_CP连接单片机的IO12;10号清除移位寄存器引脚MR连接单片机的IO8;13号输出使能引脚OE连接单片机的IO9。U2右侧的并口与LED条形码相连。
03.程序说明
单片机产生的数据从IO8引脚传输到74HC595的14号引脚,并通过并口输出到LED条形码上。
1 /****************************************************** 2 欢迎关注我的博客及某宝店铺——深蓝创客空间 3 *******************************************************/ 4 #define mr_pin 8 //移位寄存器数据清除引脚 5 #define oe_pin 9 //并口输出使能引脚 6 #define shcp_pin 10 //移位寄存器时钟引脚 7 #define ds_pin 11 //串行数据输入引脚 8 #define stcp_pin 12 //存储寄存器时钟引脚 9 10 11 void setup() 12 { 13 Serial3.begin(9600); //波特率设置为9600 14 pinMode(shcp_pin,OUTPUT); //初始化引脚输入输出状态,下同; 15 pinMode(ds_pin,OUTPUT); 16 pinMode(stcp_pin,OUTPUT); 17 pinMode(oe_pin,OUTPUT); 18 pinMode(mr_pin,OUTPUT); 19 digitalWrite(oe_pin,HIGH); //默认电平,下同; 20 digitalWrite(mr_pin,HIGH); 21 digitalWrite(shcp_pin,LOW); 22 digitalWrite(stcp_pin,LOW); 23 } 24 25 uint8_t i; //用于循环 26 uint8_t data = 0xAA; //第一次传输的数据 27 void loop() 28 { 29 digitalWrite(oe_pin,HIGH); //并口输出使能引脚拉高,禁止输出。 30 digitalWrite(mr_pin,LOW); //拉低移位寄存器数据清空引脚,清空移位寄存器内的数据。 31 delayMicroseconds(20); //延时20us 32 digitalWrite(mr_pin,HIGH); //拉高移位寄存器数据清空引脚,禁止清空移位寄存器内的数据。 33 /* 8次循环用于传输数据 */ 34 for(i=0;i<8;i++) 35 { 36 if(data&0x01) //如果数据为1输出高电平 37 digitalWrite(ds_pin,HIGH); 38 else //否则数据为0输出低电平 39 digitalWrite(ds_pin,LOW); 40 data >>= 1; //右移一位 41 digitalWrite(shcp_pin,LOW); //拉低移位寄存器时钟引脚 42 delayMicroseconds(20); 43 digitalWrite(shcp_pin,HIGH); //拉高移位寄存器时钟引脚,产生上升沿,把数据储存到移位寄存器并移位。 44 } 45 digitalWrite(stcp_pin,LOW); //拉低存储寄存器时钟引脚 46 delayMicroseconds(20); 47 digitalWrite(stcp_pin,HIGH); //拉高存储寄存器时钟引脚,产生上升沿,把移位寄存器内的数据转存到存储寄存器内。 48 delayMicroseconds(20); 49 digitalWrite(oe_pin,LOW); //拉低并行使能引脚,使能并口输出。 50 delay(1000); //延时1s 51 data = random(256) & 0xFF; //产生新的随机数。 52 }
三、实验2_级联穿入并出(ID:LJDL000004)
01.实验说明
74HC595具有级联功能,本次实验中,两块74HC595芯片采用级联模式,从单片机读取16位数据,并通过各自的8位并口控制LED条形码的显示。本次实验单片机为Arduino MEGA 2560,采用Proteus仿真。
Proteus所需元件:
【1】Arduino MEGA 2560单片机模块
【2】75HC595芯片
【3】LED条形码(LED_BARGRAPH)
02.仿真电路图
图4.74HC595级联电路
由图4可知,U2和U4芯片的11号移位寄存器时钟引脚SH_CP共同连接单片机的IO10引脚;U2和U4的12号存储寄存器时钟引脚ST_CP连接单片机的IO12引脚;U2和U4的10号移位寄存器数据清空引脚MR连接单片机的IO8引脚;U2和U4的13号并口输出使能引脚OE连接单片机的IO9引脚。U4的14号数据输入引脚DS连接单片机的IO11引脚,单片机的数据从这里进入到级联电路内,U4的9号串行数据输出引脚Q7'连接U2的14号数据输入引脚DS,U2接收的单片机数据路径U4进入到自己的移位寄存器内。U2和U4右侧的并口分别与LED条形码相连。
03.程序说明
单片机从IO8引脚把数据输入到U4和U2芯片内,并通过LED条形码显示出来。
/******************************************************
欢迎关注我的博客及某宝店铺——深蓝创客空间
*******************************************************/
#define mr_pin 8 //移位寄存器数据清除引脚 #define oe_pin 9 //并口输出使能引脚 #define shcp_pin 10 //移位寄存器时钟引脚 #define ds_pin 11 //串行数据输入引脚 #define stcp_pin 12 //存储寄存器时钟引脚 void setup() { Serial3.begin(9600); //波特率设置为9600 pinMode(shcp_pin,OUTPUT); //初始化引脚输入输出状态,下同; pinMode(ds_pin,OUTPUT); pinMode(stcp_pin,OUTPUT); pinMode(oe_pin,OUTPUT); pinMode(mr_pin,OUTPUT); digitalWrite(oe_pin,HIGH); //默认电平,下同; digitalWrite(mr_pin,HIGH); digitalWrite(shcp_pin,LOW); digitalWrite(stcp_pin,LOW); } uint8_t i; //用于循环 uint16_t data = 0x55AA; //第一次传输的数据 void loop() { digitalWrite(oe_pin,HIGH); //并口输出使能引脚拉高,禁止输出。 digitalWrite(mr_pin,LOW); //拉低移位寄存器数据清空引脚,清空移位寄存器内的数据。 delayMicroseconds(20); //延时20us digitalWrite(mr_pin,HIGH); //拉高移位寄存器数据清空引脚,禁止清空移位寄存器内的数据。 /* 16次循环用于传输数据 */ for(i=0;i<16;i++) { if(data&0x01) //如果数据为1输出高电平 digitalWrite(ds_pin,HIGH); else //否则数据为0输出低电平 digitalWrite(ds_pin,LOW); data >>= 1; //右移一位 digitalWrite(shcp_pin,LOW); //拉低移位寄存器时钟引脚 delayMicroseconds(20); digitalWrite(shcp_pin,HIGH); //拉高移位寄存器时钟引脚,产生上升沿,把数据储存到移位寄存器并移位。 } digitalWrite(stcp_pin,LOW); //拉低存储寄存器时钟引脚 delayMicroseconds(20); digitalWrite(stcp_pin,HIGH); //拉高存储寄存器时钟引脚,产生上升沿,把移位寄存器内的数据转存到存储寄存器内。 delayMicroseconds(20); digitalWrite(oe_pin,LOW); //拉低并行使能引脚,使能并口输出。 delay(1000); //延时1s data = random(256) & 0x00FF; //产生新的随机数,储存到低8位。 delay(1); data = (((random(256)<<8)&0xFF00))|data; //产生第二个随机数,储存到高8位。 delay(1); }
2021.4.28