标题: PROTEUS模拟串口及仿真教程 [打印本页]

作者: xiongda    时间: 2015-5-26 19:55
标题: PROTEUS模拟串口及仿真教程

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' 等都是单片机送回来的信息。

图中单片机使用的程序如下:
  1. //======================================
  2. #include <reg52.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar a;
  6. sbit d = P3^7;
  7. //--------------------------------------
  8. say_CR_LF()
  9. {
  10.      SBUF = 13; while (TI == 0); TI = 0;
  11.      SBUF = 10; while (TI == 0); TI = 0;
  12. }
  13. //--------------------------------------
  14. say_yeah()
  15. {
  16.      SBUF = a;    while (TI == 0); TI = 0;
  17.      SBUF = ','; while (TI == 0); TI = 0;
  18.      SBUF = ' '; while (TI == 0); TI = 0;
  19.      SBUF = 'y'; while (TI == 0); TI = 0;
  20.      SBUF = 'e'; while (TI == 0); TI = 0;
  21.      SBUF = 'a'; while (TI == 0); TI = 0;
  22.      SBUF = 'h'; while (TI == 0); TI = 0;
  23.      SBUF = '!'; while (TI == 0); TI = 0;
  24.      say_CR_LF();
  25. }
  26. //--------------------------------------
  27. say_hello()
  28. {
  29.      SBUF = 'H'; while (TI == 0); TI = 0;
  30.      SBUF = 'e'; while (TI == 0); TI = 0;
  31.      SBUF = 'l'; while (TI == 0); TI = 0;
  32.      SBUF = 'l'; while (TI == 0); TI = 0;
  33.      SBUF = 'o'; while (TI == 0); TI = 0;
  34.      SBUF = '!'; while (TI == 0); TI = 0;
  35.      say_CR_LF();
  36. }
  37. //--------------------------------------
  38. void init()
  39. {
  40.      SCON = 0x50;     //设置串口通信方式1, 允许接收
  41.      PCON &= 0x7F;
  42.      TMOD = 0x20;     //设置T1定时方式2
  43.      TH1 = 0xfd;      // 9600bps @ 11.0592MHz
  44.      TL1 = 0xfd;
  45.      TR1 = 1;         //启动T1

  46.      ES = 1;          //开串口中断.
  47.      EA = 1;          //开总中断.
  48.      say_hello();
  49. }
  50. //--------------------------------------
  51. void delay(uint z)
  52. {
  53.      uint x, y;
  54.      for(x = z; x > 0; x--) for(y = 110; y > 0; y--);
  55. }
  56. //--------------------------------------
  57. void main()
  58. {
  59.      init();
  60.      TI = 1;
  61.      a = '4';
  62.      while(1) {
  63.        if(a == '1') {
  64.          d = 0; delay(400);
  65.          d = 1; delay(400);
  66.        }
  67.        else if(a == '2') {
  68.          d = 0; delay(200);
  69.          d = 1; delay(200);
  70.        }
  71.        else if(a == '3') {
  72.          d = 0; delay(100);
  73.          d = 1; delay(100);
  74.        }
  75.        else if(a == '4') {
  76.          d = 1;
  77. }    } }
  78. //--------------------------------------
  79. void ser() interrupt 4
  80. {
  81.      if (TI == 1) TI = 0;
  82.      if (RI == 1) {
  83.        RI = 0;
  84.        P0 = SBUF;
  85.        a = SBUF;           //中间变量.
  86.        say_yeah();
  87. }    }
  88. //======================================
复制代码



作者: 王跃前    时间: 2017-12-23 21:29
好贴没人?感谢楼主
作者: uisakgiuads    时间: 2019-3-23 08:50
楼主,为啥接收的会出现乱码呀???按你这个io口连的呀
作者: yc鲲    时间: 2020-4-12 15:05
谢了帮助很大

作者: 妖刀乱人心    时间: 2020-6-18 14:21
感谢楼主好贴!!




欢迎光临 (http://www.51hei.com:80/bbs/) Powered by Discuz! X3.1