串行异步通信接收发送实例

这是串行异步通信接收发送的实例,代码来源于书《单片机原理及应用技术》在使用该代码时,需将晶振调制“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;
	    }
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值