这是串行异步通信接收发送的实例,代码来源于书《单片机原理及应用技术》在使用该代码时,需将晶振调制“11.0592MHz。在仿真图里的虚拟终端的波特率设置为9600,校验位选择:ODD(每个都下拉一下,看到ODD的就是了);变一下这两个,其他都不变。
右键点击线,添加网络标号,代号相同即相连。
#include "reg51.h"
#include "stdio.h"
typedef unsigned char u8;
u8 red;
bit rf,Error;
//初始化程序
void init()
{
SCON=0xd0;
PCON=0x00;
TMOD=0x20;
TH1=0xFD;
TL1=0xFD;
EA=1;
ES=1;
TR1=1;
rf=0;
}
//对串口接收的数据校验
bit check(u8 chd)
{
ACC=chd;
if(P==RB8)
return 1;
else
return 0;
}
//串口发送数据
void send(u8 dat)
{
ACC=dat;
TB8=P;
SBUF=dat;
while(!TI);
TI=0;
}
//串口发送字符串
void sends(u8 *str)
{
while(*str)
{
send(*(str++));
}
}
//主函数
void main()
{
init();
sends("Input '1' to Turn on LED1!\r\n");
sends("Input '2' to Turn on LED2!\r\n");
sends("Input 'H' to Display help!\r\n");
sends("The other Input ERROR!\r\n");
sends("Please Input data:\r\n");
while(1)
{
if(rf)//是否接收到数据
{
sends("Receive data is:");
send(red);
sends("\r\n");
switch(red)
{
case '1':P1=~0x01;sends("LED1 is ON!\r\n");break;
case '2':P1=~0x02;sends("LED2 is ON!\r\n");break;
case 'h': P1=~0x08;
sends("Input '1' to Turn on LED1!\r\n");
sends("Input '2' to Turn on LED2!\r\n");
sends("Input 'H' to Display help!\r\n");
sends("The other Input ERROR!\r\n");
break;
default:P1=~0x04; sends("The other Input ERROR!\r\n");break;
red=0;
}
if(Error)
{
P1=~0x08;
sends("Check Error!\r\n");
}
rf=0;
sends("Please Input data:\r\n");
}
}
}
void UARTInterrupt() interrupt 4
{
if(RI)
{
RI=0;
rf=1;
red=SBUF;
if(check(red))
{
Error=0;
}
else
{
Error=1;
}
}
}