proteus虛擬串口實現


1.概述

  主要介紹如何在proteus中搭建串口通訊電路,然后在PC中使用串口助手和proteus中的MCU進行通信。

2.主要使用到的軟件

  ① Proteus

  Proteus是由Lab Center Electronics公司推出的電子設計自動化(EDA)軟件。除具有其它EDA軟件的仿真功能,還能仿真單片機及其外圍器件。

  在下面示例中我使用的版本為proteus 7.8 sp2,詳情如下圖所示:

  參考下載地址:https://www.pcsoft.com.cn/soft/27539.html

  ②vspd( virtual serial port driver ) 

  VSPD是一款本地虛擬串口的軟件。 可以虛擬2個串口然后連接起來實現自發自收調試,讓你的程序讀一個串口,另外一個串口你就用來串口調試工具。

  在下面示例使用到的版本為VSPD v6.9,詳情如下圖所示:

  參考下載地址:https://www.eltima.com/vspd-post-download.html

 3.實現串口通信

  1、創建虛擬串口對

  ① 打開VSPD軟件,設置好需要創建的串口對的端口號,然后點擊【添加端口】按鈕;

  ② 進入【Custom pinout】選項卡,紅色框內的參數保持默認,如果需要設置流控和串口類型的,可以根據實際情況進行設置,這里不作敘述。

  ③ 測試創建的虛擬串口對是否能正常進行通信,下面以【9600波特率,8位數據位,1位停止位,無校驗,無流控】進行測試,需要的波特率只需要在串口助手中修改即可,和平常的串口無異;經過測試,確定虛擬串口通信正常,結果如下圖:

  2、搭建proteus仿真電路

  ① 電路示意框圖,我們在proteus使用DB9母頭和MAX232電平轉換芯片相連接

  ② DB9管腳定義及連接參考

  ③ 電路原理圖,這里的MCU使用AT89C51來做演示,這里的51單片機並沒有接外圍電路,因為在proteus仿真軟件里面不接也是可以正常運行的。

  (注:由於MAX232在proteus中的非符號管腳並無取反的作用,所以需要在12腳和14腳輸出時添加一個非門器件

    附1:MAX232參考電路(來自MAX232N 數據手冊)

    附2:使用到的器件表(可以按此名稱再proteus庫中直接搜索對應器件)

   

    附3:Proteus中DB9串口參數設置及串口助手參數設置

   這里【Component Reference】和【Component Value】不是必填選項,下面的端口選擇我們之前創建的虛擬串口對【COM2和COM3】中的其中一個,演示時我這邊使用【串口3,波特率9600,8位數據位,1位停止位,無校驗,無流控】的參數條件。在串口助手中使用【串口2,波特率9600,8位數據位,1位停止位,無校驗,無流控】。

  ③ 測試代碼如下

 1 /**  2  * @description: 程序實現51單片機串口接收字符串,結束符為回車符,最大接收長度為64Byte,  3  * 接收完成后返回接收結果,並清空接收緩沖區。  4  * 注意:程序只適用於11.0592MHz晶振, 12T的51單片機,暫未做兼容設計。  5  * @author: veis  6  * @date: 2020-03-04  7  * @version: v1.0  8  */
 9 
 10 #include <reg52.h>
 11 
 12 // 類型重定義,便於移植
 13 typedef unsigned char uint8_t;  14 typedef unsigned int uint16_t;  15 
 16 // 定義串口接收標志枚舉類型
 17 enum
 18 {  19     isempty = 0, // 接收緩沖區為空
 20     isoverflow,    // 接收緩沖區溢出
 21     isend    // 成功接收到結束標志符
 22 } buf_flag;  23 
 24 // 定義接收緩沖區大小
 25 #define BUFFER_SIZE    64
 26 // 定義結束符為回車符 "\r\n"
 27 #define END_SYMBOL0 '\r'
 28 #define END_SYMBOL1    '\n'
 29 
 30 // 外部可見函數聲明
 31 void uart_config(void);  32 void send_char(uint8_t ch);  33 void send_string(uint8_t *str);  34 
 35 // 定義串口接收緩沖區
 36 uint8_t recv_buf[BUFFER_SIZE] = {0};  37 
 38 void main()  39 {  40     int i = 0;  41     buf_flag = isempty;  42     uart_config();    // 初始化串口
 43     send_string("I am serial port 3!\r\n");  44     while (1)  45  {  46         if (buf_flag == isend)  47  {  48             send_string(recv_buf); // 把接收到的字符串發送回去
 49             i = 0;  50             while (i < BUFFER_SIZE)  51  {  52                 recv_buf[i++] = 0;  53  }  54             buf_flag = isempty;  55  }  56         else if (buf_flag == isoverflow)  57  {  58             send_string("ERROR:receive buffer is overflow!\r\n"); // 提示緩沖區溢出
 59             i = 0;  60             while (i < BUFFER_SIZE)  61  {  62                 recv_buf[i++] = 0;  63  }  64             buf_flag = isempty;  65  }  66  }  67 }  68 
 69 /**  70  * 串口參數配置函數,這里配置為9600波特率,1位停止位,8位數據位,無校驗  71  */
 72 void uart_config(void)  73 {  74     TMOD = 0x20;  75     SCON = 0x50;  76     TH1 = 0xfd;  77     TL1 = TH1;  78     PCON = 0x00;  79     EA = 1;  80     ES = 1;  81     TR1 = 1;  82 }  83 
 84 /**  85  * [send_char]  86  * @param ch [待發送的字符]  87  */
 88 void send_char(uint8_t ch)  89 {  90     SBUF = ch;  91     while (!TI);  92     TI = 0;  93 }  94 
 95 /**  96  * [send_string]  97  * @param str [待發送的字符串首元素地址]  98  */
 99 void send_string(uint8_t *str) 100 { 101     while (*str != '\0') 102  { 103         SBUF = *str++; 104         while (!TI); 105         TI = 0; 106  } 107 } 108 
109 /** 110  * [uart_interrupt] 111  */
112 void uart_interrupt(void) interrupt 4
113 { 114     static uint8_t n = 0; 115     if (RI) 116  { 117         RI = 0; 118         if (n < BUFFER_SIZE - 1) 119  { 120             recv_buf[n++] = SBUF; 121             // 判斷是否接收到結束符(回車 "\r\n")
122             if ((recv_buf[n - 2] == END_SYMBOL0) && (recv_buf[n - 1] == END_SYMBOL1)) 123  { 124                 buf_flag = isend; 125                 recv_buf[n] = '\0'; 126                 n = 0; 127  } 128  } 129         else
130  { 131             n = 0; 132             buf_flag = isoverflow; 133  } 134  } 135 
136 }

  ④ 加載通過keil生成好的hex文件(這里不介紹如何生成hex文件)

  ⑤ 在proteus中點擊運行仿真按鈕,上電后MCU向PC的串口助手發送【I am serial port 3!\r\n】,然后手動發送一句【I am serial port 2!\r\n】,MCU回復接收到的內容,測試結果和程序一致。

4、總結

  整體電路並不復雜,值得注意的是proteus中MAX232電平轉換芯片的管腳非屬性並無效,需要自行增加非門進行設計電路仿真,注意實際設計時候並不需要非門。另外需要注意的是proteus中的DB9接口的連接方式,需要RXD接MAX232的RXD,TXD接MAX232的TXD。

  注:需要電路及軟件的可以在評論區留言,有更多想了解的也可以留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM