TMD楼上的越来越厉害,感觉吊灯都快被震下来了
用到的特殊寄存器:
SM0 SM1:工作方式控制 01 工作方式1 1起始位 8数据位 1停止位 波特率可变
TI:发送中断位 TI=1 发送完成,软件置0
RI:接收中断位 RI=1 接收完成,软件置0
REN:接收使能
SBUF:缓冲区
PCON最高位SMOD 置1 波特率加倍,0正常
定时器使用模式2 ,10 8位自动增补
代码如下:
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit left=P1^2;
uint8 message;
void delay42ms(void) //误差 -0.217013888898us
{
unsigned char a,b,c;
for(c=118;c>0;c--)
for(b=65;b>0;b--)
for(a=1;a>0;a--);
}
void uart_init()
{
TMOD=0x20; //定时器模式2 自动增补
SCON=0x50; //uart方式1 8位
TH1=TL1=0xfd; //9600 th= 256-11059200/(12*32*9600)
PCON=0x80; //加倍 19200
TR1=1;
REN=1;
ES=1;
EA=1;
}
main()
{
uart_init();
left=0;
while(1);
}
void uart_interrupt() interrupt 4
{
if(TI)
{
TI=0;
}
if(RI)
{
RI=0;
message=SBUF;
REN=0; //接收关闭
if(message=='a')
{
left=1;
delay42ms();
left=0;
}
if(message=='c')
{
SBUF='o';
while(TI==0);
TI=0;
SBUF='k';
while(TI==0);
TI=0;
SBUF='!';
}
REN=1;
}
}
效果演示:

