(九)串行口方式0 拓展並行輸出端口 02 74LS164芯片


 

 

1、先講解74LS164 移位芯片:

74HC164、74HCT164 是 8 位邊沿觸發式移位寄存器,串行輸入數據,然后並行輸出。

數據通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,一定不要懸空。

時鍾 (CP) 每次由低變高時,數據右移一位,輸入到 Q0, Q0 是兩個數據輸入端(DSA和 DSB)的邏輯與,它將上升時鍾沿之前保持一個建立時間的長度。

主復位 (MR) 輸入端上的一個低電平將使其它所有輸入端都無效,非同步地清除寄存器,強制所有的輸出為低電平。
 
2、
 
 
 
3、 仿真電路圖(實驗效果,由下往上 一個 LED 循環點亮 )
 

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 }

 

 

 

 具體還是要自己勤於思考??多看看,多想想??

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM