Proteus8仿真:51单片机使用串口进行双机通讯

元器件

元器件 名称
电阻 RES
51单片机 AT89C51
电容 CAP
晶振 CRYSTAL
BCD数码管 7SEG-BCD

原理图部分

在这里插入图片描述

串口初始化:
首先根据相关的串口寄存器编写对应的初始化代码:
在这里插入图片描述
STC89C51单片机设有两个定时器/计数器,因定时器1有4种工作方式,而常选用定时器1的工作方式2(8位自动重装)作为波特率的溢出率。
串口寄存器主要配置SCON寄存器。
在这里插入图片描述
在这里插入图片描述
本次采用8为可变,所以SM0=1;SM1=0;REN=1;然后通过波特率的计算,可以计算出波特率和定时器初值的关系,然后编写定时器初始化和串口初始化。

void initUart(unsigned int baud)
{
    
    
	SM0=1;SM1=0;REN=1;//8位波特率可变,允许串口接受信号
	TMOD|=0X20;//定时器1为8位自动重装载
	PCON=0X00;//让SMOD==0
	TR1=1;//打开定时器1
	EA=1;ET1=1;//打开串口中断
	TH1=256-11059200/12/32/baud;//设置定时器初值
	TL1=256-11059200/12/32/baud;//设置定时器初值
}

代码

本次实验由双机进行串口通讯,来核对双方的数据是否是一样的,如果一样的就显示在数码管。

单片机1main.c

代码如下:

#include "reg51.h"

//宏定义
#define uchar unsigned char
#define uint unsigned int
//延时函数
void time(uint ucMs);
//串口初始化
void initUart(unsigned int baud);
//参数定义
uchar ucCounter;

void main(void)
{
    
    
	uchar counter=0;
	time(1);
	initUart(9600);//串口进行初始化
	while(1)
	{
    
    
		SBUF=counter;//将参数给寄存器
		while(TI==0);//发送中断,发送8位时为1
		TI=0;//软件置0
		while(RI==0);//接受中断,接受8位时为1
		RI=0;//软件置0
		if(SBUF==counter)//如果接受到的等于counter
		{
    
    
			P2=counter;//数码管显示counter
			if(++counter>15)counter=0;//大于15清零
			time(500);//延时
		}
	}
}


void initUart(unsigned int baud)
{
    
    
	SM0=1;SM1=0;REN=1;//8位波特率可变,允许串口接受信号
	TMOD|=0X20;//定时器1为8位自动重装载
	PCON=0X00;//让SMOD==0
	TR1=1;//打开定时器1
	EA=1;ET1=1;//打开串口中断
	TH1=256-11059200/12/32/baud;//设置定时器初值
	TL1=256-11059200/12/32/baud;//设置定时器初值
}

//延时函数
void time(uint ucMs)
{
    
    
	while(ucMs!=0)
	{
    
    
		for(ucCounter=0;ucCounter<239;ucCounter++);
		ucMs-=1;
	}
}


单片机2main.c

#include "reg51.h"

//宏定义
#define uchar unsigned char
#define uint unsigned int
//延时函数
void time(uint ucMs);
//串口初始化
void initUart(unsigned int baud);
//参数定义
uchar ucCounter;

void main(void)
{
    
    
	uchar receive;
	time(1);
	initUart(9600);//串口初始化
	while(1)
	{
    
    
		while(RI==0);//接受8为置1
		RI=0;
		receive=SBUF; //接受信号
		SBUF=receive;//将接受的发出去
		while(TI==0);//发送8位置1
		TI=0;
		P2=receive;//数码管显示信号
	}
}

//串口初始化
void initUart(unsigned int baud)
{
    
    
	SM0=1;SM1=0;REN=1;//8位波特率可变,允许串口接受信号
	TMOD|=0X20;//定时器1为8位自动重装载
	PCON=0X00;//让SMOD==0
	TR1=1;//打开定时器1
	EA=1;ET1=1;//打开串口中断
	TH1=256-11059200/12/32/baud;//设置定时器初值
	TL1=256-11059200/12/32/baud;//设置定时器初值
}

//延时函数
void time(uint ucMs)
{
    
    
	while(ucMs!=0)
	{
    
    
		for(ucCounter=0;ucCounter<239;ucCounter++);
		ucMs-=1;
	}
}

运行效果如图:
在这里插入图片描述

工程文件

工程文件

猜你喜欢

转载自blog.csdn.net/darlingqx/article/details/128285034