1、先講解74LS164 移位芯片:
74HC164、74HCT164 是 8 位邊沿觸發式移位寄存器,串行輸入數據,然后並行輸出。
數據通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。
時鍾 (CP) 每次由低變高時,數據右移一位,輸入到 Q0, Q0 是兩個數據輸入端(DSA和 DSB)的邏輯與,它將上升時鍾沿之前保持一個建立時間的長度。
4、分析電路圖
這里我們選擇了工作方式0,來實現串行口數據的傳輸
74LS164 對應的8引腳 C1/-> 為 同步脈沖輸入端,
9 引腳為控制端口,由 P1^0 控制,
當該引腳為 低電平 0 的時候 ,允許 RXD(P3.0)向 74LS164 的 串行數據輸入端口A 和 B 輸入,,但是 74LS164芯片 的8位並行輸出端關閉。
當該引腳為 低電平 1 的時候 , RXD(P3.0)不准向 74LS164 的 串行數據輸入端口A 和 B 輸入,但 允許 74LS164芯片 的8位並行輸出端。
當串行口將 8 位 串行數據發送完畢后,申請中斷, 在中斷服務程序中,單片機通過串行口輸出下一個 8 位 數據。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
方式0
(1)特點
1.用作串行口擴展,具有固定的波特率,為Fosf/12。
2.同步發送/接收,由TXD提供移位脈沖,RXD用作數據輸入/輸出通道。
3.發送/接收8位數據,低位在先。
(2)發送操作
當執行一條“MOV SBUF,A”指令時,啟動發送操作,由TXD輸出移位脈沖,由RXD串行發送SBUF中的數據。發送完8位數據后自動置TI=1,請求中斷。要繼續發送時,T1必須有指令清零。
(3)接收操作
在RI=0條件下,置REN=1,啟動一幀數據的接收,由TXD輸出移位脈沖,由RXD接收串行數據到A中。接收完一幀自動置位RI,請求中斷。想繼續接收時,要用指令清零RI。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5、參考代碼:
1 #include<reg52.h> 2 #include<stdio.h> 3 #define uchar8 unsigned char 4 #define uint16 unsigned int 5 sbit P1_0=0x90; // 為什么要這樣寫,P1口的字節地址就是 0x90 ,好像這樣寫也沒有意義啊 // sbit LED=P0^6 6 7 uchar8 nSendByte ; 8 9 void delay(uint16 i) // 延時函數 10 { 11 uchar8 j; 12 for(; i>0;i--) 13 14 for(j=0;j<125;j++) 15 ; 16 17 } 18 19 main() 20 { 21 SCON=0x00; 22 EA=1; // 總中斷允許 23 ES=1; // 允許串行總中斷 24 25 nSendByte = 1; // 點亮數據初始化為 0000 0001 送入 nSendByte 26 SBUF=nSendByte; // 向 SBUF 緩沖器 寫入點亮數據,啟動串行發送 27 P1_0=0; 28 while(1) 29 { ; } 30 31 } 32 33 void Serial_Port( ) interrupt 4 using 0 34 { 35 36 if(T1) // 如果 T1=1,表示1個字節串行發送完畢,這是標志位,要后來軟件清0 37 { 38 P1_0=1; // 也就是 0x90=1;??? 允許 74LS164芯片並行輸出,流水燈點亮發光二極管 39 40 SBUF=nSendByte; // 像 SBUF 寫入數據,啟動串行發送 41 delay(500); 42 P1_0=0; // P1_0=0; 允許向 74LS164 芯片 串行寫入 43 44 nSendByte = nSendByte<<1; 45 46 if(nSendByte==0) nSendByte=0x02; 47 // 判斷點亮數據是否左移8次,是重新點亮數據,但自己改了一下 48 SBUF=nSendByte; // SBUF為 0000 0010 所以仍然接受數據,但從第二個燈開始 49 50 } 51 52 TI=0; // 向 74LS164 芯片串行發送點亮數據 53 RI=0; // receive 接受中斷請求標志位, 這里也要清0 , 54 }
具體還是要自己勤於思考??多看看,多想想??
