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

圖1 串口連線(xiàn)示意圖
例如:
ASSIGN COM1SOUT
將計算機的串口1綁定到單片機的串口(針對只有一個(gè)串口的單片機)。
ASSIGN COM2S0OUT
將計算機的串口2綁定到單片機的串口0(針對有多個(gè)串口的單片機,注意串口號的位置)。
需要注意的是,參數的括號是不能省略的,而outreg則是沒(méi)有括號的。
2.2 MODE命令
設置被綁定計算機串口的參數?;臼褂梅绞綖椋?/p>
MODE COMx baudrate, parity, databits, stopbits
其中: COMx(x = 1,2,…)代表計算機的串口號;baudrate代表串口的波特率;parity代表校驗方式;databits代表數據位長(cháng)度;stopbits代表停止位長(cháng)度。
例如:
MODE COM1 9600, n, 8, 1
設置串口1。波特率為9 600,無(wú)校驗位,8位數據,1位停止位。
MODE COM2 19200, 1, 8, 1
設置串口2。波特率為19 200,奇校驗,8位數據,1位停止位。
使用以上兩個(gè)命令,就能夠將計算機的串口模擬成單片機的串口了。在進(jìn)行軟件仿真時(shí),所有發(fā)送到被綁定的計算機串口上的數據都會(huì )轉發(fā)到Keil模擬的單片機串口上,用戶(hù)程序可以通過(guò)中斷處理程序或查詢(xún)方式接收到這些數據;同樣,單片機程序中發(fā)送到單片機串口上的數據也會(huì )通過(guò)被綁定的計算機串口發(fā)送出來(lái),可以被其他軟件所接收。利用這個(gè)特點(diǎn),就可以方便地仿真、調試單片機的串口部分程序。要注意的是,這兩個(gè)命令需要一起使用。

2.3 仿真步驟
首先,用串口線(xiàn)將計算機的兩個(gè)串口連接起來(lái)(或者是兩臺計算機上的兩個(gè)串口)。這兩個(gè)串口一個(gè)用來(lái)模擬單片機串口,另一個(gè)給調試程序使用。這個(gè)由用戶(hù)自己分配,沒(méi)有特殊要求。
其次,編寫(xiě)好用戶(hù)程序,并編譯通過(guò)。
然后,設置工程文件(Project)的相關(guān)參數,如圖2和圖3所示。主要是選擇軟件仿真模式(Use Simulator)以及晶振參數。

