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;
}
}
效果演示:

