51单片机双机串口通信protues仿真设计

采用USART串口通信,波特率为9600,一个单片机发送数字(自己的学号后两位)
一个单片机接收,并把接收的数字用数码管显示。
需要源码和仿真图可以加我QQ2142686503
51单片机双机串口通信protues仿真设计_第1张图片
51单片机双机串口通信protues仿真设计_第2张图片
接收部分程序:
串口接收

#include"usart.h"

unsigned char buf;			//头文件为声明,此处为定义
bit flag;					//显示标志

void UsartInit(void)		//9600bps @11.0592MHz
{
     
	PCON &= 0x3F;	//启用SM0  SMOD=0  复位时为0
	SCON = 0x50;	//方式一8位 不加倍 SM0 SM1 SM2 REN(接受控制位) TB8 RB8 TI RI  
	AUXR &= 0xBF;	//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//清除定时器1模式位
	TMOD |= 0x20;	//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1

	EA = 1;
    ES = 1;              //允许串口中断
}

void Usart() interrupt 4
{
     
	buf = SBUF;			   //读取缓冲区值 
	flag = 1;				//接受一次后打开显示
	ES = 0;                //关闭串行中断
    RI = 0;                //清除串行接受标志位
//	ES = 1;
}

显示数字函数

#include"display.h"
#include"delay.h"

unsigned char code table[]={
     0x00  , 0x01 , 0x02 , 0x03 , 0x04 ,
 0x05 ,0x06 ,0x07,0x08,0x09};	 //0----9

void Display(unsigned char i)	//数码管数值显示
{
     
	static unsigned char ge, shi, mode;
	if(mode!=i)	  //当值未改变时,去除计算,减少一次while循环时间
	{
     
		ge  =  i % 10;
		shi =  i / 10;
		mode = i;	  //记录上一次值
	}  	

	P2 = table[ge]  + 0xf0;		//数据+关闭位选
	delay(1);
	P2 &= 0xdf;					//打开位选  共阴极低电平亮
	delay(5);					//充分显示
	
	P2 |= 0xf0;	   				//消影
	delay(1);

	P2 = table[shi] + 0xf0;					//P2位选 个位P2^7 十位P2^6 
	delay(1);  	
	P2 &= 0xef;
	delay(5);
}

主函数

#include"reg52.h"
#include"usart.h"
#include"display.h"
#include"delay.h"


void main(void)
{
     
	UsartInit();
	while(1)
	{
     
		while(flag)			//接受到数据才开始显示
		{
     
			Display(buf);	//显示接收值
			delay(5);
		}
	}
}

发送单片机函数

void UART_SendBit(unsigned char Data)	//发送数据
{
     
  	SBUF=Data;		//写SUBF指令,启动发送
	while(!TI);		//发送完毕,TI置1,请求中断(无中断函数)
	TI=0;			//手动清零
}


void UsartInit(void)		//[email protected]
{
     
	PCON &= 0x3F;	//启用SM0  SMOD=0  复位时为0 波特率不倍速
	SCON = 0x50;	//8位数据,可变波特率  SM1 SM2 REN(接受控制位) TB8 RB8 TI RI  
	AUXR &= 0xBF;	//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;	//清除定时器1模式位
	TMOD |= 0x20;	//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

你可能感兴趣的:(protues仿真,串口通信,嵌入式,串口通信,单片机)