源代码(C语言)
#include<reg52.h> //#include<intrins.h> //#include<copy.h> #define u16 unsigned int #define u8 unsigned char u8 flag,temp;
void Usart_Init() { ?? ??? ??? ?TMOD=0x20;//定时器1方式2自动重装? ?0010 0000(方式2)高四位启动定时器1 ?? ??? ??? ?TH1=0xf3;//4800倍频,12Mhz//倍频之后串口调试还是选择4800波特率 ?? ??? ??? ?TL1=0xf3;//高四位的值一直会往低四位送 ?? ??? ??? ?PCON=0x80;//倍频 ?? ??? ??? ?SCON=0x50;//工作方式1? ? 0101 0000? ?? ??? ??? ?//ET1=1;?? ?//可不开,此开关打开,led初始全亮 ?? ??? ??? ?EA=1;?? ?//打开总中断 ?? ??? ??? ?TR1=1;//打开计数器 ?? ??? ??? ?ES=1;//打开接收中断 }
void main() { ?? ??? ??? ?Usart_Init();//初始化 ?? ??? ??? ?while(1) ?? ??? ??? ?{?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ?if(flag==1) ?? ??? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ??? ??? ?ES=0;//关闭接收中断 ?? ??? ??? ??? ??? ??? ??? ?flag=0; ?? ??? ??? ??? ??? ??? ??? ?SBUF=temp;//接受缓存器?? ??? ??? ??? ??? ??? ? ?? ??? ??? ??? ??? ??? ??? ??? ?while(!TI);?? ??? ??? ? //等待发送数据完成 ?? ??? ??? ??? ??? ??? ??? ??? ?TI=0;?? ??? ??? ??? ??? ??? ? //清除发送完成标志位 ?? ??? ??? ??? ??? ??? ??? ?ES=1; ?? ??? ??? ??? ??? ?} ?? ??? ??? ?}?? ??? ??? ??? ? } void Usart()interrupt 4 { ?? ??? ? ?? ??? ?RI=0;//清除接收中断标志位?? ??? ? ?? ??? ?P2=SBUF;//发送缓存器,两个地址一样? 不同的缓存器 ? ?? ??? ?temp=SBUF; ?? ??? ?flag=1;
}
如果pc向单片机发送了数据则进入中断flag被置1 if判定进去关闭接收中断防止单个数据在while里一直被发送
下面展示while里ES没有被关闭的情况?
|