1、利用 COMPIM 组件
在 PROTEUS 软件中,可以找到一个 COMPIM 组件,它的图形、以及默认属性可见下图:

。把 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 机增加一些两两连接的虚拟串行口。 该软件运行起来如下图所示:
在图中可以看到,COM1、COM2 就是“一对连接好虚拟串行口”;PC 机原来就有的实际的串行口,称为物理串行口,为 COM3。
在图中的下部,是 WINODWS 的设备管理器,从中也可以看到新添加的串行口信息。
有了这两两连接的虚拟串行口,就可以在同一台 PC 机上,进行两个软件的全双工串行通信了,并且不需要使用通信电缆。
-------------------
在前面提到的博文中,是利用 Virtual Terminal 调试单片机系统,现在就可以使用 COMPIM 组件和虚拟串口软件来调试了。
仿真调试的画面如下:
图中,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();
- } }
- //======================================
复制代码
|