74HC165应用
一、简介
本实验使用Arduino UNO单片机与74HC165芯片在Proteus中仿真,74HC165芯片通过并口(D0->D7)获取拨码开关的电位值并储存到移位寄存器中,单片机通过一个引脚以同步通信的方式获取74HC165移位寄存器内的数据,并通过串口虚拟终端显示出来。
仿真软件为Proteus,程序编写软件为Arduino IDE。
01.芯片简介
74HC165是一款八位并行读取或串行读取并同步串行输出的移位寄存器芯片,可在末端(7号和9号引脚)得到互补的串行输出信号。1号PL引脚为低电平时,D0->D7引脚的高低电平数据被储存到移位寄存器中;为高电平时,数据从10号DS引脚串行进入移位寄存器,同步时钟的每个上升沿向右移一位。74HC165具有级联功能,可以连接多颗芯片。
图1.74HC165芯片引脚图
02.引脚说明
【01】:<PL>数据加载控制引脚。该引脚处于低电平时,读取并行端口(D0->D7)的数据并储存在移位寄存器内;该引脚处于高电平时,串行数据从DS引脚(10号)进入到移位寄存器中(Q0->Q7)。
【02】:<CP>时钟输入,上升沿触发。
【11】【12】【13】【14】【03】【04】【05】【06】:<D0->D7>并行数据输入引脚。
【07】:<Q7>串行数据互补输出引脚,与9号引脚互补。
【08】:<GND>电源负极。
【09】:<Q7>串行数据输出引脚。
【10】:<DS>串行数据输入引脚。
【15】:<CE>时钟输入使能引脚,低电平触发。
【16】:<VCC>电源正极。
03.逻辑图
“H”表示高电平;“L”表示低电平;“h”表示时钟为上升沿时为高电平;“l”表示时钟上升沿时为低电平;“q”表示时钟上升沿时的输出状态。“↑”表示上升沿。
04.时序图
二、实验1_并行输入串行输出(ID:LJDL000001)
01.实验说明
本次实验通过74HC165芯片并口(D0->D7)获取八位拨码开关的逻辑电平,Arduino UNO单片机通过IO13引脚获取74HC165移位寄存器内的数据并通过串口打印出来。本次实验均采用仿真实现,实验软件为Proteus和Arudino IDE。
Proteus需要的元件:
【1】Arduino UNO单片机模块
【2】8位拨码开关(DIPSWC_8)
【3】8位排阻(RESPACK-8)
【4】74HC165芯片
【5】串口虚拟终端
02.仿真电路图
图2.Arduino UNO模块
图3.外设电路
由图3可知,74HC165的2号时钟引脚CLK连接单片机的IO10引脚;1号数据加载引脚SHLD连接单片机的IO11引脚;9号数据输出引脚SO连接单片机的IO12引脚;15号使能引脚INH接GND拉低使能。拨码快关按照自己的意愿设置电平状态,串口助手连接单片机的TXD3引脚。
03.程序说明
本次实验中,74HC165的15号使能引脚连接GND,默认使能。先拉低1号数据加载引脚,读取拨码开关的电平数据并保存到移位寄存器内,然后拉高数据加载引脚,此状态下单片机可读取寄存器内的数据。2号时钟引脚CLK拉低,第一位数据从9号SO引脚输出,上升沿移动移位寄存器内的数据,以此类推,通过8次循环,在时钟同步的模式下把8位数据读取到单片机内。
1 /************************************************************************** 2 欢迎关注我的博客及某宝小店——深蓝创客 3 有问题及及时回复我,我会第一时间内做出回答 4 **************************************************************************/ 5 #define clk_pin 10 //时钟引脚 6 #define shld_pin 11 //数据加载引脚 7 #define so_pin 12 //串行数据输出引脚,对应单片机的输入引脚 8 9 void setup() 10 { 11 Serial.begin(9600); //波特率设置为9600 12 pinMode(clk_pin,OUTPUT); //时钟引脚设置为输出模式 13 pinMode(shld_pin,OUTPUT); //数据加载引脚设置为输出模式 14 pinMode(so_pin,INPUT); 15 digitalWrite(clk_pin,HIGH); //时钟引脚初始化为高电平 16 digitalWrite(shld_pin,HIGH); //数据加载引脚初始化为高电平 17 } 18 19 uint8_t i; //用于循环 20 uint8_t data; //读取数据 21 void loop() 22 { 23 digitalWrite(shld_pin,LOW); //加载数据引脚拉低电平获取74HC165并口的数据 24 delayMicroseconds(10); //延时10us 25 digitalWrite(shld_pin,HIGH); //拉高加载数据引脚 26 for(i=0;i<8;i++) 27 { 28 data <<= 1; 29 digitalWrite(clk_pin,LOW); //拉低时钟引脚 30 delayMicroseconds(10); //延时10us 31 if(digitalRead(so_pin)==HIGH) //读数数据输出引脚的电平,如果为高电平则置1 32 data = data|0x01; 33 digitalWrite(clk_pin,HIGH); //拉高时钟引脚 34 } 35 Serial.println(data); //打印数据。 36 data = 0; //数据清零 37 delay(500); //延时500毫秒,进入下一轮数据读取。 38 }
三、实验2_并入串出双芯片级联(ID:000002)
01.实验说明
74HC165芯片具有级联功能,在本次实验中,两颗74HC165芯片采用级联模式读取两颗8位拨码开关,共16位数据。单片机采用Arduino UNO模块,从IO12引脚获取74HC165级联电路的数据并显示在串口助手上。电路仿真软件为Proteus,程序编写软件为Arduino IDE。
Proteus需要的元件:
【1】Arduino MEGA 2560单片机模块
【2】8位拨码开关(DIPSWC_8)
【3】8位排阻(RESPACK-8)
【4】74HC165芯片
【5】串口调试器
02.仿真电路图
图4.74HC165双级联电路图
由图4可知,U2芯片的9号串行数据输出引脚SO连接U3芯片的10号串行输入引脚SI,U2的串行数据经过U3再传入到单片机内。U3芯片为第一级,它的数据最先传入单片机内,第二级芯片U2的数据跟进,由此实验可以同理类推级联多块74HC165芯片,本次实验仅级联两块。U3的2号时钟引脚CLK连接单片机的IO10,1号加载数据引脚SH/LD连接单片机的IO11,最终数据从单片机的IO12引脚进入。
03.程序说明
本次实验中,74HC165的15号使能引脚INH连接GND,默认使能,先拉低1号数据加载引脚SHLD读取芯片并口的数据并保存到移位寄存器内,然后再拉高此引脚,此状态下可读取寄存器内的数据。2号时钟引脚CLK拉低,第一位数据从输出引脚(9号)输出,然后拉高,上升沿移动移位寄存器内的数据,以此类推,通过16次循环,在时钟同步的模式下把16位数据读取到单片机内。
1 /******************************************** 2 欢迎关注我的博客及某宝小店——深蓝创客 3 ********************************************/ 4 #define clk_pin 10 //时钟引脚 5 #define shld_pin 11 //数据获取引脚 6 #define so_pin 12 //数据输出引脚,对应单片机的输入引脚 7 void setup() 8 { 9 Serial.begin(9600); 10 pinMode(clk_pin,OUTPUT); 11 pinMode(shld_pin,OUTPUT); 12 pinMode(so_pin,INPUT); 13 digitalWrite(shld_pin,HIGH); //数据加载引脚初始化为高电平 14 digitalWrite(clk_pin,HIGH); //时钟引脚初始化为高电平 15 } 16 uint8_t i; 17 uint16_t data; 18 void loop() 19 { 20 digitalWrite(shld_pin,LOW); //加载数据引脚拉低电平获取74HC165并口的数据 21 delayMicroseconds(10); //延时10us 22 digitalWrite(shld_pin,HIGH); //拉高加载数据引脚 23 for(i=0;i<16;i++) 24 { 25 data <<= 1; 26 digitalWrite(clk_pin,LOW); //拉低时钟引脚 27 delayMicroseconds(10); //延时10us 28 if(digitalRead(so_pin)==HIGH) //读数数据输出引脚的电平,如果为高电平则置1 29 data = data|0x01; 30 digitalWrite(clk_pin,HIGH); //拉高时钟引脚 } 31 Serial.println((data>>8)&0xFF); //第1级芯片数据。 32 Serial.println(data&0xFF); //第2级芯片数据。 33 data = 0; //数据清零 34 delay(500); //延时500毫秒,进入下一轮数据读取。 35 } 36 }
2021.4.28