Proteus基于51单片机利用虚拟串口实现主从机的通信


最近在学校做单片机课程实验时,需要在Proteus上实现串口的通信,具体要求如下:

 1. 使用串口中断实现数据的接收
 2. 甲机连续发送0-F,共计16个字符,并显示在数码管上
 3. 乙机接收甲机内容并用数码管显示后回传
 4. 甲机接收到乙机回传内容后与当前发送内容相比较,若一致则发送下一个,若不一致,则重新传输
 5. 晶振为11.0592MHz,数据通讯波特率为19200
 6. 使用虚拟串口实现两个单片机的仿真连接

原理图

在此记录一下本人的解题方案,首先Proteus中的原理图绘制如下在这里插入图片描述
其中虚拟串口可在元件库中搜索COMPIM获得。
将原件按上图连接完毕后,将各个虚拟串口的收发波特率设置为19200,并分别赋予COM1和COM2网络属性。如下图所示。
Alt
在这里插入图片描述

程序源码

接下来是甲机的程序(主机):

#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循环显示。

​​

  • 31
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linco_encode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值