在前面的博文“利用 PROTEUS 软件调试串口通信最简单实用的方法”中,做而论道介绍了利用 Virtual Terminal(虚拟终端)调试串口通信的方法。
详细内容可见:http://hi.baidu.com/do_sermon/item/06a1304de5619be61281da74。
老版的、已经失效的链接:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/ef2c24cbf555e24bf31fe7ea.html。
但是 Virtual Terminal 有一定的局限性,只是适合于调试使用键盘输入少量数据的情况。如果是需要利用 PC 机器的串行口,和其它的软件进行串行通信,Virtual Terminal 就办不到了。
下面,做而论道将介绍两种另外两种仿真调试串口通信的方法。
1、利用 COMPIM 组件
在 PROTEUS 软件中,可以找到一个 COMPIM 组件,它的图形、以及默认属性可见下图:
图片链接:http://img.bimg.126.net/photo/Wqrw-HOEGCpr7LrqZBjH3w==/4854317448369104989.jpg。
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/album/item/e1d788f5d774199af3d385af.html
把 COMPIM 放在仿真电路图中,当仿真运行起来之后,送到 COMPIM 3 号引脚的串行数据,将会通过 PC 机的 COM1 串行口输出,如果在 PC 机的 COM1 串行口外接一条电缆,可将串行数据送到其它的硬件设备上。
同样道理,其它的硬件设备送到 PC 机的 COM1 的串行数据,也会在 COMPIM 的2号引脚出现,送到仿真电路里面。
COMPIM 组件内部,自带 RS-232-TTL 的电平转换功能,因此不需要再使用电平转换芯片。
利用 COMPIM,就可以用一台 PC 机,仿真带有串行口的单片机系统,通过外接的电缆,和另外一台 PC 机进行全双工的串行通信。十分轻松的就实现了对远程测量、控制系统进行仿真调试。
2、利用 Virtual Serial Port Driver 软件
上述的调试方法,可以说是很完备的了,但是还是必须在两个串行口之间连接一条串行通信电缆。为了省去这条电缆,就应该看看虚拟串口软件。
Virtual Serial Port Driver 软件可以为 PC 机增加一些两两连接的虚拟串行口。
该软件运行起来如下图所示:
图片链接:http://img.bimg.126.net/photo/hrN23e30wVbf36lWver6Uw==/3721380667108704365.jpg。
在图中可以看到,COM1、COM2 就是“一对连接好虚拟串行口”;PC 机原来就有的实际的串行口,称为物理串行口,为 COM3。
在图中的下部,是 WINODWS 的设备管理器,从中也可以看到新添加的串行口信息。
有了这两两连接的虚拟串行口,就可以在同一台 PC 机上,进行两个软件的全双工串行通信了,并且不需要使用通信电缆。
-------------------
在前面提到的博文中,是利用 Virtual Terminal 调试单片机系统,现在就可以使用 COMPIM 组件和虚拟串口软件来调试了。
仿真调试的画面如下:
图片链接:http://img.bimg.126.net/photo/JeV0iEkVL8agytX1JPCLRQ==/5429089350812238456.jpg。
图中,PROTEUS 仿真的单片机系统使用 COM1,“串口调试助手”使用 COM2。
这里用的“串口调试助手”,是 STC 单片机下载软件中带的,使用其它的“串口助手”软件,也是完全可以的。
当通信的双方都运行起来后,在“串口调试助手”发送'1'、'2'...就可以控制单片机的工作,图中的 'Hello!'、'yeah' 等都是单片机送回来的信息。
图中单片机使用的程序如下:
//======================================
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a;
sbit d = P3^7;
//--------------------------------------
say_CR_LF()
{
SBUF = 13; while (TI == 0); TI = 0;
SBUF = 10; while (TI == 0); TI = 0;
}
//--------------------------------------
say_yeah()
{
SBUF = a; while (TI == 0); TI = 0;
SBUF = ','; while (TI == 0); TI = 0;
SBUF = ' '; while (TI == 0); TI = 0;
SBUF = 'y'; while (TI == 0); TI = 0;
SBUF = 'e'; while (TI == 0); TI = 0;
SBUF = 'a'; while (TI == 0); TI = 0;
SBUF = 'h'; while (TI == 0); TI = 0;
SBUF = '!'; while (TI == 0); TI = 0;
say_CR_LF();
}
//--------------------------------------
say_hello()
{
SBUF = 'H'; while (TI == 0); TI = 0;
SBUF = 'e'; while (TI == 0); TI = 0;
SBUF = 'l'; while (TI == 0); TI = 0;
SBUF = 'l'; while (TI == 0); TI = 0;
SBUF = 'o'; while (TI == 0); TI = 0;
SBUF = '!'; while (TI == 0); TI = 0;
say_CR_LF();
}
//--------------------------------------
void init()
{
SCON = 0x50; //设置串口通信方式1, 允许接收
PCON &= 0x7F;
TMOD = 0x20; //设置T1定时方式2
TH1 = 0xfd; // 9600bps @ 11.0592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断.
EA = 1; //开总中断.
say_hello();
}
//--------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
}
//--------------------------------------
void main()
{
init();
TI = 1;
a = '4';
while(1) {
if(a == '1') {
d = 0; delay(400);
d = 1; delay(400);
}
else if(a == '2') {
d = 0; delay(200);
d = 1; delay(200);
}
else if(a == '3') {
d = 0; delay(100);
d = 1; delay(100);
}
else if(a == '4') {
d = 1;
} } }
//--------------------------------------
void ser() interrupt 4
{
if (TI == 1) TI = 0;
if (RI == 1) {
RI = 0;
P0 = SBUF;
a = SBUF; //中间变量.
say_yeah();
} }
//======================================