1. 74HC164 74HC164是比較典型的移位寄存器,該移位寄存器有一個(gè)數(shù)據(jù)輸入端口、一個(gè)時(shí)鐘信號(hào)端口和八個(gè)輸出端口。如圖1所示。
當(dāng)時(shí)鐘信號(hào)從低電平變?yōu)楦唠娖降臅r(shí)候?qū)⑤敵鲆粋(gè)數(shù)據(jù)到輸出端D0,當(dāng)時(shí)鐘第二次由低電平變?yōu)楦唠娖降臅r(shí)候?qū)⑤敵龅诙䝼(gè)數(shù)據(jù)到D0,而第一個(gè)數(shù)據(jù)將轉(zhuǎn)移到D1端口。依此類推,每一個(gè)時(shí)鐘周期中都有一個(gè)串行數(shù)據(jù)輸出到D0,而其他的數(shù)據(jù)則不斷往高位移動(dòng)直到所有數(shù)據(jù)傳輸結(jié)束。如果不再有時(shí)鐘周期輸入,則這些數(shù)據(jù)將暫存在輸出端。
注意:初學(xué)者會(huì)誤以為看到移位的過程,由于移位的時(shí)間很短,幾微秒的時(shí)間人的眼睛是反應(yīng)不過來的。 如果需要有更多的輸出端口,可以把多個(gè)74HC164串聯(lián)起來用。串聯(lián)的方法如圖2所示。
在上圖的串聯(lián)電路中,左邊的鎖存器D7與右邊鎖存器的串行數(shù)據(jù)輸入端連接,當(dāng)左邊的鎖存器D0~D7數(shù)據(jù)全部輸出以后,再輸入一個(gè)串行信號(hào),左邊鎖存器D7數(shù)據(jù)將作為右邊鎖存器的輸入數(shù)據(jù)并從右邊鎖存器D0端輸出,從而實(shí)現(xiàn)了多個(gè)字節(jié)數(shù)據(jù)的移位鎖存。這樣利用74HC164就實(shí)現(xiàn)了串行數(shù)據(jù)到并行數(shù)據(jù)的轉(zhuǎn)換。
注意到在上面的兩個(gè)圖中,無論輸出什么長度的數(shù)據(jù),所需要的輸入信號(hào)都只有兩個(gè),一個(gè)是串行數(shù)據(jù)輸入,另一個(gè)是鎖存器的時(shí)鐘信號(hào)輸入。如果我們把這兩個(gè)輸入端口連接到單片機(jī)的兩個(gè)輸出端口上,其中單片機(jī)的一個(gè)端口串行輸出數(shù)據(jù),另一個(gè)端口輸出時(shí)鐘信號(hào)以便控制串行數(shù)據(jù)的鎖存方式,那么我們就只需要兩個(gè)單片機(jī)端口幾乎實(shí)現(xiàn)任意數(shù)量的并口輸出。 2. 8051串口方式0的工作原理與時(shí)序
圖3 串口方式0的時(shí)序 8051串口方式0的時(shí)序如圖所示,RXD(P3.0)為數(shù)據(jù)端,TXD(P3.1)為同步移位脈沖端,每次串行發(fā)送、接收8位數(shù)據(jù)(一幀),低位在先。時(shí)鐘為Fosc/12。 (1) 發(fā)送 執(zhí)行任何一條MOV SUBF,#data指令時(shí),啟動(dòng)內(nèi)部串行發(fā)送允許,SEND置高電平,隨后在TXD同步移位時(shí)鐘的作用下,將數(shù)據(jù)data從RXD端移位輸出。一幀數(shù)據(jù)發(fā)送完畢時(shí),內(nèi)部發(fā)送中斷請(qǐng)求TI有效。要再次發(fā)送一幀時(shí),須用軟件清TI。 (2) 接收 在串行口控制寄存器SCON中,REN=1和RI=0時(shí),會(huì)啟動(dòng)一次接收過程。接收時(shí),TXD仍為同步移位時(shí)鐘輸出,而串行移位數(shù)據(jù)仍從RXD移位輸入。當(dāng)接收完一幀后,內(nèi)部接收中斷請(qǐng)求RI有效,要再次接收一幀數(shù)據(jù)時(shí),須用軟件清零。 3. 電路原理 MCS-51單片機(jī)串行口方式0為移位寄存器方式,外接4片74LS164作為4位LED顯示器的靜態(tài)顯示接口,把8031的RXD作為數(shù)據(jù)輸出線,TXD作為移位時(shí)鐘脈沖。74LS164為TTL單向8位移位寄存器,可實(shí)現(xiàn)串行輸入,并行輸出。其中A、B(第1、2腳)為串行數(shù)據(jù)輸入端,2個(gè)引腳按邏輯與運(yùn)算規(guī)律輸入信號(hào),共一個(gè)輸入信號(hào)時(shí)可并接。T(第8腳)為時(shí)鐘輸入端,可連接到串行口的TXD端。每一個(gè)時(shí)鐘信號(hào)的上升沿加到T端時(shí),移位寄存器移一位,8個(gè)時(shí)鐘脈沖過后,8位二進(jìn)制數(shù)全部移入74LS164中。R(第9腳)為復(fù)位端,當(dāng)R=0時(shí),移位寄存器各位復(fù)0,只有當(dāng)R=1時(shí),時(shí)鐘脈沖才起作用。Q1…Q8(第3-6和10-13引腳)并行輸出端分別接LED顯示器的hg···a各段對(duì)應(yīng)的引腳上。在給出了8個(gè)脈沖后,最先進(jìn)入74LS164的第一個(gè)數(shù)據(jù)到達(dá)了最高位,然后再來一個(gè)脈沖會(huì)有什么發(fā)生呢?再來一個(gè)脈沖,第一個(gè)脈沖就會(huì)從最高位移出,搞清了這一點(diǎn),下面讓我們來看電路,4片7LS164首尾相串,而時(shí)鐘端則接在一起,這樣,當(dāng)輸入8個(gè)脈沖時(shí),從單片機(jī)RXD端輸出的數(shù)據(jù)就進(jìn)入到了第一片74LS164中了,而當(dāng)?shù)诙䝼(gè)8個(gè)脈沖到來后,這個(gè)數(shù)據(jù)就進(jìn)入了第二片74LS164,而新的數(shù)據(jù)則進(jìn)入了第一片74LS164,這樣,當(dāng)?shù)?個(gè)8個(gè)脈沖完成后,首次送出的數(shù)據(jù)被送到了最左面的164中。
圖4 整體原理圖 4.源程序 /************************************************************* 利用中斷方式進(jìn)行處理 **************************************************************/ #include<reg51.h> #define uchar unsigned char sbit P3_3=P3^3; uchar a=3; char code tab[]={0x99,0xB0,0xA4,0xF9,0xF9,0xA4,0xB0,0x99};//4321與1234的字形碼 void timer(uchar); void int4(void); void main(void) { uchar i,j; SCON=0; EA=1; ES=1; for(;;) { P3_3=1; for(i=0;i<4;i++) { SBUF=tab[a]; j=a; while(j==a); } P3_3=0; timer(100); if(a==255) a=7; } } void int4(void)interrupt 4 { TI=0; a--; } void timer(uchar t) { uchar i; for(i=0;i<t;i--) { TMOD=0x01; TH0=10000/256; TL0=10000%256; TR0=1; while(!TF0); TF0=0; } } /*****************************************************************************/
|