在單片機(jī)系統(tǒng)中,串口(UART,通用異步收發(fā)接口)是一個(gè)非常重要的組成部分。通常使用單片機(jī)串口通過(guò)RS232/RS485電平轉(zhuǎn)換芯片與上位機(jī)連接,以進(jìn)行上位機(jī)與下位機(jī)的數(shù)據(jù)交換、參數(shù)設(shè)置、組成網(wǎng)絡(luò)以及各種外部設(shè)備的連接等。RS232/RS485串行接口總線具有成本低、簡(jiǎn)單可靠、容易使用等特點(diǎn),加上其歷史悠久,所以目前應(yīng)用仍然非常廣泛;特別對(duì)于數(shù)據(jù)量不是很大的場(chǎng)合,串口通信仍然是很好的選擇,有著廣闊的使用前景。
在單片機(jī)編程中,串口占了很重要的地位。傳統(tǒng)方式串口程序的調(diào)試,往往是利用專用的單片機(jī)硬件仿真器。在編寫好程序后,利用仿真器來(lái)設(shè)置斷點(diǎn),觀察變量和程序的流程,逐步對(duì)程序進(jìn)行調(diào)試,修正錯(cuò)誤。使用硬件仿真器的確是很有效的方法,但是也有一些缺點(diǎn):
很多仿真器不能做到完全硬件仿真,因而會(huì)造成仿真時(shí)正常,而實(shí)際運(yùn)行時(shí)出現(xiàn)錯(cuò)誤的情況;也有仿真不能通過(guò),但是實(shí)際運(yùn)行正常的情況.對(duì)于一些較新的芯片或者是表面貼裝的芯片,要么沒(méi)有合適的仿真器或仿真頭;要么就是硬件仿真器非常昂貴,且不容易買到。有時(shí)由于設(shè)備內(nèi)部結(jié)構(gòu)空間的限制,仿真頭不方便接入。有的仿真器屬于簡(jiǎn)單的在線仿真型,仿真時(shí)有很多限制。例如速度不高,實(shí)時(shí)性或穩(wěn)定性不好,對(duì)斷點(diǎn)有限制等,造成仿真起來(lái)不太方便。
1 調(diào)試前的準(zhǔn)備工作
下面介紹一種利用Keil的軟件仿真功能來(lái)實(shí)現(xiàn)51單片機(jī)串口調(diào)試用戶程序的方法。使用這種方法,無(wú)需任何硬件仿真器,甚至都不需要用戶電路板。所需的只是:
、 硬件。1臺(tái)普通計(jì)算機(jī)(需要帶有2個(gè)標(biāo)準(zhǔn)串口)和1根串口線(兩頭都是母頭,連線關(guān)系如圖1所示)。
、 串口軟件可以是自己編寫的專用調(diào)試或上下位機(jī)通信軟件,也可以是通用的串口軟件(如串口助手、串口調(diào)試等),主要用來(lái)收發(fā)數(shù)據(jù)。如果沒(méi)有合適的串口調(diào)試軟件,則可使用筆者編寫的一個(gè)免費(fèi)的串口小工具TurboCom。除了與其他軟件一樣的數(shù)據(jù)收發(fā)功能外,它還有定時(shí)輪流發(fā)送自定義數(shù)據(jù)幀和自動(dòng)應(yīng)答(接收到指定數(shù)據(jù)幀后,自動(dòng)返回相應(yīng)的數(shù)據(jù)幀)這兩個(gè)很有用的功能,特別適合于老化測(cè)試。這個(gè)小工具可以從http://shaoziyang.bloger.com.cn下載。
2 基本調(diào)試命令介紹
這個(gè)串口調(diào)試方法主要是利用了Keil強(qiáng)大的軟件仿真功能。在新版本(高于6.0)的Keil軟件中,增強(qiáng)了軟件的仿真能力,可以利用軟件仿真更多的單片機(jī)功能。在這些功能中,其中有一個(gè)很重要的功能就是利用計(jì)算機(jī)的串口來(lái)模擬單片機(jī)的串口(這不同于很多軟件在仿真時(shí)使用的激勵(lì)文件方式,可以直接與其他串口進(jìn)行通信,更加方便、靈活)。首先要介紹仿真時(shí)需要使用的兩個(gè)命令:ASSIGN和MODE。
2.1 ASSIGN命令
將單片機(jī)的串口綁定到計(jì)算機(jī)的串口;臼褂梅绞綖椋
ASSIGN channeloutreg
其中: channel代表計(jì)算機(jī)的串口,可以是COM1、COM2、COM3或COM4;而inreg和outreg代表單片機(jī)的串口。對(duì)于只有一個(gè)串口的普通單片機(jī),即SIN和SOUT;對(duì)于有兩個(gè)或者多個(gè)串口的單片機(jī),即SnIN和SnOUT(n=0,1,…即單片機(jī)的串口號(hào))。