圖2 仿真參數設置
為了不必每次進(jìn)入仿真狀態(tài)后,都需要輸入串口參數設置命令,可以建立一個(gè)初始化文件。初始化文件是一個(gè)普通的文本文件,內容就是仿真時(shí)需要的命令,按照順序一行輸入一條。如圖2所示,建立了一個(gè)debug.ini的初始化文件。這樣,當每次進(jìn)入仿真調試狀態(tài)時(shí),Keil就會(huì )自動(dòng)載入 debug.ini的內容進(jìn)行初始化。
為了正確仿真串口,在軟件仿真調試時(shí),在用戶(hù)的Keil工程文件的屬性中,還需要設置實(shí)際使用的晶振頻率。這個(gè)參數非常重要,直接影響通信的波特率,可以按照實(shí)際使用的參數進(jìn)行設置。要注意,這個(gè)參數的單位是MHz。
設置好參數后,就可以進(jìn)行仿真了。單擊工具欄的圖標按此在新窗口瀏覽圖片進(jìn)入Debug(仿真調試)狀態(tài),在Output window窗口中的command文本框(一般是在左下角)中輸入上面介紹的命令。例如,將PC機的串口1設置為單片機的串口:
mode com1 9600,0,8,1
assign com1 Sout
然后設置斷點(diǎn),一般是在關(guān)鍵地方或與串口相關(guān)聯(lián)的地方設置。再單擊圖標運行(Run)用戶(hù)程序,使用戶(hù)程序運轉起來(lái)(不然是接收不到串口數據的)。這時(shí)再使用串口調試軟件或用戶(hù)調試軟件,發(fā)送通信命令或者數據包,看用戶(hù)程序是否進(jìn)入斷點(diǎn),以及相關(guān)的變量是否正確。還可以有意發(fā)送帶有錯誤數據的數據包,以觀(guān)察用戶(hù)程序的異常處理部分是否正常。一旦發(fā)現程序中的錯誤,可以馬上停止仿真調試,立即修改代碼,然后再次重復上面的步驟進(jìn)行仿真。因為不需要與用戶(hù)目標板聯(lián)機,也不用下載代碼到用戶(hù)板上,所以速度非常高。以上這些步驟和使用硬件仿真器的基本一樣,只不過(guò)現在使用的是軟件仿真。
需要注意的是:仿真時(shí)單片機串口實(shí)際的波特率由MODE命令來(lái)指定,單片機程序中的TMOD、SCON等參數是不影響串口仿真狀態(tài)的(也就是說(shuō)這些參數不影響仿真的波特率,即使它們是錯誤的)。但是中斷的使能位(如ES、EA等)還是起作用的,如果ES或EA被禁止,那么就不會(huì )進(jìn)入串口中斷。
因為這種方法是利用計算機的串口來(lái)仿真單片機的串口,而仿真是通過(guò)Keil軟件來(lái)轉換串口上的數據,不是直接轉發(fā)數據的,所以在實(shí)際仿真時(shí),處理速度會(huì )比實(shí)際單片機運行時(shí)稍微低一點(diǎn)。比方說(shuō)仿真狀態(tài)時(shí)1 s只能發(fā)送/接收10個(gè)數據幀,但在單片機硬件上運行時(shí)可能1 s就可以接收/發(fā)送50個(gè)數據幀。這與使用的計算機的速度有關(guān),但對仿真來(lái)說(shuō),是沒(méi)有任何影響的。
對于多串口的單片機,從理論上來(lái)說(shuō),可以一次綁定多個(gè)串口,只要計算機有足夠多的串口?;旧?,使用這種方法需要占用計算機的串口數量是單片機綁定串口的2倍。一個(gè)串口被Keil占用,用來(lái)模擬單片機的串口;另外一個(gè)串口被計算機占用,用來(lái)給單片機的串口收發(fā)數據。
3 小結
這里介紹的方法對C51和匯編語(yǔ)言都是適合的。它最大的好處就是簡(jiǎn)單、方便,容易使用,不需要使用任何電路,也沒(méi)有特殊的要求;甚至可以在硬件電路制作好之前就將串口部分的程序編寫(xiě)、調試完畢。筆者使用這種方法已經(jīng)很長(cháng)時(shí)間了,事實(shí)證明這種方法確實(shí)非常有效。其實(shí)對于51單片機,Keil的仿真功能實(shí)在是太強大了,只要充分掌握其特點(diǎn),能夠熟練利用它,就可以解決工作中的大部分問(wèn)題。很多工作都可以使用軟件仿真來(lái)完成,根本無(wú)需任何硬件仿真器;只有一些新的外部器件的時(shí)序、接口的調試才有可能需要用到硬件仿真器。目前介紹Keil軟件仿真這方面的參考書(shū)籍很少,有些講的還是老版本的用法,不過(guò)沒(méi)有關(guān)系,Keil的幫助文件寫(xiě)得很詳細、很清楚,只要認真看明白就會(huì )使用了。使用熟練后,就會(huì )發(fā)現Keil的功能相當強。
對于串口編程,51單片機有Keil這個(gè)功能強大的開(kāi)發(fā)軟件,給我們帶來(lái)了極大的便利;而在其他單片機軟件的開(kāi)發(fā)中,目前還沒(méi)有這么強大的開(kāi)發(fā)工具和方便的調試手段。這里有個(gè)變通的辦法,就是可以先在Keil中編寫(xiě)并調試好串口程序,然后將程序移植到其他單片機平臺中(筆者在PIC18單片機開(kāi)發(fā)中就使用了這種方法,收到了很好的效果。當然這是指在使用C語(yǔ)言開(kāi)發(fā)單片機程序時(shí),匯編語(yǔ)言是沒(méi)有可移植性的)。至于如何能夠減小程序移植的工作量,使得程序具有更好的通用性,以最小的代價(jià)就可以平滑地移植到其他單片機平臺上,也是一個(gè)非常值得探討的問(wèn)題。
評論