74HC165与单片机仿真


 

一、简介

  本实验使用Arduino MEGA 2560单片机与74HC165芯片在Proteus中仿真,74HC165芯片通过并口(D0->D7)获取拨码开关的电位值并储存到移位寄存器中,单片机通过一个引脚以同步通信的方式获取74HC165移位寄存器内的数据,并通过串口虚拟终端显示出来。

  仿真软件为Proteus,程序编写软件为Arduino IDE。

 

  本博主外接Arduino单片机项目代写,价格从优,QQ:1973881309,微信:17634551306。

 

 

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 MEGA 2560单片机通过IO13引脚获取74HC165移位寄存器内的数据并通过串口3打印出来。本次实验均采用仿真实现,实验软件为Proteus和Arudino IDE。
    Proteus需要的元件:
    【1】Arduino MEGA 2560单片机模块
     【2】8位拨码开关(DIPSWC_8)
      【3】8位排阻(RESPACK-8)
      【4】74HC165芯片
      【5】串口虚拟终端

 

02.仿真电路图

图2.Arduino MEGA 2560模块

 

 图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位数据读取到单片机内。

#define clk_pin 10    //时钟引脚
#define shld_pin 11   //数据加载引脚
#define so_pin 12     //串行数据输出引脚,对应单片机的输入引脚

void setup() 
{
      Serial3.begin(9600);           //波特率设置为9600
      pinMode(clk_pin,OUTPUT);         //时钟引脚设置为输出模式
      pinMode(shld_pin,OUTPUT);        //数据加载引脚设置为输出模式
      pinMode(so_pin,INPUT);          
      digitalWrite(clk_pin,HIGH);            //时钟引脚初始化为高电平
      digitalWrite(shld_pin,HIGH);          //数据加载引脚初始化为高电平
}

uint8_t i;    //用于循环
uint8_t data;  //读取数据
void loop() 
{
      digitalWrite(shld_pin,LOW);   //加载数据引脚拉低电平获取74HC165并口的数据
      delayMicroseconds(10);        //延时10us
      digitalWrite(shld_pin,HIGH);  //拉高加载数据引脚
      for(i=0;i<8;i++)
      {
        data <<= 1;           
        digitalWrite(clk_pin,LOW);    //拉低时钟引脚
        delayMicroseconds(10);        //延时10us
        if(digitalRead(so_pin)==HIGH) //读数数据输出引脚的电平,如果为高电平则置1
              data = data|0x01;
        digitalWrite(clk_pin,HIGH);   //拉高时钟引脚
      }
      Serial3.println(data);          //打印数据。
      data = 0;       //数据清零
      delay(500);     //延时500毫秒,进入下一轮数据读取。
}

 

 

三、实验2_并入串出双芯片级联(ID:000002)

01.实验说明

  74HC165芯片具有级联功能,在本次实验中,两颗74HC165芯片采用级联模式读取两颗8位拨码开关,共16位数据。单片机采用Arduino MEGA 2560模块,从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位数据读取到单片机内。

#define clk_pin 10    //时钟引脚
#define shld_pin 11   //数据获取引脚
#define so_pin 12     //数据输出引脚,对应单片机的输入引脚

void setup() 
{
  Serial3.begin(9600);                
  pinMode(clk_pin,OUTPUT);
  pinMode(shld_pin,OUTPUT);
  pinMode(so_pin,INPUT);
  digitalWrite(shld_pin,HIGH);                //数据加载引脚初始化为高电平
  digitalWrite(clk_pin,HIGH);                  //时钟引脚初始化为高电平
}

uint8_t i;
uint16_t data;
void loop() 
{
  digitalWrite(shld_pin,LOW);   //加载数据引脚拉低电平获取74HC165并口的数据
  delayMicroseconds(10);        //延时10us
  digitalWrite(shld_pin,HIGH);  //拉高加载数据引脚
  for(i=0;i<16;i++)
  {
    data <<= 1;
    digitalWrite(clk_pin,LOW);    //拉低时钟引脚
    delayMicroseconds(10);        //延时10us
    if(digitalRead(so_pin)==HIGH) //读数数据输出引脚的电平,如果为高电平则置1
      data = data|0x01;
    digitalWrite(clk_pin,HIGH);   //拉高时钟引脚
  }
  Serial3.println((data>>8)&0xFF);     //第1级芯片数据。
  Serial3.println(data&0xFF);          //第2级芯片数据。
  data = 0;       //数据清零
  delay(500);     //延时500毫秒,进入下一轮数据读取。
}                                    

2021.4.28

欢迎浏览我的淘宝小店,本店有核心板,DIY套件,程序代写,上位机代写:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM