一、89C51單片機的串行接口結構
89C51單片機通過引腳RXD(P3.0,串行數據接收端)和引腳TXD(P3.1,串行數據發送端)與外界通訊。SBUF是串行口緩沖寄存器,包括發送寄存器和接收寄存器。它們有相同名字和地址空間,但不會出現沖突,因為它們其中一個只能被CPU讀出數據,另一個只能被CPU寫入數據。
二、串行口的控制與狀態寄存器
SCON用于定義串行口的工作方式及實施接收和發送控制。其各位定義如表1:
SM2:多機通訊控制位。本文不使用,編程時置0即可。
REN:接收允許控制位。由軟件置位以允許接收,又由軟件清0來禁止接收。
TB8:要發送數據的第9位。可約定作為奇偶校驗位。
RB8:接收到的數據的第9位。在方式0中不使用RB8。在方式1中,若SM2=0,其為接收到的停止位。
TI:發送中斷標志。在方式0中,第8位發送結束時,由硬件置位。在其它方式的發送停止位前,由硬件置位。必須用軟件清0。
RI:接收中斷標志位。在方式0,當接收完第8位數據后,由硬件置位。在其它方式中,在接收到停止位的中間時刻由硬件置位。RI也必須用軟件清0。
1:方式1,3波特率=定時器1溢出率/16;方式2波特率為Fosc/32。
0:方式1,3波特率=定時器1溢出率/32;方式2波特率為Fosc/64
四種工作方式分別為方式0、方式1、方式2、方式3:
(1)方式0為移位寄存器輸入/輸出方式。(2)方式1為波特率可變的10位異步通訊接口方式。(3)方式2為固定波特率的11位異步通訊接口方式。(4)方式3為波特率可變的11位異步通訊接口方式。
三、波特率的選擇
在串行通訊中,收發雙方的數據傳送率(波特率)要有一定的約定。在89C51串行口的四種工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可變的,由定時器T1的溢出率控制。
A、方式0:波特率固定為晶振頻率的1/12。B、方式2:波特率由PCON中的選擇位SMOD來決定:SMOD=1:波特率為1/32fosc,SMOD=0:波特率為1/64fosc。C、方式1和方式3:定時器T1作為波特率發生器,其公式如下:波特率=定時器T1溢出率乘2的SMOD次方除以32;T1溢出率=T1計數率/產生溢出所需的周期數。當時鐘頻率選用11.0592MHZ時,容易獲得標準的波特率,所以很多單片機系統選用這個頻率的晶振。
四、串口調試實驗
我們首先要做的是串口的初始化:(1)確定定時器1的工作方式———編程TMOD寄存器;(2)計算定時器1的初值———裝載TH1,TL1;(3)啟動定時器1———編程TCON中的TR1位;(4)確定串行口的工作方式———編程SCON;(5)串行口在中斷方式工作時,須開CPU和源中斷———編程IE寄存器。
初始化以后就進行串口與PC機的通訊實驗,本實驗是在PC端向單片機發送數據,然后單片機把PC發送的數據送回PC端,同時單片機控制一個led燈閃爍。這里我們使用基于VC++編寫的PC端串口工具來完成調試。
五、結束語
串口通信因簡單高效而得到了廣泛的應用,本文介紹了89C51單片機的串口通信原理,對其內部結構如串行口控制寄存器SCON和電源控制寄存器PCON進行了詳細剖析,研究了4種工作方式下的波特率選擇問題,最后進行了實際的RS232串口通信實驗,利用中斷方式靈活地實現了單片機與PC機的串口通信。