串口,作爲單片機程序開發中最常用、最方便,也是應用最廣泛的程序調試方法;無論是作爲調試工具,打印出調試信息,還是對功能模塊進行通信,串口是每個單片機開發人員最常用的單片機外設。
由於大部分51單片機不支持在線調試功能,所以串口作爲一種有效的調試功能,所以在51單片機程序開發時,無法進行在線調試,不妨可以多采用串口來進行調試。
1.串口配置
51單片機配置除了需要配置2個8位寄存器SCON、PCON外,還要配置定時器1的控制寄存器TMOD,因爲串口在進行收發需要使用定時器來採樣。
(1)狀態控制寄存器 SCON
SCON 是一個逐位定義的 8 位寄存器,用於控制串行通信的方式選擇、接收和發送,指 示串口的狀態,SCON 即可以字節尋址也可以位尋址,字節地址 98H,地址位爲 98H~9FH。 它的各個位定義如下:
SM0 和 SM1 是串口的工作方式選擇位,2 個選擇位對應 4 種工作方式,如下表,其中 Fosc 是振盪器的頻率。
(2)電源與波特率控制寄存器
控制寄存器 PCON 也是一個逐位定義的 8 位寄存器,目前僅僅有幾位有定義,如下所示:
僅最高位 SMOD 與串口的控制有關,其他位與掉電方式有關。PCON 的地址爲 87H 只能按 字節尋址,SMOD 是串行通信波特率係數控制位,當串口工作在工作方式 1、2 時,若使用 T1 作爲波特率發生器其 SMOD=1 則波特率加倍。
(3)定時器控制模式寄存器
TMOD是定時器、計數器模式控制寄存器,它是一個逐位定義的8爲寄存器,但只能使用字節尋址
當串口工作在工作方式0和2是,波特率固定,方式0時fosc/12;方式2時fosc/32或fosc/64(根據SMOD判斷)。當串口工作在方式1時,波特率=(2^SMOD/32)*(單片機時鐘頻率/(256-X)),X是初值;C/T#爲定時器和計數器選擇位,0爲定時器,1爲計數器
2.串口通用程序
爲了有較好的通用性,將串口程序配置爲一個H文件和C文件,往後只要開發51單片機程序,都可以將該兩個文件複製在工程中直接使用,無須修改。
(1)uart.H
#ifndef _UART_H_
#define _UART_H_
#include "reg52.h"
void UartInit(void);
void Send_string(unsigned char *c);
void Send_Data(unsigned char DAT);
#endif
(2)uart.c
#include "uart.h"
//串口初始化
void UartInit(void)
{
/*串口初始化 */
TMOD = 0x20; //定時器T1使用工作方式2
SCON = 0x50; //工作方式1,,允許接收
PCON = 0x10;
TH1 = 253; // 設置初值,波特率9600bps
TL1 = 253;
TR1 = 1; // 開始計時
ES = 1; //打開接收中斷
EA = 1; // 打開所以中斷
TI = 0;
RI = 0;
}
void Send_Data(unsigned char DAT)
{
ES = 0;
TI=0;
SBUF = DAT ;
while(TI==0);
TI=0;
ES = 1;
}
void Send_string(unsigned char *c)
{
while(*c != '\0')
{
Send_Data(*c++);
}
}
void RSINTR() interrupt 4 using 2
{
EA=0;
if(TI==1) //發送中斷
{
TI=0;
}
if(RI==1) //接收中斷
{
RI=0;
}
EA=1;
}
如需串口參考例程, 請關注公衆號,首頁回覆“串口”獲取資料