8051单片机串口的基本知识
51单片机有一个全双工的串行模块,该模块可以通过编程控制为异步工作方式或同步工作方式,是51单片机最常用于和外部设备交互的数据通道。
串行控制寄存器 : SCON (地址为 : 0x98)
串行数据寄存器 : SBUF (地址为 : 0x99)
电源管理寄存器 : PCON (地址为 : 0x97)
SCON : 用于对串行模块进行相应控制,支持位寻址,当单片机复位后,该寄存器被清“0”。
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
SM0、SM1进行串口工作方式选择:
| SM0 | SM1 | 工作方式 |
|---|---|---|
| 0 | 0 | 工作方式0 |
| 0 | 1 | 工作方式1 |
| 1 | 0 | 工作方式2 |
| 1 | 1 | 工作方式3 |
SM2 多机控制通信位,当该位被置“1”后启动多机通信模式,当该位被清“0”后禁止多机通信模式。多机通信模式仅仅在工作方式2和工作方式3下有效;在工作方式0下,应该使该位为0;在工作方式1下,通常设置该位为1。
REN 接收允许位,该位被置“1”时允许串口接收,当该位被清“0”时禁止串口接收。
TB8 存放在工作方式2或者工作方式3下等待发送的第9位数据。
RB8 存放在工作方式2或者工作方式3下接受到的第9位数据,在工作方式1下为接收到的停止位,在工作方式0下不使用该位。
TI 发送完成标志位。当SBUF中的数据发送完成后该位由硬件置“1”,并且当单片机硬件中断被使能后触发串行中断事件;该位必须由软件清“0”,并且只有在该位被清“0”后才能够进行下一个字节数据的发送。
RI 接收完成标志位。当SBUF接收到一个字节的数据后,该位由硬件系统置“1”,并且当单片机硬件中断被使能后触发串行中断事件;该位必须由软件清“0”,并且只有在该位被清“0”后才能进行下一个字节数据的接收。
工作方式0 :
通常用来外接移位寄存器,用于扩展I/O接口。工作时,波特率固定为fosc/12f_{osc} / 12fosc/12 ,串行数据通过RXD输入和输出,同步时钟通过TXD输出。发送和接收数据时低位在前,高位在后,长度为8。
工作方式1 :
在工作方式1下,一帧信息为10位:1位起始位(0),8位数据位(低位在前)和1位停止位(1)。TXD为发送数据端,RXD为接收数据端。波特率可变,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。即:波特率=2SMOD2^{SMOD}2SMOD *(T1的溢出率) /32 。
在这种方式下,需要对定时/计数器T1进行初始化。
工作方式2和工作方式3 :
工作方式2和工作方式3都为9位异步通信接口。接收和发送一帧信息长度为11位,即1个低电平的起始位,9位数据位,1个高电平的停止位。发送的第9位数据放于TB8中,接收的第9位数据放于RB8中。TXD为发送数据端,RXD为接收数据端。工作方式2和工作方式3的区别在于波特率不一样,其中工作方式2的波特率只有两种 : foscf_{osc}fosc/32或foscf_{osc}fosc/64;工作方式3的波特率与工作方式1的波特率相同,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。即:波特率=2SMOD2^{SMOD}2SMOD *(T1的溢出率) /32 。在这种方式下,需要对定时/计数器T1进行初始化。
SBUF : 串行数据寄存器SBUF用于存放在串行通信中发送和接收的相关数据,其寄存器地址为0x99。SBUF由发送缓冲寄存器和接收缓冲寄存器两部分组成,这两个寄存器占用同一个寄存器地址,允许同时访问。其中,发送缓冲器只能够写入不能够读出,接收缓冲寄存器只能够读出不能够写入,因此这两个寄存器在同时访问过程中并不会发生冲突。
当一个数据写入SBUF后,51单片机立刻根据选择的工作方式和波特率将写入的字节数据进行相应的处理后从TXD(P3.1)引脚串行发送出去,发送完成后置位相应寄存器里的标志位,只有当相应的标志位被清除之后,才能够进行下一次数据的发送。
当RXD(P3.0)引脚根据工作方式和波特率接收到一个完整的数据字节后,51单片机将把该数据字节放入接收缓冲寄存器中,并且置位相应的标志位。接收缓冲寄存器是双字节的,这样就可以在单片机读取接收缓冲寄存器中的数据时,同时进行下一个字节的数据接收,而不会发生前后两个字节的数据冲突。
PCON : 电源管理寄存器PCON里的SMOD和串口工作方式1、工作方式2、工作方式3下的波特率设置相关。
51单片机的串行模块一共有4种工作方式,其中工作方式0为同步通信方式,其余三种为异步通信方式。
8051单片机串口的相关应用实例:
实例1:

