舒 劍 (集美大學(xué)信息工程學(xué)院,福建 廈門361021)
單片機(jī)應(yīng)用技術(shù)是高等院校電子信息類專業(yè)的一門重要課程,隨著微控制器技術(shù)廣泛深入地應(yīng)用于工農(nóng)業(yè)生產(chǎn)和日常消費(fèi)電子領(lǐng)域,該課程的重要性越顯突出。該課程學(xué)習(xí)的目的是為了工程應(yīng)用,教學(xué)必須以此目的為出發(fā)點(diǎn)??集美大學(xué)校級(jí)精品課程建設(shè)立項(xiàng) (C14615)。。這決定了這門課程在學(xué)習(xí)過(guò)程中的2個(gè)重要特點(diǎn),一是以基本原理和設(shè)計(jì)思想為主導(dǎo)的理論學(xué)習(xí),二是要有培養(yǎng)實(shí)踐動(dòng)手能力的強(qiáng)烈意識(shí)。兩者相互相成,實(shí)驗(yàn)教學(xué)提供的實(shí)踐機(jī)會(huì)能讓學(xué)生找到 “感覺(jué)”,對(duì)理論的理解將更形象和深刻,而實(shí)踐能力的加強(qiáng)也需要理論作為基礎(chǔ)。
在課堂教學(xué)環(huán)節(jié),考慮到電子信息專業(yè)學(xué)生在第5學(xué)期已學(xué)習(xí)過(guò)微機(jī)原理與接口技術(shù)課程,以8086匯編講授軟件編程部分,且在更早以前學(xué)習(xí)過(guò)計(jì)算機(jī)C語(yǔ)言課程,因此第6學(xué)期的單片機(jī)應(yīng)用技術(shù)可采用C51來(lái)講授MCS-51的軟件編程部分,以充分借助已有基礎(chǔ),更好地?cái)U(kuò)展更高更新的知識(shí)。在實(shí)踐教學(xué)環(huán)節(jié),通行的做法是學(xué)生在實(shí)驗(yàn)之前預(yù)習(xí),也就是根據(jù)書(shū)本理論編寫代碼,實(shí)際是否可行需等到實(shí)驗(yàn)室的實(shí)驗(yàn)箱上驗(yàn)證。這種方式有2個(gè)弊端,一是除了實(shí)驗(yàn)上課時(shí)間外,學(xué)生平時(shí)難得有機(jī)會(huì),尤其是需要在實(shí)驗(yàn)箱上進(jìn)行的硬件實(shí)驗(yàn);二是實(shí)驗(yàn)室采用的實(shí)驗(yàn)硬件平臺(tái)大多是實(shí)驗(yàn)箱,是為了滿足大多數(shù)專業(yè)對(duì)單片機(jī)課程實(shí)驗(yàn)環(huán)節(jié)的需要,但這種成品實(shí)驗(yàn)箱卻限制了學(xué)生對(duì)硬件的了解,無(wú)法真實(shí)參與細(xì)節(jié)設(shè)計(jì),另外實(shí)驗(yàn)項(xiàng)目也基本固定,限制了自主學(xué)習(xí)興趣的發(fā)揮。采用支持全面的Proteus仿真軟件進(jìn)行輔助可在很大程度上彌補(bǔ)上述弊端。
MCS-51單片機(jī)匯編語(yǔ)言與8086匯編語(yǔ)言有許多共通點(diǎn),但也有一些明顯差異,如尋址方式、存儲(chǔ)器訪問(wèn)方式等,這是2種處理器的體系結(jié)構(gòu)差異造成的。在教學(xué)過(guò)程中必須鮮明、重點(diǎn)地提出這些差異,這些差異并不復(fù)雜,也不難,只要交代清楚,完全可達(dá)到滿意的效果,沒(méi)有必要重復(fù)完整講授MCS-51的匯編指令。在教學(xué)上突出MCS-51匯編與8086匯編的差異,然后把主要精力轉(zhuǎn)向C51編程。這樣可充分利用以往學(xué)過(guò)的計(jì)算機(jī)C語(yǔ)言基礎(chǔ),以及微機(jī)原理與接口技術(shù)課程的基礎(chǔ),在單片機(jī)應(yīng)用技術(shù)課程中再上新高度。
Keil C51是Keil Software公司出品的51系列兼容單片機(jī)C語(yǔ)言,與匯編相比,C語(yǔ)言在功能、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì)。Keil uVision3是基于C51的集成開(kāi)發(fā)環(huán)境,支持匯編和C51編程,可編譯生成HEX下載文件。若掛接與目標(biāo)處理器相應(yīng)的硬件仿真器可直接進(jìn)行軟硬件聯(lián)合調(diào)試,若純軟件實(shí)驗(yàn)還可完全不需要硬件而單獨(dú)調(diào)試程序。與匯編語(yǔ)言相比,C51可簡(jiǎn)潔地實(shí)現(xiàn)碼制轉(zhuǎn)換、多字節(jié)四則運(yùn)算、浮點(diǎn)數(shù)運(yùn)算,而這些在8位MCS-51上用匯編語(yǔ)言實(shí)現(xiàn)還需要一定的編程量。C51完全采用C風(fēng)格,面向過(guò)程編程,即利用函數(shù) (子程序)來(lái)規(guī)劃整體軟件,雖然匯編語(yǔ)言編程時(shí)也大量采用子程序,但需謹(jǐn)慎處理現(xiàn)場(chǎng)保護(hù)和參數(shù)傳遞問(wèn)題,遠(yuǎn)不如C函數(shù)調(diào)用方便。
在講授C51編程時(shí),須著重提醒學(xué)生C51與早先學(xué)習(xí)的計(jì)算機(jī)C語(yǔ)言的異同,尤其是它們的差異,防止學(xué)生把兩者混淆。差異主要在以下方面。
1)存儲(chǔ)器模型 用于指定自動(dòng)變量的默認(rèn)位置,C51提供Small Model、Compact Model和Large Model 3種模型。優(yōu)先考慮Small Model,使用片內(nèi)RAM,生成的代碼更簡(jiǎn)潔,若片內(nèi)RAM不夠用可使用Compact Model或Large Model,但同時(shí)要求硬件在CPU外部以總線方式擴(kuò)展RAM作為配合。
2)存儲(chǔ)器類型 由于MCS-51的存儲(chǔ)器有程序存儲(chǔ)器、片內(nèi)低128BRAM、片內(nèi)高128BRAM、外部RAM、片內(nèi)可位尋址單元,因此一個(gè)變量的存儲(chǔ)位置可以位于上述任何一個(gè)之中,對(duì)應(yīng)類型為code、data、idata、xdata、bdata。如以下方法將變量存儲(chǔ)在片內(nèi)低128BRAM中:
char data var1=100;
將字符串存儲(chǔ)在程序存儲(chǔ)器中:
char code text1 []= “This is a string in ROM.”;
將數(shù)組存儲(chǔ)在片外RAM:
unsigned int xdata vec1 [2][3];
3)數(shù)據(jù)類型 MCS-51是8位處理器,因此數(shù)據(jù)類型定義與計(jì)算機(jī)不同,char類型是8位,short和int類型是16位,long和float類型是32位,bit和sbit類型是1位,sfr類型是8位,sfr16是16位??梢?jiàn)后4種是ANSI C所沒(méi)有的。數(shù)據(jù)類型是編程的基礎(chǔ),熟悉它們才能正確表達(dá)數(shù)值并實(shí)施運(yùn)算,避免溢出等錯(cuò)誤結(jié)果。
4)中斷 MCS-51有5個(gè)中斷源6個(gè)中斷標(biāo)志,按優(yōu)先級(jí)從高到低依次為/INT0、T0、/INT1、T1、串行口,對(duì)應(yīng)在C51中的中斷編號(hào)為0~4。如T0的中斷服務(wù)子程序應(yīng)寫為:
當(dāng)CPU發(fā)生T0中斷事件時(shí),硬件自動(dòng)轉(zhuǎn)入哪個(gè)中斷子程序是依靠 “interrupt 1”來(lái)確定的,與函數(shù)名無(wú)關(guān),函數(shù)名可任意。后面的 “using 2”用來(lái)指明函數(shù)跳轉(zhuǎn)時(shí)保護(hù)現(xiàn)場(chǎng)使用4組工作寄存器中的第2組,可用其他組,此部分也可不寫,則C51將中斷程序中用到的寄存器全部壓入堆棧保護(hù)。
5)指針 如變量的存儲(chǔ)位置有多種,指針本身也是變量,需要占用存儲(chǔ)空間。因此需要討論指針存放在哪里,以及它所指向的變量存放在哪里。如下例,指針ptr存放在片內(nèi)低128BRAM,所指向的int變量位于片外RAM:
int xdata* data ptr;
可以看出,這些差異均與MCS-51單片機(jī)體系結(jié)構(gòu)和硬件組成密切相關(guān),因此課堂上講授這部分原理和理論很重要,否則無(wú)法深刻理解C51語(yǔ)言。
采用MCS-51串行口擴(kuò)展16位并行輸出口,顯示2位數(shù)碼值。串行口使用方式0,片外擴(kuò)展一片74HC164移位寄存器芯片。圖1為原理圖[1]。
圖1 MCS-51擴(kuò)展并行口
采用C51編寫程序,為節(jié)省篇幅省略delay()延時(shí)函數(shù)體。
以上C51代碼在Keil uVision3下可直接反編譯匯編代碼,如圖2所示,可見(jiàn)C51生成的代碼緊湊,效率高,不亞于人工編寫的高質(zhì)量匯編代碼。
Proteus ISIS是英國(guó) Labcenter Electronics公司出品的電路分析與仿真軟件。軟件特點(diǎn)如下:①單片機(jī)仿真與SPICE電路仿真相結(jié)合;②支持示波器、信號(hào)發(fā)生器、邏輯分析儀等虛擬儀器,器儀具有理想?yún)?shù)指標(biāo),例如極高輸入阻抗或極低輸出阻抗,這些都盡可能減少了儀器對(duì)測(cè)量結(jié)果的影響[2],支持眾多外部模擬和數(shù)字器件,支持68000、51、PIC、AVR等眾多系列處理器;③自身提供軟件調(diào)試功能,也支持Keil C51等外部編譯和調(diào)試環(huán)境。
圖2 反編譯C51代碼
在模擬和數(shù)字電路設(shè)計(jì)中,常用的仿真軟件如MultiSim可實(shí)現(xiàn)器件和電路整體的仿真分析,但不支持可內(nèi)裝用戶自定義程序的微處理器。而Keil uVision3等仿真軟件可實(shí)現(xiàn)單純的處理器仿真,也就是僅支持對(duì)處理器本身仿真,不支持或極少支持處理器擴(kuò)展外圍電路。
Proteus軟件集中了這兩者的優(yōu)點(diǎn),允許用戶搭建以單片機(jī)為核心的完整的電路系統(tǒng),并進(jìn)行整體硬件仿真和軟件調(diào)試,能真正對(duì)單片機(jī)系統(tǒng)進(jìn)行輔助設(shè)計(jì)。Proteus還支持與Keil聯(lián)合調(diào)試,在聯(lián)調(diào)時(shí),Keil作為軟件調(diào)試界面,Proteus作為硬件仿真和調(diào)試界面。如可以在Keil中單步執(zhí)行程序,在Proteus看到硬件系統(tǒng)的反應(yīng)。
Proteus軟件的這些優(yōu)勢(shì)對(duì)于學(xué)生的學(xué)習(xí)具有積極意義,很好地彌補(bǔ)了前文所述的課程實(shí)踐環(huán)節(jié)的限制。學(xué)生即使離開(kāi)實(shí)驗(yàn)室,脫離實(shí)驗(yàn)箱也可以進(jìn)行完整的系統(tǒng)設(shè)計(jì),而且能通過(guò)仿真看到結(jié)果,這對(duì)學(xué)習(xí)是一個(gè)鼓勵(lì),有助于激勵(lì)和培養(yǎng)興趣。另外,學(xué)生還可以不受成品實(shí)驗(yàn)箱實(shí)驗(yàn)項(xiàng)目相對(duì)固定的限制,可以自由發(fā)揮設(shè)計(jì)靈感。
繼續(xù)前文的例子,將MCS-51串行口擴(kuò)展16位并行輸出用Proteus進(jìn)行仿真。首先在Proteus ISIS中繪制完整電路,如圖3所示。
然后在Keil uVision3中輸入并編譯上文所列C51程序。回到ISIS中,在Source菜單中添加該程序,接下來(lái)就可以運(yùn)行并觀察到仿真結(jié)果。改變段碼的值,可立即在Proteus中看到變化。
在Proteus與Keil聯(lián)合調(diào)試時(shí),Keil的調(diào)試方法全部可用,在Keil調(diào)試程序的同時(shí),在Proteus中可觀察到硬件狀態(tài)的變化。為實(shí)現(xiàn)聯(lián)合調(diào)試,需對(duì)Keil和Proteus軟件做一些設(shè)置[3-4],在此不贅述。
圖3 Proteus中的電路設(shè)計(jì)
C51程序與匯編程序有1個(gè)顯著不同,C51程序語(yǔ)句與最終機(jī)器碼不會(huì)一一對(duì)應(yīng),也不會(huì)固定,相同的語(yǔ)句在不同的設(shè)置下會(huì)得到不同的機(jī)器碼,而匯編語(yǔ)言則不會(huì),它與最終的機(jī)器碼明確對(duì)應(yīng),所以采用匯編語(yǔ)言編程時(shí),用戶直接決定了最終的機(jī)器碼。而采用C51編程時(shí),用戶則必須熟悉編譯器的規(guī)則,以使得編譯器編譯出盡可能簡(jiǎn)潔的機(jī)器碼。因此在C51編程中有一個(gè)代碼優(yōu)化的問(wèn)題。
1)選擇合適的算法 例如將比較慢的順序查找法用較快的二分查找法代替,冒泡排序用快速排序、合并排序或根排序代替。數(shù)組與指針關(guān)系密切,對(duì)大部分編譯器而言使用指針比使用數(shù)組生成的代碼更簡(jiǎn)潔,但Keil相反,使用數(shù)組比使用指針生成的代碼更簡(jiǎn)潔。
2)使用小數(shù)據(jù)類型 MCS-51是8位處理器,應(yīng)盡可能使用8位變量,如char,盡量避免使用浮點(diǎn)數(shù)據(jù)類型。
3)使用自增自減語(yǔ)句 用a+=1或a-=1時(shí),編譯器通常能夠生成INC或DEC指令,而使用a=a+1或a=a-1時(shí),C編譯器通常會(huì)生成2~3個(gè)字節(jié)的指令。
4)避免復(fù)雜運(yùn)算 這里所說(shuō)的復(fù)雜運(yùn)算是對(duì)MCS-51而言的。MCS-51有加減乘除指令,因此應(yīng)盡量將復(fù)雜運(yùn)算變換為四則運(yùn)算或邏輯運(yùn)算。例如,使用乘法代替平方和立方函數(shù),用移位實(shí)現(xiàn)乘除運(yùn)算 (如a=a*17可改用a= (a?4)+a實(shí)現(xiàn))。
5)善于運(yùn)用查表 如浮點(diǎn)數(shù)的乘除和開(kāi)方、數(shù)學(xué)模型插補(bǔ)運(yùn)算等復(fù)雜運(yùn)算,應(yīng)盡量使用查表解決,這是對(duì)MCS-51的揚(yáng)長(zhǎng)避短,MCS-51的復(fù)雜運(yùn)算會(huì)耗費(fèi)大量CPU時(shí)間。
[1]張毅剛 .單片機(jī)原理及應(yīng)用 [M].北京:高等教育出版社,2004:224.
[2]周潤(rùn)景,張麗娜 .基于PROTEUS的電路及單片機(jī)系統(tǒng)設(shè)計(jì)與仿真 [M].北京:北京航空航天大學(xué)出版社,2006:182-183.
[3]孫凌燕,黃允千.Proteus與Keil軟件的整合在單片機(jī)實(shí)驗(yàn)開(kāi)發(fā)中的應(yīng)用 [J].實(shí)驗(yàn)室研究與探索,2008(4):59-61.
[4]伍馮潔,謝陳躍,謝斌.Proteus與Keil在單片機(jī)開(kāi)放性實(shí)驗(yàn)中的應(yīng)用 [J].電子測(cè)量技術(shù),2008(6):100-103.