51单片机串口通讯详解

2020-08-22 19:13发布

串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。


由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。


1.串口配置

51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。


(1)状态控制寄存器 SCON


SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCON 即可以字节寻址也可以位寻址,字节地址 98H,地址位为 98H~9FH。 它的各个位定义如下:


在这里插入图片描述


SM0 和 SM1 是串口的工作方式选择位,2 个选择位对应 4 种工作方式,如下表,其中 Fosc 是振荡器的频率。


444.png


(2)电源与波特率控制寄存器


控制寄存器 PCON 也是一个逐位定义的 8 位寄存器,目前仅仅有几位有定义,如下所示:


111.png


仅最高位 SMOD 与串口的控制有关,其他位与掉电方式有关。PCON 的地址为 87H 只能按 字节寻址,SMOD 是串行通信波特率系数控制位,当串口工作在工作方式 1、2 时,若使用 T1 作为波特率发生器其 SMOD=1 则波特率加倍。


(3)定时器控制模式寄存器


TMOD是定时器、计数器模式控制寄存器,它是一个逐位定义的8为寄存器,但只能使用字节寻址


222.png


当串口工作在工作方式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 != '') 
{ 
Send_Data(*c++); 
}	
} 
void RSINTR() interrupt 4 using 2 
{ EA=0; 
if(TI==1) //发送中断	
{ 
TI=0; 
} 

if(RI==1)	//接收中断	
{	
RI=0;	
} 
EA=1; 
}

如需串口参考例程, 请关注公众号,首页回复“

串口

”获取资料


333.jpg