最近在学校做单片机课程实验时,需要在Proteus上实现串口的通信,具体要求如下:
1. 使用串口中断实现数据的接收
2. 甲机连续发送0-F,共计16个字符,并显示在数码管上
3. 乙机接收甲机内容并用数码管显示后回传
4. 甲机接收到乙机回传内容后与当前发送内容相比较,若一致则发送下一个,若不一致,则重新传输
5. 晶振为11.0592MHz,数据通讯波特率为19200
6. 使用虚拟串口实现两个单片机的仿真连接
原理图
在此记录一下本人的解题方案,首先Proteus中的原理图绘制如下
其中虚拟串口可在元件库中搜索COMPIM获得。
将原件按上图连接完毕后,将各个虚拟串口的收发波特率设置为19200,并分别赋予COM1和COM2网络属性。如下图所示。
程序源码
接下来是甲机的程序(主机):
#include <REG51.H>
void UartInit(void);
void UART_SendByte(unsigned char Byte);
void Timer0Init(void);
unsigned char led_mod[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极字模
unsigned char send[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; //等待发送的字符
unsigned int num=0;
void delay(unsigned char time) //1s@11.0592MHz
{
unsigned char i, j, k;
i = 8*time;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //19200bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
ES=1; //开启串口中断
EA=1; //开启串口中断
}
void UART_SendByte(unsigned char Byte) //串口发送字节
{
SBUF=Byte;
while(!TI);
TI=0;
}
void UART_Routine(void) interrupt 4 //串口接收中断
{
char temp; //用于接收的临时变量
if(RI==1)
{
temp=SBUF; //接收从机返回的字符
if(send[num]==temp) //如果接收到的字符与发送出去的相等
num++; //发送下一个字符
else
num=0; //若不相等则从0开始重新发送
RI=0;
}
}
void main()
{
UartInit(); //串口中断初始化
while(1)
{
P2=led_mod[num]; //显示当前字符
UART_SendByte(send[num]); //发送当前字符
delay(1); //延迟1s
num%=16; //进入新的发送循环
}
}
接下来是乙机的程序(从机):
#include <REG51.H>
void UartInit(void);
void UART_SendByte(unsigned char Byte);
void Timer0Init(void);
unsigned char led_mod[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阳极字模
unsigned int num;
void UartInit(void) //19200bps@11.0592MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
ES=1; //开启串口中断
EA=1; //开启串口中断
}
void UART_Routine(void) interrupt 4 //串口接收中断
{
char temp;
if(RI==1)
{
temp=SBUF; //接受字符
if(temp>47&&temp<58)
num=(int)temp-48; //将接受到的0~9字符转化为十进制0~9
if(temp>64&&temp<71) //将接受到的A~F字符转化为十进制10~15
num=(int)temp-55;
SBUF=temp; //返回字符
while(!TI); //等待发送完毕
TI=0;
RI=0;
}
}
void main()
{
UartInit(); //串口中断初始化
while(1)
{
P2=led_mod[num]; //显示接收到的字符
}
}
将两个程序分别编译生成.hex文件后,分别烧录进主从机中。
虚拟串口VSPD下载
由于这里使用了虚拟串口进行通信,所以需要使用第三方软件将两个虚拟串口之间连接起来。这里使用VSPD虚拟串口工具,软件连接放在下面方便取用。
百度云盘链接:https://pan.baidu.com/s/1LJzyGr76akW67gfU8KU6VA?pwd=1111
提取码:1111
阿里云盘链接:https://www.aliyundrive.com/s/6XpZyPZ4VEF
安装及破解
运行 vspd.exe 安装,语言选择英语(没有中文选项),安装好以后先不运行,将下载的vspdctl.dll 文件复制,找到软件安装目录并粘贴(默认路径是C:\Program Files\Eltima Software\Virtual Serial Port Driver 7.2),覆盖原有文件,即完成破解。
使用
选择COM1和COM2端口后,点击Add pair。
添加成功后可在左侧看见COM1和COM2端口之间已连接。
运行
程序烧录完毕且虚拟端口连接完毕后,运行Proteus仿真
仿真成功后,主从两机正常通信,两个数码管同时显示相同的字符。显示内容从0-F每隔1s循环显示。文章来源:https://www.toymoban.com/news/detail-481019.html
文章来源地址https://www.toymoban.com/news/detail-481019.html
到了这里,关于Proteus基于51单片机利用虚拟串口实现主从机的通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!