在上一篇文章中我们通过串口实现了上位机接收单片机发送的信息,也可以通过上位机控制接在单片机上的led 但是有延迟。解决这个问题我们可以通过串口中断实现。
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
sbit D5 = P3^7;
char cmd;
void UartInit(void)
{
SCON = 0x50;
PCON = 0x00;
TMOD &=0x0F;
TMOD |=0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
EA =1 ;
ES = 1;
}
void Delay1000ms()
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void sendByte(char data_msg)
{
SBUF = data_msg;
while(TI==0);
TI =0;
}
void sendString(char* str)
{
while(*str !='\0'){
sendByte(*str);
str++;
}
}
void main()
{
D5 =1;
UartInit();
while(1)
{
Delay1000ms();
sendString("xiao wang ");
}
}
void Uart_Handler() interrupt 4
{
if(RI==1)
{
RI = 0 ;
cmd = SBUF;
if (cmd == 'o'){
D5 =0;
}
if (cmd == 'c'){
D5 =1;
}
if(TI);
}
}
实现效果:类似于双线程,单片机一直向上位机发送信息;而当上位机向单片机发送开灯关灯指令单片机立刻相应。
|