一、簡介
本實驗使用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套件,程序代寫,上位機代寫: