根据数据手册
首先配置SCON串行控制寄存器 ,根据数据手册,一般选用工作方式1或3,这里我们选用工作方式1,则SM0和SM1分别为0和1
本实验只需要发送数据,暂时不需要接受数据,则REN给0;
剩下的无关位全给0,则SCON为0100 0000,转化为16进制,为0x40
这里经过查阅资料,发现数据手册写错了,
正确的是SMOD为0不加倍,为1加倍,这里可以选择不加倍,那么PCON低四位高四位全为0,可以不用配置。
波特率是由内部定时器产生,所以要配置定时器,这里用8位自动重装
用定时器1
则TMOD 为0010 0000,16进制为0x20,
用与或配置,TMOD &=0x0F //现将高四位清零,低四位不变
TMOD|=0x20 //再讲高四位与0010相或,低四位清零
计算TH1,TL1,
SMOD前面配置为0,不加倍,晶振频率为11059200,12分频
253转换为16进制0xFD,则TH1=0xFD ,TL1=0xFD,
配置完毕,完整代码
void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01; //增强稳定性
SCON=0x40;
TMOD &=0xF0;
TMOD |= 0x20;
TH1=0xfd;
TL1=0xfd;//9600波特率的初值
TR1=1;//启动定时器
}
写一段发送数据的代码
#include "reg52.h"
#include "intrins.h"
sfr AUXR=0x8e;
void UartInit(void) //9600bps@11.0592MHz
{
AUXR=0x01;
SCON=0x40;
TMOD &=0xF0;
TMOD |= 0x20;
TH1=0xfd;
TL1=0xfd;//9600波特率的初值
TR1=1;//启动定时器
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
char data_byte='a'; //尽量不要定义data,这是专用词
UartInit();
while(1)
{
Delay1000ms();
SBUF=data_byte;
}
}