目录
一、串口编程寄存器分析
1、PCON : 电源控制寄存器
SMOD:波特率选择位
SMOD = 0; 串口方式1,2,3时,波特率正常
SMOD = 1;串口方式1,2,3时,波特率加倍
例如: PCON &= 0x7F; //波特率不倍速
7F转换成二进制后是 0111 1111,意思是高位清零,其他位不变,因为如上图SMOD在高位,高位要清零,所以SMOD = 0,波特率属于正常倍数
2、SCON:串行控制寄存器
REN:允许/禁止串行接收控制位。即REN=1为允许串行接收状态 ,REN=0,则禁止接收
TI: 发送中断请求标志位。即TI=1,向主机请求中断,响应中断后必须用软件复位,即TI=0
例如:SCON = 0x50; //8位数据,可变波特率
50转换成二进制后是0101 0000,带到SCON寄存器中就是 SM0 = 0、SM1 = 1,选择工作方式1,然后REN = 1,允许串行接收控制位
总结一下使用串口,需要用到的寄存器:
REN:允许/禁止串行接收控制位。即REN=1为允许串行接收状态
TI:发送中断请求标志位;TI = 1 指发送数据
RI:接收中断请求标志位;RI = 1 指接收到数据,硬件置1
二、自己实现串口初始化编程
#include "reg52.h"
sfr AUXR = 0x8E;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01; //降低时钟对外界的辐射
SCON = 0x40; //串行口寄存器工作模式选择方式1,RNE=0,为串行禁止接收状态
TMOD &= 0x0F; //定时器1工作方式位8位自动重装
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD; //9600波特率的初值
TR1 = 1; //启动定时器
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
char data_msg = 'a';
//配置C51串口的通信方式
UartInit();
while(1){
Delay1000ms();
//往发送缓冲区写入数据,就完成数据的发送
SBUF = data_msg;
}
}