圖1 串口連線示意圖
ASSIGN COM1SOUT
將計(jì)算機(jī)的串口1綁定到單片機(jī)的串口(針對(duì)只有一個(gè)串口的單片機(jī))。
ASSIGN COM2S0OUT
將計(jì)算機(jī)的串口2綁定到單片機(jī)的串口0(針對(duì)有多個(gè)串口的單片機(jī),注意串口號(hào)的位置)。
需要注意的是,參數(shù)的括號(hào)是不能省略的,而outreg則是沒(méi)有括號(hào)的。
2.2 MODE命令
設(shè)置被綁定計(jì)算機(jī)串口的參數(shù);臼褂梅绞綖椋
MODE COMx baudrate, parity, databits, stopbits
其中: COMx(x = 1,2,…)代表計(jì)算機(jī)的串口號(hào);baudrate代表串口的波特率;parity代表校驗(yàn)方式;databits代表數(shù)據(jù)位長(zhǎng)度;stopbits代表停止位長(zhǎng)度。
例如:
MODE COM1 9600, n, 8, 1
設(shè)置串口1。波特率為9 600,無(wú)校驗(yàn)位,8位數(shù)據(jù),1位停止位。
MODE COM2 19200, 1, 8, 1
設(shè)置串口2。波特率為19 200,奇校驗(yàn),8位數(shù)據(jù),1位停止位。
使用以上兩個(gè)命令,就能夠?qū)⒂?jì)算機(jī)的串口模擬成單片機(jī)的串口了。在進(jìn)行軟件仿真時(shí),所有發(fā)送到被綁定的計(jì)算機(jī)串口上的數(shù)據(jù)都會(huì)轉(zhuǎn)發(fā)到Keil模擬的單片機(jī)串口上,用戶程序可以通過(guò)中斷處理程序或查詢方式接收到這些數(shù)據(jù);同樣,單片機(jī)程序中發(fā)送到單片機(jī)串口上的數(shù)據(jù)也會(huì)通過(guò)被綁定的計(jì)算機(jī)串口發(fā)送出來(lái),可以被其他軟件所接收。利用這個(gè)特點(diǎn),就可以方便地仿真、調(diào)試單片機(jī)的串口部分程序。要注意的是,這兩個(gè)命令需要一起使用。
2.3 仿真步驟
首先,用串口線將計(jì)算機(jī)的兩個(gè)串口連接起來(lái)(或者是兩臺(tái)計(jì)算機(jī)上的兩個(gè)串口)。這兩個(gè)串口一個(gè)用來(lái)模擬單片機(jī)串口,另一個(gè)給調(diào)試程序使用。這個(gè)由用戶自己分配,沒(méi)有特殊要求。
其次,編寫好用戶程序,并編譯通過(guò)。
然后,設(shè)置工程文件(Project)的相關(guān)參數(shù),如圖2和圖3所示。主要是選擇軟件仿真模式(Use Simulator)以及晶振參數(shù)。

圖2 仿真參數(shù)設(shè)置





