摘要:單片機(jī)的內(nèi)容繁雜而抽象,需要大量的實(shí)踐訓(xùn)練才能掌握。但是,由于學(xué)生缺乏編程的實(shí)戰(zhàn)能力,實(shí)踐舉步維艱。針對該難題,提出全面采用C51開展教學(xué)的解決思路,并就C51的教學(xué)內(nèi)容、性能、面向硬件等方面的優(yōu)化進(jìn)行了探討。實(shí)踐表明,基于C51優(yōu)化開展教學(xué),能夠幫助學(xué)生更好更快的掌握編寫高效、實(shí)用程序的方法,為項(xiàng)目超市的實(shí)踐訓(xùn)練提供堅(jiān)實(shí)保障。
關(guān)鍵詞:C51單片機(jī)優(yōu)化性能項(xiàng)目超市
[中圖分類號]G642 文獻(xiàn)標(biāo)識碼:A 文章編號:
0.前言
單片機(jī)具有實(shí)踐性強(qiáng)、軟硬兼施的鮮明特點(diǎn),造成“難學(xué)、難教”的困境,畢業(yè)生難以滿足用人單位的需求[1]。針對單片機(jī)特別強(qiáng)調(diào)動手實(shí)踐的特點(diǎn),應(yīng)該設(shè)計(jì)覆蓋知識點(diǎn)較為齊全的項(xiàng)目案例組成項(xiàng)目超市,為學(xué)生提供充足的實(shí)踐訓(xùn)練的機(jī)會。但是,大部分學(xué)生所學(xué)的C語言只是應(yīng)付計(jì)算機(jī)等級考試的技巧,缺乏真正的編程能力,在項(xiàng)目超市的實(shí)踐訓(xùn)練中舉步維艱。因此,要使得實(shí)踐順利開展,首先就要加強(qiáng)學(xué)生的編程能力。
1.全面采用C51開展教學(xué)
目前國內(nèi)高校的單片機(jī)教學(xué)基本上為51[2],而各種單片機(jī)的原理和學(xué)習(xí)方法大同小異,因此下面以51為例展開討論。51的編程語言主要有2種,也就是匯編語言和C語言版本的C51。其中,匯編語言是用文字助記符來表示機(jī)器碼的語言,具有面向硬件、占用體積小、執(zhí)行速度快的優(yōu)勢。但是,匯編語言的學(xué)習(xí)門檻較高,非專業(yè)人員不易涉足,學(xué)生難以在短時間內(nèi)熟練掌握[3]。現(xiàn)在,C51的性能、體積已經(jīng)接近匯編[4],網(wǎng)上的資源日趨豐富。因此,不能拘泥于傳統(tǒng)教材,而應(yīng)該與時俱進(jìn)、全面采用C51開展教學(xué),從而降低學(xué)生的學(xué)習(xí)難度,提高學(xué)習(xí)效率。當(dāng)然,傳統(tǒng)的C語言與單片機(jī)存在較大脫節(jié)的現(xiàn)象[5]。C51面向的是單片機(jī),有其獨(dú)特之處,因此需要在教學(xué)中特別注意優(yōu)化的問題。
2.對C51內(nèi)容的優(yōu)化
C語言的內(nèi)容很多,如果按照C語言的模式學(xué)習(xí)C51,會花費(fèi)太多時間。實(shí)際上,單片機(jī)設(shè)計(jì)中只需要其中的一小部分知識,因此需要對內(nèi)容進(jìn)行優(yōu)化。從實(shí)際應(yīng)用來看,C51最關(guān)鍵的內(nèi)容有如下幾點(diǎn):常量,變量,數(shù)組,if,for,while。只要抓住這幾點(diǎn),大部分的C51程序都能迎刃而解。通過內(nèi)容精簡,極大減輕教學(xué)負(fù)擔(dān),使得學(xué)生能夠更好更快的學(xué)習(xí)如何圍繞硬件進(jìn)行編程。從時間看,這幾點(diǎn)內(nèi)容所需花費(fèi)的時間較少,極大縮短了學(xué)習(xí)周期。從難度看,這幾點(diǎn)均為基礎(chǔ)內(nèi)容,有效的降低了C51的進(jìn)入門檻。至于那些較為復(fù)雜的內(nèi)容,完全可以通過其他技術(shù)替代。例如,指針功能強(qiáng)大,但是學(xué)生不易理解,使用也容易出錯,普遍對其有抵觸情緒。此時,改為數(shù)組實(shí)現(xiàn)就能較好的解決這個難題。
3.對C51運(yùn)行性能的優(yōu)化
在計(jì)算機(jī)中,用戶很難感覺出1us和1ms的速度差異。但是,在單片機(jī)中,控制時序相差一兩個us就有可能造成系統(tǒng)無法正常工作。不少老師沿用面向計(jì)算機(jī)的方法去教,學(xué)生也沿用傳統(tǒng)C語言的方法去學(xué),存在很大問題。因此,在教學(xué)中需要特別注意性能優(yōu)化。
3.1 盡量采用char,少用int
C語言最常用的變量類型是int,學(xué)生們也習(xí)慣了這個用法。但是,51是8位的,使用16位的int性能很低。此時,應(yīng)該盡量使用char。下面分別編寫了兩段小代碼,其中無符號int和char分別用了ui和uc的宏定義。
代碼1:uc i,j; for(i=250;i>0;i--){for(j=250;j>0;j--);}
代碼2:ui k; for(k=62500;k>0;k--);
兩段代碼都實(shí)現(xiàn)了62500次的循環(huán),其中后者的寫法更為簡潔。進(jìn)入Keil C51,設(shè)置單片機(jī)為12MHz的AT89S52,編寫程序,編譯和調(diào)試后,發(fā)現(xiàn)兩段代碼初始化的時間都是389us。但是,它們的結(jié)束時間并不一樣。其中,char代碼所消耗的運(yùn)行時間為126140-389=125,735us,而int代碼為500635-389=500,246us,兩者相差3.98倍,如圖1所示。由此可見,沿用int并不是一個好習(xí)慣。
圖1兩段代碼的運(yùn)行時間比較3.2 盡量采用i--,少用i++
學(xué)生們素聞C++的大名,也習(xí)慣了i++的寫法,對i--不以為然甚至覺得多余。但是,在C51中情況發(fā)生了逆轉(zhuǎn)。
代碼3:uc i,j; for(i=0;i<250;i++){for(j=0;j<250;j++);}
該代碼的運(yùn)行時間為188,752us,約為i--的1.5倍。代碼1和代碼3都是char,為什么還會出現(xiàn)如此明顯的差距呢?關(guān)鍵就在于51單片機(jī)的DJNZ指令能夠?qū)崿F(xiàn)減1并判斷是否為0。而i++需要對累加器A預(yù)處理,然后通過INC和CJNE兩條指令才能完成。對于這個知識點(diǎn),如果學(xué)生基礎(chǔ)一般,可以一筆帶過;如果學(xué)生興趣濃厚,則可以引導(dǎo)他們深入學(xué)習(xí)51的內(nèi)部結(jié)構(gòu)和指令集,使得學(xué)生的理解更加透徹。
3.3 盡量采用for,少用while
for和while都是C語言中的經(jīng)典循環(huán)結(jié)構(gòu)。其中,while更加簡潔和易用。下面定義了兩段功能相同的代碼。
代碼4:for(i=255;i>0;i--);
代碼5:i=255; while(k--);
測試結(jié)果顯示,while所消耗的時間為for的3倍多。因此,應(yīng)該引導(dǎo)學(xué)生盡量使用for。
以上是典型的性能優(yōu)化問題,此外還有多用移位少用乘除法、多用if少用switch等。
4.對C51進(jìn)行面向硬件的優(yōu)化
單片機(jī)的RAM和ROM一般處于幾百B、幾十KB級別,硬件資源相當(dāng)有限。因此,教學(xué)時必須注意面向硬件的優(yōu)化。①盡量采用small的內(nèi)存模式。單片機(jī)有small、compact、large共3種內(nèi)存模式,分別指向片內(nèi)RAM、片外8位RAM、片外16位RAM,其容量由小到大,其速度由快到慢。②盡量減少變量,盡量采用局部變量以增加內(nèi)存單元的利用率。③盡量優(yōu)化代碼結(jié)構(gòu),減少對ROM的占用。例如,從圖1的指令可以看出代碼1占用8B,代碼2占用14B,存在較大差別。④充分利用IO引腳并進(jìn)行擴(kuò)展。單片機(jī)所有的工作都依賴IO引腳,而引腳的數(shù)量非常有限。因此,應(yīng)該在教學(xué)中引導(dǎo)學(xué)生多使用573鎖存器,164、595串并轉(zhuǎn)換器,138譯碼器,以及I2C、SPI總線進(jìn)行擴(kuò)展。
5.實(shí)踐與效果
長期以來,欽州學(xué)院的單片機(jī)課程一直沿用匯編語言開展教學(xué),學(xué)生普遍感到難學(xué),效果很不理想。到了2008年廣西大學(xué)生電子設(shè)計(jì)競賽,教師們發(fā)現(xiàn)匯編語言的使用比較困難,編寫的程序冗長、難以閱讀和理解,無法快速解決問題。經(jīng)過研究,決定全面轉(zhuǎn)入C51,并在此后幾年,針對單片機(jī)的特點(diǎn)不斷研究C51優(yōu)化的教學(xué)。
經(jīng)過幾年的實(shí)踐研究,學(xué)生普遍感到學(xué)習(xí)門檻降低了,上手更快了,設(shè)計(jì)系統(tǒng)的性能和實(shí)用性都有了較大進(jìn)步。在此基礎(chǔ)上,欽州學(xué)院單片機(jī)教學(xué)團(tuán)隊(duì)根據(jù)十幾年來積累的豐富資源,設(shè)計(jì)了面向C51的大量案例,建成了覆蓋知識點(diǎn)較廣、數(shù)量較多、種類齊全的省級課題項(xiàng)目超市,使得學(xué)生在掌握C51的基礎(chǔ)上,獲得大量實(shí)踐訓(xùn)練的機(jī)會[6]。近年來,學(xué)生的課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)的水平,在大學(xué)生電子競賽、大學(xué)生創(chuàng)新項(xiàng)目中的成績穩(wěn)步提高,并在2013年的電子競賽中取得了全國獎項(xiàng)的零突破。目前,電子信息工程、自動化等專業(yè)畢
業(yè)生的動手能力不斷增強(qiáng),受到了用人單位的歡迎,就業(yè)率穩(wěn)步提高并保持在92%以上。
6.結(jié)束語
不拘泥于傳統(tǒng)教材的匯編,摒棄C語言習(xí)慣用法,全面采用C51開展教學(xué),精簡優(yōu)化教學(xué)內(nèi)容,在教學(xué)過程中注重性能和面向硬件的優(yōu)化,大大減低學(xué)生的進(jìn)入門檻,減輕了學(xué)生的學(xué)習(xí)負(fù)擔(dān),使得學(xué)生能夠快速上手,并掌握實(shí)用性較強(qiáng)編程能力。實(shí)踐表明,基于C51優(yōu)化的解決方案效果良好。
參考文獻(xiàn):
[1]荊蕾.單片機(jī)實(shí)踐教學(xué)方法的研究[J].大學(xué)教育,2012,(6):68-69.
[2]許景輝,張成鳳,李宗利.“單片機(jī)原理及應(yīng)用”課程改革實(shí)踐和探索[J].中國電力教育,2013,35:74-75+82.
[3]陳少明.C51開發(fā)單片機(jī)應(yīng)用軟件初學(xué)者必須突破的幾個問題[J].廊坊師范學(xué)院學(xué)報(自然科學(xué)版),2010,10(3):26-28.
[4]賀敬凱,劉德新,管明祥.單片機(jī)系統(tǒng)設(shè)計(jì)、仿真與應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2011:30-32.
[5]陳景波,陳飛,李智超.“C語言”課程中融入“單片機(jī)”內(nèi)容的教學(xué)研究[J].中國電力教育,2013,29(26):71-72.
[6]包敬海,張大平,陸安山等.淺談面向應(yīng)用型人才培養(yǎng)的單片機(jī)課程的改革[J].欽州學(xué)院學(xué)報,2013,28(8):20-23.
基金項(xiàng)目:廣西教育廳教改課題,基于項(xiàng)目超市的單片機(jī)實(shí)訓(xùn)平臺的建設(shè),2013JGB258。
作者簡介:包敬海(1979-),男,漢族,廣西防城港人,碩士,副教授,研究方向?yàn)槲⒖刂葡到y(tǒng)、Web信息系統(tǒng)。