8051的串列傳輸比較常用在與PC間的RS-232訊號傳輸或8051間的訊號傳輸,只需要2條資料線與一條地線,非常方便,在此章節也只介紹最常使用的模式1。
模式的設定
SCON(串列埠控制暫存器,位址98H,預設值為00000000)
SM0 |
SM1 |
SM2 |
REN |
TB8 |
RB8 |
TI |
RI |
SM0,SM1:
SM0 | SM1 |
模式 |
功能說明 |
鮑率 |
---|---|---|---|---|
0 | 0 |
模式 0 |
移位暫存器 |
fosc/12 |
0 | 1 |
模式 1 |
8 bit UART |
可變 |
1 | 0 |
模式 2 |
9 bit UART |
fosc/64 或 fosc/32 |
1 | 1 |
模式 3 |
9 bit UART |
可變 |
SM2:在模式2和3時,致能多重CPU通信功能。若SM2 = 1,當接收到的第9位元為0時,RI不被設定,亦即不接收資料。
在模式1時,若SM2等於1,當接收到的「停止位元」不正確時,RI亦不被設定,亦即錯誤資料不接收。
在模式0時,SM2必須清除為0。
REN:0 => RXD接腳不接收資料,如果此顆8051只負責傳送不收資料,可將此位元設為0,RXD(P3.0)接腳可做其他用途。
1 => RXD接腳可接收資料。
TB8:在模式2和3時,TB8被當作是傳送的第9個位元,可由軟體設為1或稱除為0
RB8:
TI:傳送完畢旗號,此位元須由軟體清除。
RI:接收完畢旗號,此位元須由軟體清除。
由於在此章節只討論模式1的應用,所以SCON設定方式很單純,依照此顆8051要不要接收資料,只有以下2種設定方式
1. MOV SCON,#01000000b ;設定串列傳輸工作於模式1, 不可接收資料 (C語言寫法 SCON = 0x40;) 2. MOV SCON,#01010000b ;設定串列傳輸工作於模式1, 可接收資料 (C語言寫法 SCON = 0x50;)
如果不確定此刻8051要採用哪一種,乾脆設成第2種方式,免得接收時不正常,找不到錯誤在哪裡。
鮑率的設定
8051的串列傳輸的鮑率是由TIMER1的溢位率決定的,通常會將它設在模式2自動載入的模式,這樣就不用再反覆給予初值,TH1初值的計算方式說明如下:
以下簡表是依照上述公式計算出來的,使用者可自行參考。
鮑率 |
石英震盪器頻率 |
SMOD |
計時器計數次數 |
自動載入值 |
19200 |
22 M Hz |
0 |
3 |
253 |
19200 |
11.059 M Hz |
1 |
3 |
253 |
9600 |
22 M Hz |
0 |
6 |
250 |
9600 |
11.059 M Hz |
0 |
3 |
253 |
4800 |
11.059 M Hz |
0 |
6 |
250 |
2400 |
11.059 M Hz |
0 |
12 |
244 |
註:SMOD為PCON暫存器的bit 7,CPU被RESET時,其值為0,若要將它設為1,可用以下方式, ORL PCON#10000000B
為方便使用者了解8051串列傳輸控制方式,以下提供2個簡單範例,
其中傳送端以迴圈當延遲程式做簡單計數,並透過串列傳輸將資料送出去,鮑率為9600bps。
接收端在設定好鮑率後,便停在判斷是否接收完畢那行,若接收完畢,便將資料顯示於P2 LED(注意:LED 0會亮,1不亮)。
如果想同時可傳送與接收,直接將以上2範例合併會有問題,因傳送程式在傳送一位元組以後,就在跑延遲迴圈,沒有檢查是否接收完畢(RI=1),容易漏接資料,建議改用中斷方式比較適合。
上述範例是假設石英震盪器為11.0592MHz,由於實驗板上的石英震盪器為12MHz,傳送鮑率會大9600bps,只有在兩個實驗板互傳資料才可正常顯示,如果要和PC互傳,會因鮑率不同,導致接收到的資料錯誤,以下有2個修正方式。
1.改用TIMER2控制鮑率,但此計時器8051沒有,需要使用8052或其他有此計時器的晶片才行,TIMER2在鮑率產生器模式下,只有預先除2,並不是除以12
鮑率 |
石英震盪器頻率 |
SMOD |
計時器計數次數 |
自動載入值 |
19200 |
24 M Hz |
x |
39 |
65536-39註1 |
19200 |
12 M Hz |
x |
20註2 |
65536-20 |
9600 |
24 M Hz |
x |
78 |
65536-78 |
9600 |
12 M Hz |
x |
39 |
65536-39 |
4800 |
12 M Hz |
x |
78 |
65536-78 |
2400 |
12 M Hz |
x註3 |
156 |
65536-156 |
註1:數字比較複雜,建議留給組譯器算就好。 註2:有2.4%誤差,但不影響傳輸的正確性。 註3:經實際測試,鮑率與SMOD位元無關。
練習:仿照前述範例,將此2程式整合成一個同時可以傳送和接收的程式。
2.笙泉的計時器,可選擇不要預先除以12,這樣在TH1的自動載入值,彈性就會比較大。要不要預先除12是由ARXR2所控制的
AUXR2 (Address=A6H, Auxiliary Register2, Reset Value=0000,0000B)
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
T0X12 |
T1X12 |
URM0X6 |
S2TR |
S2SMOD |
S2TX12 |
S2CKOE |
T0CKOE |
T0X12: 當C/-T=0時,Timer 0 之時脈來源選擇。 T0X12 = 1 時脈來源 = Fosc, T0X12 = 0 時脈來源 = Fosc/12。 T1X12: 當C/-T=0時,Timer10 之時脈來源選擇。. T1X12 = 1 時脈來源 = Fosc, T1X12 = 0 時脈來源 = Fosc/12。 T0CKOE: Set/clear to enable/disable Timer 0 clock-out function from P3.4. 因此要不預先除12,只要下以下指令 ORL AUXR2,#01000000b ;將AUXR2暫存器中的T1X12設為1
鮑率 |
石英震盪器頻率 |
SMOD |
計時器計數次數 |
自動載入值 |
19200 |
24 M Hz |
0 |
39 |
217 |
19200 |
12 M Hz |
1 |
39 |
217 |
19200 |
12 M Hz |
0 |
20註 |
236 |
9600 |
24 M Hz |
0 |
78 |
178 |
9600 |
12 M Hz |
0 |
39 |
217 |
4800 |
12 M Hz |
0 |
78 |
178 |
2400 |
12 M Hz |
0 |
156 |
100 |
練習:仿照前述範例,將此2程式整合成一個同時可以傳送和接收的程式。
同時可以傳送和接收範例(C)
笙泉8051串列傳輸測試程式
功能:
按鍵盤透過UART TXD將資料傳送出去
將UART RXD收到的資料顯示於LCD
(注意程式開頭使用說明,此程式必須配合鍵盤、LCD及中斷說明章節之相關說明)