#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8e;
sbit D5 = P3^7; //定义led 接在P3.7void UartInit(void) //9600bps@11.0592MHz
{SCON = 0x50; //配置串口工作方式1,RE使能接收数据 0101 0000PCON = 0x00; TMOD &=0x0F;TMOD |=0x20;TH1 = 0xFD;TL1 = 0xFD;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 sendByte(char data_msg) // 发送一个字符
{SBUF = data_msg;while(TI==0);TI =0;
}void sendString(char* str) //发送字符串
{while(*str !='\0'){sendByte(*str);str++;}
}void main()
{ char cmd; //定义接收变量D5 =1; //init ledUartInit(); // 串口初始化while(1){Delay1000ms();sendString("xiao wang "); //向上位机发送数据if(RI==1) //RI = 1 说明单片机接收缓冲区接收到到了数据{RI = 0 ; // 软件复位RI 以可以连续工作cmd = SBUF;// 判断接收的数据是说明,o开灯 c关灯if (cmd == 'o'){D5 =0;}if (cmd == 'c'){D5 =1;}}}
}
烧录后可以在串口助手中看到接收区中每隔一秒接收到一个信息;
在发送区中写入o/c可以控制led的亮灭。
但是我们可以发现在通过串口控制灯时,有时候有延时,这主要是因为上位机在接收信息时有一秒的延时,当我们发送数据时正好在延时期间。可以通过中断解决。