元器件
元器件 | 名称 |
---|---|
电阻 | 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;
}
}
运行效果如图:
文章来源:https://www.toymoban.com/news/detail-757971.html
工程文件
工程文件文章来源地址https://www.toymoban.com/news/detail-757971.html
到了这里,关于Proteus8仿真:51单片机使用串口进行双机通讯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!