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