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