IO 扩展(串转并)-74HC595-16*16LED点阵实验
? ? ? ??51 單片機(jī)的IO 口非常有限,有時(shí)候若想要連接更多外圍設(shè)備,需要通過(guò) IO 擴(kuò)展來(lái)實(shí)現(xiàn)。本文介紹一種 IO 口擴(kuò)展方式——串轉(zhuǎn)并,使用的芯片是 74HC595。若有4個(gè) 74HC595 芯片,僅需單片機(jī) 3 個(gè) IO 口即可擴(kuò)展到 32 個(gè)。而且,還可以將多個(gè) 74HC595 級(jí)聯(lián)擴(kuò)展出更多 IO,從而實(shí)現(xiàn)用少數(shù) IO 資源控制多個(gè)設(shè)備。
74HC595 芯片簡(jiǎn)介
? ? ? ??74HC595 是一個(gè) 8 位串行輸入、并行輸出的位移緩存器,其中并行輸出為三 態(tài)輸出(即高電平、低電平和高阻抗)。
? ? ? ??芯片管腳圖:
? ? ? ??管腳功能說(shuō)明:?
| 1~7、15 | QA~QH | 并行數(shù)據(jù)輸出 |
| 9 | /QH | 串行數(shù)據(jù)輸出 |
| 10 | SCLR非 | 主復(fù)位(低電平),移位寄存器清零輸入 |
| 11 | SCK( SRCLK) | 移位寄存器時(shí)鐘輸入 |
| 12 | RCK(RCLK) | 存儲(chǔ)寄存器時(shí)鐘輸入 |
| 13 | G 非 | 輸出使能控制端(低電平) |
| 14 | SI | 串行數(shù)據(jù)輸入 |
| 8 | GND | 接地 |
| 16 | VCC | 電源 |
? ? ? ??內(nèi)部邏輯圖 :
? ? ? ??真值表如下:
??? ? ? ??74HC595 具有 8 位移位寄存器和一個(gè)存儲(chǔ)器、三態(tài)輸出功能。移位寄存器和存儲(chǔ)器是單獨(dú)的時(shí)鐘。數(shù)據(jù)在 SCK 的上升沿輸入移位存儲(chǔ)器,在 RCK 的上升沿進(jìn)入到存儲(chǔ)寄存器(鎖存器)中。如果兩個(gè)時(shí)鐘連在一起,則移位寄存器總是比存儲(chǔ)器早一個(gè)脈沖。移位寄存器有一個(gè)串行輸入(SI),和一個(gè)串行輸出(/QH),和一個(gè)異步的低電平復(fù)位(SCLK非),存儲(chǔ)寄存器有一個(gè)并行 8 位的,具有三態(tài)的總線輸出。當(dāng) /SCLR 為高電平,/G 為低電平時(shí),數(shù)據(jù)在 SCK?上升沿進(jìn)入移位寄存器,在 RCK 上升沿輸出到并行端口。
??? ? ? ??有關(guān) 74HC595 芯片的更多詳細(xì)介紹,可以查看芯片數(shù)據(jù)手冊(cè)。鏈接:鏈接: https://pan.baidu.com/s/1DDk9CZuU0bcC1B9b6k6Ahw?pwd=chtn 提取碼: chtn?
硬件部分
??? ? ? ??使用到硬件資源如下:
? ? ? ? ? 74HC595模塊電路如下圖所示:
? ? ? ? ? ?6*16LED 點(diǎn)陣模塊電路如下圖所示:
? ? ? ? ? ?由上圖可知,模塊電路獨(dú)立,74HC595 模塊內(nèi)使用了 4 塊 74HC595 芯片,采用級(jí)聯(lián)方式,即 RCLK ( RCK )?和SRCLK( SCK)?管腳并聯(lián)在一起,并且 74HC595 (A)的輸出 /QH 連接到 74HC595(B)的串行輸入口 SER(SI),而 74HC595(B)的 輸出 /QH 又連接到 74HC595(C)的串行輸入口 SER(SI),依次類推。并且每塊芯片的輸出端都連接到對(duì)應(yīng)的端子上,74HC595(A)的輸出連接到 J27 端子,74HC595 (B)的輸出連接到 J32 端子,74HC595(C)的輸出連接到 LED 點(diǎn)陣前 8 列,74HC595 (D)的輸出連接到 LED 點(diǎn)陣后 8 列。圖上的 NEGx 是網(wǎng)絡(luò)標(biāo)號(hào),74HC595(C)和74HC595 (D)的輸出已經(jīng)與 LED 點(diǎn)陣列相連。74HC595 需要用到的控制管腳 RCLK、SRCLK、SER 并未直接連接到 51 單片機(jī) 的 IO 上,而是連接到 J24 端子上。
? ? ? ? ? ?此處使用 P3.4-P3.6 管腳來(lái)控制 74HC595 輸出數(shù)據(jù),行為 LED 發(fā)光二極管的陽(yáng)極,列則為發(fā)光二極管的陰極。
? ? ? ? ? ?要想控制 LED 點(diǎn)陣,需將單片機(jī)管腳按照 74HC595 芯片的通信時(shí)序要求來(lái)傳輸數(shù)據(jù)。使用了 4 片 74HC595 芯片,A、B 兩塊芯片控制點(diǎn)陣的行 POS1-POS16,C、D 兩塊芯片控制點(diǎn)陣列 NEG1-NEG16。這樣即可控制 LED 點(diǎn)陣。根據(jù) LED 發(fā)光二極管導(dǎo)通原理,當(dāng)陽(yáng)極為高電平,陰極為低電平則點(diǎn)亮,否則熄滅。因此通過(guò)單片機(jī)發(fā)送 4 組數(shù)據(jù),通過(guò) 74HC595 芯片將這四組數(shù)據(jù)分配到對(duì)應(yīng)輸出從而控制 LED 點(diǎn)陣。
源代碼
? ? ? ? ? ? 解釋一下代碼的邏輯順序;
? ? ? ? ? ? 定義好 74HC595 控制管腳,以及點(diǎn)陣列控制口。然后重新定義了一個(gè) ms 級(jí)延時(shí)函數(shù) delay_1ms,該函數(shù)與前面 delay_10us 類似,都是利用循環(huán)占用 CPU 起到延時(shí)效果。
? ? ? ? ? ? 定義 74HC595 的控制函數(shù) HC595_WRITE_DATA,該函數(shù)完全按照 74HC595 的通信時(shí)序要求編寫,需要注意的是 74HC595 是先傳輸字節(jié)的高位后傳輸?shù)臀?#xff0c;所以需要將字節(jié)低位移動(dòng)到高位傳輸。在傳輸數(shù)據(jù)時(shí),要注意移位寄存器時(shí)鐘和存儲(chǔ)寄存器時(shí)鐘的先后順序,將要寫入的數(shù)據(jù)先傳輸?shù)?74HC595 寄存器中,即在準(zhǔn)備好每位數(shù)據(jù)時(shí)要將 SCK 進(jìn)行一個(gè)上升沿變化,此時(shí)即可將數(shù)據(jù)傳輸?shù)揭莆患拇嫫鲀?nèi)。循環(huán) 8 次,一個(gè)字節(jié)就傳輸?shù)郊拇嫫髦?#xff0c;就可以來(lái)一個(gè)存儲(chǔ)時(shí)鐘上升沿RCK,此時(shí)就可以將 74HC595 寄存器中的數(shù)據(jù)全部一次傳輸?shù)?595 存儲(chǔ)寄存并從端口輸出。? ? ? ? ? ?
? ? ? ? ? ? 使用了?4 個(gè) 74HC595 芯片且級(jí)聯(lián), 所以在函數(shù)入口有 4 個(gè)參數(shù) cs_data1-cs_data4,從函數(shù)中可看到,第一個(gè) for 循環(huán)中首先發(fā)送 cs_data4 數(shù)據(jù),然后再發(fā)送 cs_data3,最后發(fā)送 cs_data1,因?yàn)?595 是移位寄存器, 可以理解為一開始發(fā)送的數(shù)據(jù)會(huì)被后面的數(shù)據(jù)向前推走,通過(guò) 4 次 for 循環(huán)后cs_data4 就被移到了 74HC595(D)芯片處,cs_data3 就被移到了 74HC595(C)芯片處,cs_data2 就被移到了 74HC595(B)芯片處,cs_data1 就被移到了 74HC595(A)芯片處。
? ? ? ? ? ? 可以將輸入看成水管中的水流,從cs_data4開始,依次將四個(gè)數(shù)據(jù)放入水管中,最后cs_data4率先流出水管,到達(dá)LED點(diǎn)陣的后8列。然后流出水管的是cs_data3,到達(dá)LED點(diǎn)陣的前8列。然后是cs_data2,到達(dá)LED點(diǎn)陣的后8行。最后是cs_data1,到達(dá)LED點(diǎn)陣的前8行。如此這般依次設(shè)置LED點(diǎn)陣的行列,從而實(shí)現(xiàn)控制LED點(diǎn)亮。
? ? ? ? ? ? 最后就是在 main 函數(shù)中調(diào)用 74HC595 的控制函數(shù) HC595_WRITE_DATA,將實(shí)驗(yàn)中要實(shí)現(xiàn)的效果數(shù)據(jù)寫入進(jìn)去, 從而控制 LED 點(diǎn)陣的陽(yáng)極和陰極。
#include "reg52.h"typedef unsigned int u16;//使用關(guān)鍵字 typedef 對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型 unsigned int 重新命名 typedef unsigned char u8;/*定義74HC595控制管腳*/ sbit SI=P3^4; //串行數(shù)據(jù)輸入 sbit RCK=P3^5; //存儲(chǔ)寄存器時(shí)鐘輸入 sbit SCK=P3^6; //移位寄存器時(shí)鐘輸入u8 HC595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay_10us(u16 ten_us)//延時(shí)函數(shù),ten_us=1 時(shí),大約延時(shí) 10us {while(ten_us--); }void delay_1ms(u16 ms) {u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--); }void HC595_WRITE_DATA(u8 cs_data1,u8 cs_data2,u8 cs_data3,u8 cs_data4) //最后兩個(gè)形參表示所有列的數(shù)據(jù),前面兩個(gè)形參表示所有行的數(shù)據(jù) {u8 i=0;for(i=0;i<8;i++)//傳入第四個(gè)形參{SI=cs_data4>>7; //因?yàn)?95芯片先傳高位,所以將最高位移到最低位(比如 12345678——>00000001,此處12345678這樣寫只為方便理解),然后給個(gè)上升沿把1傳入寄存器中cs_data4<<=1; /*這一步是將原先cs_data(比如12345678)的第二個(gè)高位(1后面的2)移到第一個(gè)高位(即變成了23455670),這一步是為了執(zhí)行下一次循環(huán)的時(shí)候,將最高位移到最低位做準(zhǔn)備,也就是SI_SER=cs_date4>>7;*/SCK=0; //此處開始產(chǎn)生上升沿,先設(shè)為0,后面再設(shè)置為1,上升沿就有了,數(shù)據(jù)在 SCK 的上升沿輸入存儲(chǔ)器delay_10us(1);SCK=1; //此刻,最高位就輸入到寄存器中了,然后下一次循環(huán)依次按照此方法傳入第二個(gè)高位、第三個(gè)....delay_10us(1);}for(i=0;i<8;i++)//傳入第三個(gè)形參{SI=cs_data3>>7; cs_data3<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//傳入第二個(gè)形參{SI=cs_data2>>7; cs_data2<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//傳入第一個(gè)形參{SI=cs_data1>>7; cs_data1<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}RCK=0; //這里需要一個(gè)上升沿,將存儲(chǔ)器的數(shù)據(jù),在 RCK 的上升沿的作用下,輸入到鎖存器中(此時(shí)輸出使能控制端/G或/OE接地)delay_10us(1);RCK=1; }void main(void) //主函數(shù) { u8 i=0; while(1) //while循環(huán)一次,LED點(diǎn)陣從第一行到最后一行點(diǎn)亮完成一個(gè)輪回{for(i=0;i<8;i++) //控制16*16LED點(diǎn)陣的前8行LED燈亮滅{HC595_WRITE_DATA(HC595_buf[i],0,0,0);//使74HC595(A)輸出ghc595_buf[i],控制16*16LED點(diǎn)陣的前8行LED燈亮滅 delay_1ms(500);//延時(shí)500ms}for(i=0;i<8;i++) //控制16*16LED點(diǎn)陣的后8行LED燈亮滅{HC595_WRITE_DATA(0,HC595_buf[i],0,0);//使74HC595(B)輸出ghc595_buf[i],控制16*16LED點(diǎn)陣的后8行LED燈亮滅delay_1ms(500);//延時(shí)500ms} } }現(xiàn)象
?
總結(jié)
以上是生活随笔為你收集整理的IO 扩展(串转并)-74HC595-16*16LED点阵实验的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新冠疫情防控背后有哪些鲜为人知的技术?
- 下一篇: 多层卷积后感受野的计算