深蓝创客

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

 

 

posted on 2021-04-28 13:46  深蓝创客  阅读(7290)  评论(0编辑  收藏  举报

导航