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。

傳送範例(ASM)(範例C)

接收端在設定好鮑率後,便停在判斷是否接收完畢那行,若接收完畢,便將資料顯示於P2 LED(注意:LED 0會亮,1不亮)。

接收範例(ASM), (範例C)

 

如果想同時可傳送與接收,直接將以上2範例合併會有問題,因傳送程式在傳送一位元組以後,就在跑延遲迴圈,沒有檢查是否接收完畢(RI=1),容易漏接資料,建議改用中斷方式比較適合。

 

範例(ASM), (範例C)

 

上述範例是假設石英震盪器為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位元無關。

 

傳送範例(ASM)

接收範例(ASM)

練習:仿照前述範例,將此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.4%誤差,但不影響傳輸的正確性

 

 

傳送範例(ASM)傳送範例(C)

接收範例(ASM)接收範例(C)

練習:仿照前述範例,將此2程式整合成一個同時可以傳送和接收的程式。

同時可以傳送和接收範例(C)

 

笙泉8051串列傳輸測試程式

功能:
按鍵盤透過UART TXD將資料傳送出去
將UART RXD收到的資料顯示於LCD

範例(ASM)

(注意程式開頭使用說明,此程式必須配合鍵盤、LCD及中斷說明章節之相關說明)