1、利用 COMPIM 組件
在 PROTEUS 軟件中,可以找到一個 COMPIM 組件,它的圖形、以及默認(rèn)屬性可見下圖:

。把 COMPIM 放在仿真電路圖中,當(dāng)仿真運行起來之后,送到 COMPIM 3 號引腳的串行數(shù)據(jù),將會通過 PC 機(jī)的 COM1 串行口輸出,如果在 PC 機(jī)的 COM1 串行口外接一條電纜,可將串行數(shù)據(jù)送到其它的硬件設(shè)備上。
同樣道理,其它的硬件設(shè)備送到 PC 機(jī)的 COM1 的串行數(shù)據(jù),也會在 COMPIM 的2號引腳出現(xiàn),送到仿真電路里面。
COMPIM 組件內(nèi)部,自帶 RS-232-TTL 的電平轉(zhuǎn)換功能,因此不需要再使用電平轉(zhuǎn)換芯片。
利用 COMPIM,就可以用一臺 PC 機(jī),仿真帶有串行口的單片機(jī)系統(tǒng),通過外接的電纜,和另外一臺 PC 機(jī)進(jìn)行全雙工的串行通信。十分輕松的就實現(xiàn)了對遠(yuǎn)程測量、控制系統(tǒng)進(jìn)行仿真調(diào)試。
2、利用 Virtual Serial Port Driver 軟件
上述的調(diào)試方法,可以說是很完備的了,但是還是必須在兩個串行口之間連接一條串行通信電纜。為了省去這條電纜,就應(yīng)該看看虛擬串口軟件。
Virtual Serial Port Driver 軟件可以為 PC 機(jī)增加一些兩兩連接的虛擬串行口。 該軟件運行起來如下圖所示:
在圖中可以看到,COM1、COM2 就是“一對連接好虛擬串行口”;PC 機(jī)原來就有的實際的串行口,稱為物理串行口,為 COM3。
在圖中的下部,是 WINODWS 的設(shè)備管理器,從中也可以看到新添加的串行口信息。
有了這兩兩連接的虛擬串行口,就可以在同一臺 PC 機(jī)上,進(jìn)行兩個軟件的全雙工串行通信了,并且不需要使用通信電纜。
-------------------
在前面提到的博文中,是利用 Virtual Terminal 調(diào)試單片機(jī)系統(tǒng),現(xiàn)在就可以使用 COMPIM 組件和虛擬串口軟件來調(diào)試了。
仿真調(diào)試的畫面如下:
圖中,PROTEUS 仿真的單片機(jī)系統(tǒng)使用 COM1,“串口調(diào)試助手”使用 COM2。
這里用的“串口調(diào)試助手”,是 STC 單片機(jī)下載軟件中帶的,使用其它的“串口助手”軟件,也是完全可以的。
當(dāng)通信的雙方都運行起來后,在“串口調(diào)試助手”發(fā)送'1'、'2'...就可以控制單片機(jī)的工作,圖中的 'Hello!'、'yeah' 等都是單片機(jī)送回來的信息。
圖中單片機(jī)使用的程序如下:
- //======================================
- #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; //設(shè)置串口通信方式1, 允許接收
- PCON &= 0x7F;
- TMOD = 0x20; //設(shè)置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();
- } }
- //======================================
復(fù)制代碼
|