根据其他大佬的博文和思路进行了模仿,利用keil和proteus联合仿真使用串口进行两个51单片机之间的直接通信
参照代码如下:
单片机1:
#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;
}
}
单片机2:
#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;
}
}
其仿真结果图如下:
仿真结果有误,但是几经排查尝试几种方法都找不出其错误原因,甚至直接利用代码来源的博主的工程文件其数码管的结果依旧如图所示,希望有大佬可以之处我的错误之处QAQ
侵删