摘要:本文總結(jié)了我院在單片機(jī)C語(yǔ)言教學(xué)中的探索,包括在教學(xué)中精選了“變量定義、函數(shù)定義、混合編程”為C語(yǔ)言主要內(nèi)容,以“變量定義、專用指針定義、C51匯編函數(shù)格式”為重點(diǎn)展開教學(xué),并且緊密結(jié)合單片機(jī)概念和應(yīng)用,編寫了相關(guān)的習(xí)題和實(shí)驗(yàn)題目。實(shí)踐表明,講授C語(yǔ)言明顯提高了學(xué)生的編程能力和教學(xué)效果。
關(guān)鍵詞:單片機(jī)教學(xué);C語(yǔ)言;內(nèi)容選取;講授方法;習(xí)題和實(shí)驗(yàn)
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:B
1引言
近幾年隨著單片機(jī)和Keil C等開發(fā)工具的發(fā)展,我們教師在單片機(jī)項(xiàng)目開發(fā)中都采用C語(yǔ)言編寫程序。與匯編語(yǔ)言相比,C語(yǔ)言有諸多優(yōu)勢(shì),為了把單片機(jī)C語(yǔ)言編程方法和經(jīng)驗(yàn)傳授給學(xué)生,作者結(jié)合多年來(lái)講授單片機(jī)和C語(yǔ)言的教學(xué)心得,以及從事單片機(jī)項(xiàng)目開發(fā)的經(jīng)驗(yàn),將單片機(jī)C語(yǔ)言部分寫成小冊(cè)子,補(bǔ)充到單片機(jī)教學(xué)中。后來(lái)組織教師動(dòng)手編寫了C語(yǔ)言版的“單片機(jī)原理及應(yīng)用”講義,講義經(jīng)過試用修改后,由中國(guó)水利水電出版社出版發(fā)行,其書名為《單片機(jī)原理及應(yīng)用(C語(yǔ)言版)》。在教學(xué)中,我們精選C語(yǔ)言的內(nèi)容,并對(duì)一些內(nèi)容的講解方法進(jìn)行了深入地研究,把C語(yǔ)言的一些概念從開始就引入到單片機(jī)中,以C語(yǔ)言為主來(lái)講授MCS-51單片機(jī),并且舉例和編程都用C語(yǔ)言,試用效果比用匯編語(yǔ)言好,學(xué)生更容易掌握用C語(yǔ)言編寫單片機(jī)程序。
C語(yǔ)言引入單片機(jī)教學(xué)中是最近幾年的事情,因此其內(nèi)容的選取、一些概念的講授方法、與之相適應(yīng)的習(xí)題和實(shí)驗(yàn)等,都不夠完善成熟,為了推進(jìn)單片機(jī)C語(yǔ)言教學(xué),提高單片機(jī)的教學(xué)水平,將我們?cè)诮虒W(xué)中的試驗(yàn)和探索進(jìn)行總結(jié),形成文字,與同行交流和探討。
2單片機(jī)C語(yǔ)言內(nèi)容的選取
由于國(guó)內(nèi)把C語(yǔ)言引入單片機(jī)教學(xué)中的時(shí)間比較短,單片機(jī)教材中C語(yǔ)言內(nèi)容差別很大。欲搞好單片機(jī)C語(yǔ)言教學(xué),首先需要研究在單片機(jī)教學(xué)中C語(yǔ)言的內(nèi)容,進(jìn)行恰當(dāng)?shù)剡x取,從而用較小的篇幅、較少的學(xué)時(shí)數(shù),使學(xué)生較輕松地學(xué)習(xí)和掌握單片機(jī)C語(yǔ)言的內(nèi)容,實(shí)現(xiàn)用C語(yǔ)言熟練編寫單片機(jī)程序。
2.1單片機(jī)開發(fā)所需要的C語(yǔ)言知識(shí)
從事單片機(jī)程序開發(fā)所需要的C語(yǔ)言內(nèi)容,與PC機(jī)C語(yǔ)言的內(nèi)容基本相同,其內(nèi)容有:基本概念(數(shù)據(jù)類型、變量和常量、運(yùn)算符、表達(dá)式),程序控制語(yǔ)句,程序基本結(jié)構(gòu),數(shù)組,函數(shù),指針,位操作,結(jié)構(gòu)體與共用體,編譯預(yù)處理等,只是少了文件操作的內(nèi)容。這些只是二者相同的方面,對(duì)于單片機(jī)來(lái)說(shuō),還需要結(jié)合自身的特殊性在數(shù)據(jù)類型、變量定義、數(shù)組、函數(shù)、指針、位,結(jié)構(gòu)體與共用體等方面做一些補(bǔ)充和改變。
2.2單片機(jī)C語(yǔ)言內(nèi)容的選取
我們先瀏覽一下當(dāng)前國(guó)內(nèi)單片機(jī)書中C語(yǔ)言內(nèi)容的選取,主要有兩種情況:一種是在單片機(jī)書中安排了C語(yǔ)言的全部?jī)?nèi)容,并且C語(yǔ)言的內(nèi)容放在全書的前面,各個(gè)內(nèi)容分章編寫,有的內(nèi)容比較詳細(xì),有的不是很詳細(xì),這樣的安排是認(rèn)為讀者沒有C語(yǔ)言的基礎(chǔ),其內(nèi)容和講解方法與單片機(jī)結(jié)合較少,并且習(xí)題基本上不涉及單片機(jī)的概念,學(xué)習(xí)效果不會(huì)太好。第二種情況是單片機(jī)書中安排了C語(yǔ)言的大部分內(nèi)容,但各個(gè)內(nèi)容編寫在一章中,安排的位置有的是放在“指令系統(tǒng)和匯編程序設(shè)計(jì)”后面,有的是放在書的最后,其內(nèi)容有做復(fù)習(xí)的意思,要求讀者有一定C語(yǔ)言的基礎(chǔ),有的書與單片機(jī)結(jié)合得較好,有的結(jié)合得不好,更像一般的C語(yǔ)言內(nèi)容。
2.3我們的單片機(jī)C語(yǔ)言內(nèi)容
我們精選的單片機(jī)C語(yǔ)言內(nèi)容可以用一句話概括:變量(包括一般變量、數(shù)組、結(jié)構(gòu)體、位變量、指針、特殊功能寄存器)定義、函數(shù)定義和混合編程?,F(xiàn)在工科大部分專業(yè)都開設(shè)了C語(yǔ)言課程,特別是學(xué)單片機(jī)的專業(yè),無(wú)一不開C語(yǔ)言課程,學(xué)生都具有C語(yǔ)言的基礎(chǔ),因此在單片機(jī)教學(xué)中不用重復(fù)講授學(xué)習(xí)過的C語(yǔ)言內(nèi)容,只需要講單片機(jī)中所涉及的新內(nèi)容以及與C語(yǔ)言不同的即可。具體我們?cè)趩纹瑱C(jī)課程中講授的C語(yǔ)言有以下內(nèi)容。
(1)C51數(shù)據(jù)類型及存儲(chǔ):增加了“bit和sbit位類型”、“sfr和sfr16特殊功能寄存器”兩種新的數(shù)據(jù)類型,描述了各種數(shù)據(jù)在單片機(jī)中的存儲(chǔ)方式。
(2)C51變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域:對(duì)變量、數(shù)組、結(jié)構(gòu)體等的定義,增加了“存儲(chǔ)區(qū)”屬性,強(qiáng)調(diào)所定義的對(duì)象具體存放的區(qū)域,并且對(duì)“存儲(chǔ)類型”屬性也作了要求。在內(nèi)容處理上以基本變量(字符型、整型、浮點(diǎn)型)定義為例進(jìn)行講解。
(3)C51位變量的定義,特殊功能寄存器的定義,明確給出具體的定義形式。
(4)C51指針的定義:講指針的定義及應(yīng)用,在單片機(jī)中用兩種指針訪問存儲(chǔ)器,一種是通用指針,另一種是專用指針,主要是講專用指針,定義時(shí)不僅要清楚其存儲(chǔ)區(qū)域,更要明確其指向區(qū)域。單片機(jī)中指針的使用更加自由和方便。
(5)C51的輸入/輸出:特別安排了格式輸入函數(shù)“scanf”和格式輸出函數(shù)“printf”內(nèi)容,在單片機(jī)中這兩個(gè)函數(shù)是對(duì)應(yīng)串行口的輸入和輸出,并不是PC機(jī)C語(yǔ)言的從鍵盤輸入和從顯示器輸出。
(6)C51函數(shù)的定義:講函數(shù)和中斷函數(shù)的定義,特別是中斷函數(shù),必須要明確對(duì)應(yīng)的中斷源,強(qiáng)調(diào)既不傳遞參數(shù)也不返回值。
(7)C51與匯編語(yǔ)言混合編程:講解了C51匯編函數(shù)的規(guī)則、格式和混合編程,該內(nèi)容為學(xué)生將來(lái)從事單片機(jī)開發(fā)進(jìn)行混合編程提供方法和實(shí)例。
(8)C51集成開發(fā)軟件Keil C簡(jiǎn)介:介紹了單片機(jī)集成開發(fā)軟件μVision2,使學(xué)生盡快掌握單片機(jī)C語(yǔ)言程序開發(fā)軟件。
從上面這些內(nèi)容可以看出,前6個(gè)內(nèi)容是必須要學(xué)習(xí)的,并且都是一些零碎的內(nèi)容,僅涉及了基本概念(數(shù)據(jù)類型、變量定義)、指針概念、和函數(shù)定義格式等幾個(gè)方面,寫成講義僅有二十來(lái)頁(yè)、三萬(wàn)字左右??梢娬嬲c單片機(jī)密切相關(guān)的C語(yǔ)言內(nèi)容并不多,除了混合編程之外,對(duì)于學(xué)過C語(yǔ)言的學(xué)生來(lái)說(shuō),都非常容易理解和掌握,需要的學(xué)時(shí)數(shù)也較少,而混合編程不是基本內(nèi)容,在實(shí)際教學(xué)中,我們也僅是簡(jiǎn)單地講一下,不做要求。
3單片機(jī)C語(yǔ)言的講解方法
在內(nèi)容的講解中,為了達(dá)到使學(xué)生容易理解、掌握和應(yīng)用單片機(jī)C語(yǔ)言的目的,我們從三個(gè)方面努力:一是盡可能地做到概念明確、清晰、準(zhǔn)確;二是緊密結(jié)合單片機(jī)實(shí)際多舉例子;三是講一些應(yīng)用中的體會(huì),如應(yīng)該注意的問題、容易出錯(cuò)的地方等。在教學(xué)中,以變量定義、專用指針定義、C51匯編語(yǔ)言函數(shù)格式三個(gè)內(nèi)容為重點(diǎn)。下面通過對(duì)兩個(gè)重點(diǎn)內(nèi)容的講解情況,說(shuō)明在教學(xué)中是怎樣做到“概念明確、清晰、準(zhǔn)確”的,其他方面不一一贅述,可以參閱教材。
3.1關(guān)于變量的定義
我們首先明確給出在單片機(jī)C語(yǔ)言變量定義的具體形式。在不少PC機(jī)C語(yǔ)言教材中,講變量的定義時(shí)都沒有明確給出具體形式,在單片機(jī)書中大多數(shù)也是如此,在PC機(jī)C語(yǔ)言中通過教師舉例和書上例子,學(xué)生就能夠輕松學(xué)會(huì)定義變量,但是在單片機(jī)中就大不一樣了。用C語(yǔ)言編寫單片機(jī)程序遇到最多的問題就是變量的定義,所以明確給出變量的定義形式是非常重要的。我們給出的變量定義的形式為:
[存儲(chǔ)類型] 數(shù)據(jù)類型[存儲(chǔ)區(qū)]變量名[=初值] (1)
該定義式明確地提出了單片機(jī)中C語(yǔ)言變量有4種屬性,方括號(hào)中的內(nèi)容可以缺省?!按鎯?chǔ)類型”這個(gè)屬性我們?nèi)匝赜肞C機(jī)ANSI C的說(shuō)法,盡量不改變?cè)瓉?lái)的含義,“存儲(chǔ)類型”有4種:動(dòng)態(tài)存儲(chǔ)(auto)、靜態(tài)存儲(chǔ)(static)、全局存儲(chǔ)(extern)和寄存器存儲(chǔ)(register),缺省時(shí)為動(dòng)態(tài)存儲(chǔ)。
與PC機(jī)C語(yǔ)言變量定義的形式比較,多了一個(gè)“存儲(chǔ)區(qū)”屬性,這個(gè)新的屬性極其重要,該屬性就是要指明將變量存儲(chǔ)在什么地方,變量的“存儲(chǔ)區(qū)”有:data、bdata、idata、pdata、xdata、code區(qū)域,可以根據(jù)實(shí)際情況選擇某一種存儲(chǔ)區(qū)。缺省時(shí)變量的存儲(chǔ)區(qū)域決定于程序所選取的編譯模式,在小模式下缺省存儲(chǔ)區(qū)為data區(qū)域。
當(dāng)前“存儲(chǔ)區(qū)”屬性的說(shuō)法很亂,有的書上稱為“存儲(chǔ)類型”,有的稱為“存儲(chǔ)空間”,有的稱為“存儲(chǔ)器類型”,很顯然這些說(shuō)法都不妥,第一種說(shuō)法與原有的“存儲(chǔ)類型”屬性術(shù)語(yǔ)一樣,后兩種說(shuō)法與實(shí)際含義不符合,因?yàn)椤癲ata、bdata、idata……”既不是存儲(chǔ)空間也不是存儲(chǔ)器,而是某種存儲(chǔ)器的一部分,所以將其稱為“存儲(chǔ)區(qū)”最恰當(dāng)。
另外在定義變量時(shí)可以指定存儲(chǔ)地址也不再贅述,可以參考教材。
3.2關(guān)于專用指針的定義
我們也是明確地給出專用指針定義的形式:
[存儲(chǔ)類型]數(shù)據(jù)類型指向存儲(chǔ)區(qū)*[指針存儲(chǔ)區(qū)]指針名 (2)
可見,該定義式明確提出了專用指針有5種屬性,這里的“指針存儲(chǔ)區(qū)”屬性與一般變量的“存儲(chǔ)區(qū)”屬性對(duì)應(yīng),就是指針變量所存儲(chǔ)的區(qū)域?!爸赶虼鎯?chǔ)區(qū)”屬性是程序員通過指針訪問數(shù)據(jù)的存儲(chǔ)區(qū),在這里使用“指向存儲(chǔ)區(qū)”這一術(shù)語(yǔ)而不是用“存儲(chǔ)區(qū)”,使得專用指針變量的概念更清楚?!爸羔槾鎯?chǔ)區(qū)”屬性可以省略,省略時(shí)指針變量保存在默認(rèn)的區(qū)域;“指向存儲(chǔ)區(qū)”不能省略,否則就成了通用指針。一般“指向存儲(chǔ)區(qū)”和“指針存儲(chǔ)區(qū)”不是同一個(gè)區(qū)域。
從專用指針定義式(2)來(lái)看,指針的定義有些復(fù)雜,可能會(huì)有人說(shuō)把問題搞復(fù)雜化了,并且使學(xué)生產(chǎn)生畏懼心理,但由于“指向存儲(chǔ)區(qū)”屬性和“指針存儲(chǔ)區(qū)”屬性都能夠與單片機(jī)的實(shí)際情況對(duì)應(yīng)起來(lái),使學(xué)生對(duì)專用指針的概念認(rèn)識(shí)得更清楚。反過來(lái),如果不指出“指針存儲(chǔ)區(qū)”屬性,對(duì)于那些善于思考問題的學(xué)生反而會(huì)產(chǎn)生“指針存放于何處”的疑問,典型的問題如:定義一指向程序存儲(chǔ)區(qū)的指針,通過該指針讀取首地址為0x0100的數(shù)表,定義式如下:
unsignedcharcode*point=0x0100;
指針point指向程序區(qū)是很明確的,但是會(huì)產(chǎn)生疑問,“該指針能夠賦值嗎”?能夠賦值說(shuō)明指針不是存放在程序區(qū),那它存放于何處?可以給學(xué)生講它存放于默認(rèn)區(qū),但如果學(xué)生問“想把它保存到其他區(qū)域該怎么做”?欲想圓滿解答必須用定義式(2)。
4單片機(jī)C語(yǔ)言的習(xí)題和實(shí)驗(yàn)
針對(duì)單片機(jī)C語(yǔ)言的教學(xué)內(nèi)容,編寫習(xí)題和實(shí)驗(yàn)題目,使習(xí)題和實(shí)驗(yàn)題目與單片機(jī)密切結(jié)合,與實(shí)際應(yīng)用相聯(lián)系。
4.1習(xí)題內(nèi)容
編寫的習(xí)題可以分為三個(gè)層次,第一個(gè)層次是幫助理解所講的內(nèi)容,這一部分主要是一些思考題;第二個(gè)層次是所講內(nèi)容的簡(jiǎn)單應(yīng)用;第三個(gè)層次是一些結(jié)合實(shí)際的應(yīng)用,這一部分多是編程題。
(1) 幫助理解所講內(nèi)容的如有以下題目:
C51定義變量的一般格式是什么?變量的4種屬性是什么?
C51的數(shù)據(jù)存儲(chǔ)區(qū)域類型有哪些?各種存儲(chǔ)區(qū)域類型是哪種存儲(chǔ)空間,存儲(chǔ)范圍是什么?
如何將C51變量或數(shù)組定義存儲(chǔ)到指定的位置?
C51位變量的定義格式是什么?如何定義bdata型字節(jié)變量的位變量?
如何定義8位字節(jié)型特殊功能寄存器?如何定義16位特殊功能寄存器?如何定義特殊功能寄存器的位變量?
C51專用指針定義的一般格式是什么?如何確定專用指針定義的指向空間和指針變量本身存儲(chǔ)的空間?
(2) 基本概念的簡(jiǎn)單應(yīng)用題如有以下題目:
定義數(shù)碼管顯示0~9的共陰極顯示代碼(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f, 0x6f)數(shù)組dis_code,將其定義在code區(qū);
定義給定時(shí)器/計(jì)數(shù)器0賦初值的變量t0l和t0h,將其定義在data區(qū)的0x30、0x31處;
定義長(zhǎng)度為20的整型數(shù)組data_buf于idata區(qū)中;
定義長(zhǎng)度為100的無(wú)符號(hào)字符型數(shù)組data_array于片外數(shù)據(jù)區(qū)中;
先定義一個(gè)無(wú)符號(hào)字符型變量state于bdata區(qū)中,再定義兩個(gè)與state的最高位和次高位對(duì)應(yīng)的位變量flag_lamp和flag_machine。
(3) 結(jié)合實(shí)際應(yīng)用的編程題目如:二進(jìn)制數(shù)與ASCII碼相互轉(zhuǎn)換,多位二進(jìn)制數(shù)與十進(jìn)制數(shù)相互轉(zhuǎn)換,排序,不同區(qū)域之間數(shù)據(jù)傳送,數(shù)字濾波等。
4.2實(shí)驗(yàn)內(nèi)容
針對(duì)理論教學(xué)內(nèi)容,編寫了兩類實(shí)驗(yàn)題目,一類是基本概念實(shí)驗(yàn),第二類是與實(shí)際應(yīng)用有關(guān)的編程訓(xùn)練實(shí)驗(yàn)。其實(shí)驗(yàn)題目主要有如下一些:認(rèn)識(shí)變量的存儲(chǔ)區(qū)屬性和存儲(chǔ)方式的實(shí)驗(yàn),實(shí)驗(yàn)內(nèi)容為在data、idata、bdata、pdata、xdata區(qū)域中分別定義char、unsigned char、int、unsigned int、float等類型的變量,并將其賦值,單步運(yùn)行程序,觀察各個(gè)變量所存儲(chǔ)的位置和不同類型數(shù)據(jù)的存放方式。
指針實(shí)驗(yàn),實(shí)驗(yàn)內(nèi)容為定義指向data、idata、xdata、code區(qū)域中的unsigned char、unsigned int型指針于指定的位置。通過指針,將源區(qū)域某個(gè)地方的一些數(shù)據(jù)傳送到目標(biāo)區(qū)域的某個(gè)地方,單步運(yùn)行程序,觀察指針變量的變化情況、觀察各個(gè)區(qū)域數(shù)據(jù)的變化情況。
編程訓(xùn)練實(shí)驗(yàn):排序、查找某區(qū)域的某個(gè)數(shù)據(jù)、兩個(gè)區(qū)域中是數(shù)據(jù)比較、實(shí)現(xiàn)延時(shí)1ms、10ms倍數(shù)的實(shí)驗(yàn)等。
5結(jié)束語(yǔ)
相對(duì)于其他微控制器如三星公司的ARM7及一些較復(fù)雜的芯片如射頻IC卡芯片MFRC500,MCS-51單片機(jī)是一個(gè)簡(jiǎn)單的芯片,初學(xué)者之所以感到困難,原因主要是兩個(gè)方面:一是編程,特別是用匯編語(yǔ)言編程更難,學(xué)習(xí)單片機(jī)的人多數(shù)沒有接觸過匯編語(yǔ)言,欲在短短的十幾個(gè)學(xué)時(shí)掌握單片機(jī)指令,并能夠熟練進(jìn)行匯編程序設(shè)計(jì)是不可能的,但如果用C語(yǔ)言編程,并且有較好的編程能力,只要理解了單片機(jī)各個(gè)部分的工作原理,掌握了相應(yīng)的特殊功能寄存器(對(duì)51子系列主要有6個(gè)),就能夠順利地編寫單片機(jī)程序;第二個(gè)原因是實(shí)踐少,學(xué)習(xí)單片機(jī)與學(xué)習(xí)其它高級(jí)語(yǔ)言課程一樣,需要多編程序多練習(xí),雖然過去有Keil C軟件可以模擬運(yùn)行程序,但不夠直觀,只有在單片機(jī)硬件系統(tǒng)上運(yùn)行才能夠直觀地看到運(yùn)行情況和結(jié)果,所以Keil C模擬運(yùn)行程序不能夠激發(fā)學(xué)生的學(xué)習(xí)興趣,但做一個(gè)硬件系統(tǒng)需要時(shí)間較長(zhǎng),并且非常麻煩,致使學(xué)生對(duì)單片機(jī)編程練習(xí)較少。
現(xiàn)在有了單片機(jī)系統(tǒng)設(shè)計(jì)和模擬運(yùn)行軟件Proteus,使用該軟件可以設(shè)計(jì)單片機(jī)應(yīng)用系統(tǒng)電路,并且由Keil C生成的執(zhí)行代碼可以在電路中模擬運(yùn)行,顯示出程序在應(yīng)用系統(tǒng)中的運(yùn)行情況和結(jié)果,非常直觀,不僅能夠激發(fā)學(xué)生的學(xué)習(xí)興趣,而且電路設(shè)計(jì)非??旖?大大提高訓(xùn)練的效率,并且能夠使學(xué)生的編程能力和電路設(shè)計(jì)能力同步提高。
Keil C的出現(xiàn)推動(dòng)了單片機(jī)C語(yǔ)言的教學(xué),提高了人們的編寫能力,為了充分發(fā)揮Proteus的作用,也需要在單片機(jī)教學(xué)中做一些探索和研究,進(jìn)一步推動(dòng)單片機(jī)教學(xué)改革,不僅使學(xué)生更容易掌握單片機(jī)編程,而且還能夠使學(xué)生有更強(qiáng)的硬件電路設(shè)計(jì)能力。
參考文獻(xiàn):
[1] 周國(guó)運(yùn).單片機(jī)原理與應(yīng)用(C語(yǔ)言版)[M].北京:中國(guó)水利水電出版社,2009.
[2] 謝維成,楊加國(guó).單片機(jī)原理與應(yīng)用及C51程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2006.
[3] 張道德.單片機(jī)接口技術(shù)(C51版)[M].北京:中國(guó)水利水電出版社,2007.
[4] 李建忠.單片機(jī)原理及應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002.