串口,作為單片機程序開發(fā)中最常用、最方便,也是應(yīng)用最廣泛的程序調(diào)試方法;無論是作為調(diào)試工具,打印出調(diào)試信息,還是對功能模塊進(jìn)行通信,串口是每個單片機開發(fā)人員最常用的單片機外設(shè)。
由于大部分51單片機不支持在線調(diào)試功能,所以串口作為一種有效的調(diào)試功能,所以在51單片機程序開發(fā)時,無法進(jìn)行在線調(diào)試,不妨可以多采用串口來進(jìn)行調(diào)試。
1. 串口配置
51單片機配置除了需要配置2個8位寄存器SCON、PCON外,還要配置定時器1的控制寄存器TMOD,因為串口在進(jìn)行收發(fā)需要使用定時器來采樣。
(1) 狀態(tài)控制寄存器 SCON
SCON 是一個逐位定義的 8 位寄存器,用于控制串行通信的方式選擇、接收和發(fā)送,指 示串口的狀態(tài),SCON 即可以字節(jié)尋址也可以位尋址,字節(jié)地址 98H,地址位為 98H~9FH。它的各個位定義如下:
SM0 和 SM1 是串口的工作方式選擇位,2 個選擇位對應(yīng) 4 種工作方式,如下表,其中 Fosc 是振蕩器的頻率。
(2) 電源與波特率控制寄存器
控制寄存器 PCON 也是一個逐位定義的 8 位寄存器,目前僅僅有幾位有定義,如下所示:
僅最高位 SMOD 與串口的控制有關(guān),其他位與掉電方式有關(guān)。PCON 的地址為 87H 只能按 字節(jié)尋址,SMOD 是串行通信波特率系數(shù)控制位,當(dāng)串口工作在工作方式 1、2 時,若使用 T1 作為波特率發(fā)生器其 SMOD=1 則波特率加倍。
(3) 定時器控制模式寄存器
TMOD是定時器、計數(shù)器模式控制寄存器,它是一個逐位定義的8位寄存器,但只能使用字節(jié)尋址
當(dāng)串口工作在工作方式0和2時,波特率固定,方式0時fosc/12;方式2時fosc/32或fosc/64(根據(jù)SMOD判斷)。當(dāng)串口工作在方式1時,波特率=(2^SMOD/32)*(單片機時鐘頻率/(256-X)),X是初值;C/T#為定時器和計數(shù)器選擇位,0為定時器,1為計數(shù)器。
2. 串口通用程序
為了有較好的通用性,將串口程序配置為一個H文件和C文件,往后只要開發(fā)51單片機程序,都可以將該兩個文件復(fù)制在工程中直接使用,無須修改。
(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
TH1 = 253; // 設(shè)置初值
TL1 = 253;
TR1 = 1; // 開始計時
SCON = 0x50; //工作方式1,波特率9600bps,允許接收
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++);
}
}
-
單片機
+關(guān)注
關(guān)注
6030文章
44491瀏覽量
632008 -
寄存器
+關(guān)注
關(guān)注
31文章
5295瀏覽量
119824 -
51單片機
+關(guān)注
關(guān)注
273文章
5697瀏覽量
122997 -
調(diào)試
+關(guān)注
關(guān)注
7文章
571瀏覽量
33874 -
串口
+關(guān)注
關(guān)注
14文章
1540瀏覽量
76068
發(fā)布評論請先 登錄
相關(guān)推薦
評論