Proteus仿真教程:基于51单片机,利用虚拟串口实现主从机通信

文章目录

  • 原理图
  • 程序源码
  • 虚拟串口VSPD下载
  • 安装及破解
  • 使用
  • 运行
  • 最近在学校做单片机课程实验时,需要在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循环显示。

    ​​

    物联沃分享整理
    物联沃-IOTWORD物联网 » Proteus仿真教程:基于51单片机,利用虚拟串口实现主从机通信

    发表评论