proteus虚拟串口实现
1.概述
主要介紹如何在proteus中搭建串口通訊電路,然后在PC中使用串口助手和proteus中的MCU進(jìn)行通信。
2.主要使用到的軟件
① Proteus
Proteus是由Lab Center Electronics公司推出的電子設(shè)計(jì)自動(dòng)化(EDA)軟件。除具有其它EDA軟件的仿真功能,還能仿真單片機(jī)及其外圍器件。
在下面示例中我使用的版本為proteus 7.8 sp2,詳情如下圖所示:
參考下載地址:https://www.pcsoft.com.cn/soft/27539.html
②vspd( virtual serial port driver )
VSPD是一款本地虛擬串口的軟件。 可以虛擬2個(gè)串口然后連接起來(lái)實(shí)現(xiàn)自發(fā)自收調(diào)試,讓你的程序讀一個(gè)串口,另外一個(gè)串口你就用來(lái)串口調(diào)試工具。
在下面示例使用到的版本為VSPD v6.9,詳情如下圖所示:
參考下載地址:https://www.eltima.com/vspd-post-download.html
3.實(shí)現(xiàn)串口通信
1、創(chuàng)建虛擬串口對(duì)
?、?打開(kāi)VSPD軟件,設(shè)置好需要?jiǎng)?chuàng)建的串口對(duì)的端口號(hào),然后點(diǎn)擊【添加端口】按鈕;
?、?進(jìn)入【Custom pinout】選項(xiàng)卡,紅色框內(nèi)的參數(shù)保持默認(rèn),如果需要設(shè)置流控和串口類(lèi)型的,可以根據(jù)實(shí)際情況進(jìn)行設(shè)置,這里不作敘述。
③ 測(cè)試創(chuàng)建的虛擬串口對(duì)是否能正常進(jìn)行通信,下面以【9600波特率,8位數(shù)據(jù)位,1位停止位,無(wú)校驗(yàn),無(wú)流控】進(jìn)行測(cè)試,需要的波特率只需要在串口助手中修改即可,和平常的串口無(wú)異;經(jīng)過(guò)測(cè)試,確定虛擬串口通信正常,結(jié)果如下圖:
2、搭建proteus仿真電路
① 電路示意框圖,我們?cè)趐roteus使用DB9母頭和MAX232電平轉(zhuǎn)換芯片相連接
?、?DB9管腳定義及連接參考
③ 電路原理圖,這里的MCU使用AT89C51來(lái)做演示,這里的51單片機(jī)并沒(méi)有接外圍電路,因?yàn)樵趐roteus仿真軟件里面不接也是可以正常運(yùn)行的。
?。ㄗⅲ?strong>由于MAX232在proteus中的非符號(hào)管腳并無(wú)取反的作用,所以需要在12腳和14腳輸出時(shí)添加一個(gè)非門(mén)器件)
附1:MAX232參考電路(來(lái)自MAX232N 數(shù)據(jù)手冊(cè))
附2:使用到的器件表(可以按此名稱(chēng)再proteus庫(kù)中直接搜索對(duì)應(yīng)器件)
附3:Proteus中DB9串口參數(shù)設(shè)置及串口助手參數(shù)設(shè)置
這里【Component Reference】和【Component Value】不是必填選項(xiàng),下面的端口選擇我們之前創(chuàng)建的虛擬串口對(duì)【COM2和COM3】中的其中一個(gè),演示時(shí)我這邊使用【串口3,波特率9600,8位數(shù)據(jù)位,1位停止位,無(wú)校驗(yàn),無(wú)流控】的參數(shù)條件。在串口助手中使用【串口2,波特率9600,8位數(shù)據(jù)位,1位停止位,無(wú)校驗(yàn),無(wú)流控】。
?、?測(cè)試代碼如下
1 /**
2 * @description: 程序?qū)崿F(xiàn)51單片機(jī)串口接收字符串,結(jié)束符為回車(chē)符,最大接收長(zhǎng)度為64Byte,
3 * 接收完成后返回接收結(jié)果,并清空接收緩沖區(qū)。
4 * 注意:程序只適用于11.0592MHz晶振, 12T的51單片機(jī),暫未做兼容設(shè)計(jì)。
5 * @author: veis
6 * @date: 2020-03-04
7 * @version: v1.0
8 */
9
10 #include <reg52.h>
11
12 // 類(lèi)型重定義,便于移植
13 typedef unsigned char uint8_t;
14 typedef unsigned int uint16_t;
15
16 // 定義串口接收標(biāo)志枚舉類(lèi)型
17 enum
18 {
19 isempty = 0, // 接收緩沖區(qū)為空
20 isoverflow, // 接收緩沖區(qū)溢出
21 isend // 成功接收到結(jié)束標(biāo)志符
22 } buf_flag;
23
24 // 定義接收緩沖區(qū)大小
25 #define BUFFER_SIZE 64
26 // 定義結(jié)束符為回車(chē)符 "
"
27 #define END_SYMBOL0 ''
28 #define END_SYMBOL1 '
'
29
30 // 外部可見(jiàn)函數(shù)聲明
31 void uart_config(void);
32 void send_char(uint8_t ch);
33 void send_string(uint8_t *str);
34
35 // 定義串口接收緩沖區(qū)
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!
");
44 while (1)
45 {
46 if (buf_flag == isend)
47 {
48 send_string(recv_buf); // 把接收到的字符串發(fā)送回去
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!
"); // 提示緩沖區(qū)溢出
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 * 串口參數(shù)配置函數(shù),這里配置為9600波特率,1位停止位,8位數(shù)據(jù)位,無(wú)校驗(yàn)
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 [待發(fā)送的字符]
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 [待發(fā)送的字符串首元素地址]
98 */
99 void send_string(uint8_t *str)
100 {
101 while (*str != '')
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 // 判斷是否接收到結(jié)束符(回車(chē) "
")
122 if ((recv_buf[n - 2] == END_SYMBOL0) && (recv_buf[n - 1] == END_SYMBOL1))
123 {
124 buf_flag = isend;
125 recv_buf[n] = '';
126 n = 0;
127 }
128 }
129 else
130 {
131 n = 0;
132 buf_flag = isoverflow;
133 }
134 }
135
136 }
?、?加載通過(guò)keil生成好的hex文件(這里不介紹如何生成hex文件)
?、?在proteus中點(diǎn)擊運(yùn)行仿真按鈕,上電后MCU向PC的串口助手發(fā)送【I am serial port 3!
】,然后手動(dòng)發(fā)送一句【I am serial port 2!
】,MCU回復(fù)接收到的內(nèi)容,測(cè)試結(jié)果和程序一致。
4、總結(jié)
整體電路并不復(fù)雜,值得注意的是proteus中MAX232電平轉(zhuǎn)換芯片的管腳非屬性并無(wú)效,需要自行增加非門(mén)進(jìn)行設(shè)計(jì)電路仿真,注意實(shí)際設(shè)計(jì)時(shí)候并不需要非門(mén)。另外需要注意的是proteus中的DB9接口的連接方式,需要RXD接MAX232的RXD,TXD接MAX232的TXD。
注:需要電路及軟件的可以在評(píng)論區(qū)留言,有更多想了解的也可以留言。
總結(jié)
以上是生活随笔為你收集整理的proteus虚拟串口实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 舒淇刘烨主演的电影(被舒淇和刘烨虐哭千百
- 下一篇: Linux简介和各发行版介绍