串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。
由于大部分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 != '