#include <AT89X52.h>
sbit LED = P2^0;
void InitUART(void)
{
TMOD = 0x20; //设置定时器的工作方式寄存器 0010 0000 9600bps
//定时器1工作在工作方式2
SCON = 0x50; //设置串行控制寄存器 0101 0000
//串口模块工作在工作方式1 允许接收位REN置“1”
TH1 = 0xFD; //自动重装载数据设置
TL1 = TH1;
PCON = 0x00; //SMOD的值为0
EA = 1; //打开中断总控制位
ES = 1; //打开串口中断控制位
TR1 = 1; //启用定时器1
}
void Send(unsigned char x) //串口数据发送函数
{
SBUF = x; //将数据存入数据寄存器
while(TI==0); //等待TI位被硬件置“1”
TI = 0; //将TI位进行软件清“0”
}
void Delay(unsigned int ms) //毫秒延时函数
{
unsigned int i,j;
for( i=0;i<ms;i++)
for(j=0;j<1141;j++);
}
void main() //主函数
{
unsigned char i;
InitUART(); //初始化串口
while(1) //循环体
{
for(i=0;i<200;i++) //循环发送数据
{
Delay(100);
Send(i);
LED = ~LED; //LED闪烁效果
}
}
}
实例2 :
原理图同实例1
#include <AT89X52.h>
sbit LED = P2^0;
void InitUART(void)
{
TMOD = 0x20; //设置定时器的工作方式寄存器 0010 0000 9600bps
//定时器1工作在工作方式2
SCON = 0x50; //设置串行控制寄存器 0101 0000
//串口模块工作在工作方式1 允许接收位REN置“1”
TH1 = 0xFD; //自动重装载数据设置
TL1 = TH1;
PCON = 0x00; //SMOD的值为0
EA = 1; //打开中断总控制位
ES = 1; //打开串口中断控制位
TR1 = 1; //启用定时器1
}
void Send(unsigned char x) //串口数据发送函数
{
SBUF = x; //将数据存入数据寄存器
while(TI==0); //等待TI位被硬件置“1”
TI = 0; //将TI位进行软件清“0”
}
void Serial(void) interrupt 4 using 0 //中断处理函数
{
unsigned char temp;
if(RI == 1) //如果接收完成标志位硬件置“1”
{
RI = 0; //软件清“0”接收完成标志位
temp = SBUF; //读取SBUF中的数据
Send(temp); //发送数据
LED = ~LED; //LED闪烁
}
}
void main()
{
InitUART(); //串口配置初始化
while(1)
{
}
}
实例3 :

#include <AT89X52.h>
sbit LED = P1 ^ 7; //定义LED驱动引脚
void Serial(void) interrupt 4 using 3 //串行中断处理函数
{
if(RI == 1) //如果接收完成标志位硬件置“1”
{
RI = 0; //清除RI中断
LED=~LED; //LED翻转
}
}
main()
{
TMOD = 0x20; //设置计数器工作方式
SCON = 0x50; //设置串行口工作方式
TH1 = 0xFD;
TL1 = 0xFD; //设置波特率
ES = 1; //开串行中断
EA = 1; //打开中断总控制位
TR1 = 1; //启动计数器
while(1)
{
}
}
本文详细介绍了8051单片机的串行模块,包括串行控制寄存器SCON、串行数据寄存器SBUF和电源管理寄存器PCON的功能及工作方式0、1、2、3的波特率设定。重点讨论了SM0、SM1、SM2、REN等控制位的作用,以及如何通过设置这些位来实现不同需求的串口通信。此外,还提到了串行中断事件的触发和标志位的管理。最后,文中列举了几个实际应用实例,帮助理解串口通信在51单片机中的应用。

1万+

被折叠的 条评论
为什么被折叠?



