馬花萍
[摘 ? ? ? ? ? 要] ?單片機應用技術課程是電子與信息技術、機電、電氣自動化職業(yè)院校學生的一門主修課,也是培養(yǎng)智能化電子產(chǎn)品設計技術人員的一門基礎課,為進一步學習嵌入式系統(tǒng)奠定基礎。單片機具備體積小、成本低、功耗小、功能強、可靠性高等特點,廣泛應用于工業(yè)測控、醫(yī)療設備、智能儀器儀表、家電、通信、交通國防等各個領域,可以說“想得到就用得上”。
[關 ? ?鍵 ? 詞] ?單片機;程序;思路;代碼
[中圖分類號] ?G712 ? ? ? ? ? ? ? ? [文獻標志碼] ?A ? ? ? ? ? ?[文章編號] ?2096-0603(2019)23-0008-02
什么是單片機呢?簡單地說,單片機就是一個小的計算機系統(tǒng),同時也是一種集成電路芯片,是典型的嵌入式微控制器。如何能夠掌握單片機應用技術,具備應用單片機知識解決實際問題的能力呢?針對這一狀況,作為工作在教學一線的專業(yè)課教師,對單片機應用技術課程進行了“基于工作過程的”項目化教學,讓單片機學習不再抽象、不再枯燥。本文提出了一些單片機學習技巧,為大家學好單片機提供建議。
一、好的開始是成功的一半,樹立信心,勇敢地邁出第一步
剛開始學習單片機的時候,要樹立信心,采用項目學習法,要一步一個腳印,一個一個項目來。單片機學習的一般流程是:①電路設計;②連接電路;③程序設計與調試;④編譯程序并燒寫芯片。可以從一個簡單的單片機任務入手,了解整個流程。例如,我們用開關來控制LED發(fā)光二極管的亮滅。當開關閉合時,發(fā)光二極管亮;開關斷開時,二極管滅。根據(jù)題意,畫出電路圖,并進行電路連接。接下來,創(chuàng)建一個工程,然后編寫程序并進行調試。
(一)創(chuàng)建工程
(1)新建工程文件:單擊菜單【Project】—【New Project…】在彈出的“Create New Project”對話框中,選擇保存路徑,并在“文件名”的輸入框中輸入工程的名字(如led),不需要擴展名。單擊“保存”按鈕,便會彈出第二個對話框,要求選擇CPU型號,選好后單擊確認。(2)工程的設置:在“Target1(目標)”上單擊鼠標右鍵,接著單擊“Options for Target‘Target1”選項,即出現(xiàn)工程設置對話框。主要設置對話框中的“Output”頁面,選中其中的“Create HEX File”用于生成可執(zhí)行的代碼文件。
(二)新建源程序文件
(1)建立并保存源文件:單擊菜單【File】—【New…】可在項目窗口的右側打開一個新的文本編輯窗口。單擊菜單【File】—【Save】在彈出的對話框“文件名”的輸入框中輸入文件名,同時必須輸入正確的擴展名(C語言源程序以.c為擴展名),單擊保存。(2)添加源文件到工程中:在源程序組上單擊右鍵,彈出快捷菜單,接著單擊“Add Files to Group ‘Source Group1”選項,在彈出的對話框中選中“l(fā)ed.c”。
(三)編寫程序
暫時不管程序為什么這樣寫,先在程序輸入窗口里輸入程序,然后保存。
(四)在keil中調試程序,燒寫芯片
(1)程序編譯:選擇菜單【Project】 —【Build target】對當前工程進行連接,產(chǎn)生目標代碼。(2)使用串行口ISP下載線下載程序。這時給系統(tǒng)上電,如果通信正常,則可完成將程序寫入單片機的程序存儲器。
在單片機的學習過程中,不管遇到多么復雜的任務,新建工程、新建源文件、程序編譯、調試、仿真、燒寫等操作都是一樣的,從最簡單的任務入手,讓它先運行起來,熟練掌握一整套系列的流程。
二、先參考別人的程序代碼,掌握其中的思路,先學用到的知識點,沒有用到的暫時放到一邊
從單片機的學習流程中,我們知道單片機的學習重點在于電路和編程方法,剛開始,可以直接把別人的程序代碼拿過來用,學習其中的程序思路,思考都用到了哪些知識點。單片機的學習是注重理論和實踐結合的,學習初期光看書不去動手,是學不會的。厚厚的一本書,如果不分主次通篇去看,看著看著頭就暈了,也許你學了后面的,前面的內容估計也快忘光了。所以,最好結合實際任務,把程序中用到的知識點,認真學習一下,暫時用不到的內容,就先跳過去,不必非要把書從第一頁看起。比如,流水燈程序:
#include
int main(void) ?{ unsigned int i; ?P2=0xfe; ?while(1)
{ for(i=0;i<30000;i++);P2=_crol_(P2,1); ?} }
流水燈程序和開關控制二極管的亮滅程序比較,都用到了單片機的頭文件,程序中都有主函數(shù),內部都嵌套了死循環(huán)函數(shù)。在流水燈程序中又多了內部函數(shù)頭文件,定義了無符號整型變量,引入了for循環(huán)的延時函數(shù)。在后面提到的秒閃電路的制作,用到了定時器中斷,那時我們才去學習定時器的內容。把整本書化整為零,等用到了再去學習,這樣學習的內容既扎實又牢固。
三、無論多簡單的程序,都要寫一遍,不能光看,一定要開動腦筋,采用多種方法,優(yōu)化并實現(xiàn)自己的程序效果
剛開始的時候,對內容不了解,可以先抄寫老師和教材中的程序,看看每一句代碼有什么功能,可達到什么目的,運行后有什么結果。比如,單片機驅動點亮發(fā)光二極管程序,這個程序我們可以用位操作法,在程序中直接對某位引腳進行賦值。
#include
main() ?{d1=0;d2=1;P1_2=0;while(1);}
此程序實現(xiàn)了發(fā)光二極管的d1,d3亮,d2不亮。除了頭文件,程序中用兩種方法定義引腳的名稱,第一種是通過名稱P1定義引腳名,第二種是通過已有名稱定義新名稱,一定要區(qū)分清楚,程序看明白后一定要自己重新寫一遍,寫過之后,你會發(fā)現(xiàn),原來看明白別人的程序很容易,但自己寫的時候卻一句也寫不出來,并且還會丟三落四出現(xiàn)很多問題。當自己能順利寫出程序代碼時,說明自己真的懂了。學習需要有舉一反三的過程,才會有提高。點亮發(fā)光二極管的程序,還可以用字節(jié)操作法。字節(jié)操作,就是用一個字節(jié)數(shù)據(jù)同時設置I/O口8個引腳的狀態(tài)。用這種方法時,要先分析P1口每位的值,然后寫出十六進制數(shù)。程序如下:#include
同樣實現(xiàn)點亮d1,d3,關閉d2,字節(jié)操作,代碼少,效率高,程序運行的速度快,充分優(yōu)化了程序功能。
四、相同的任務,不同的人有不同的代碼寫法,主要是找到硬件電路的制作和程序設計的思路,著重培養(yǎng)解決問題的能力
如何寫出一個程序來控制器件,按你想要的結果去運作,這個就是解題的思路。要寫程序,就要先找到解決問題的思路,思路有了,方法就會有許多種。對同一個項目任務,用不同方法來實現(xiàn)同一功能,這是一個練習和提高的過程。用單片機一位I/O口去控制發(fā)光二極管的閃亮。LED的工作過程是:點亮→延時→熄滅→延時→點亮→延時……如此循環(huán),實現(xiàn)了閃爍的效果。它的硬件電路很簡單,我們以亞龍YL-236型單片機控制功能實訓考核試驗臺為界面連接電路。程序設計起來也不難,通過流程圖對程序進行設計,是在點亮發(fā)光二極管程序的基礎上實現(xiàn)延時。
方法一:#include
void main() ?{unsigned int i;While(1)
{led=0;for(i=0;i,50000;i++); ?led=1;for(i=0;i,50000;i++);}
這個問題,算是解決了,能不能換種寫法實現(xiàn)同一功能。
方法二:#include
void delay(void) {unsigned int i=50000;while(i--);}
void main() { while(1) {led=0; delay(); led=1;delay();} }
方法一實現(xiàn)二極管閃亮,運用了for循環(huán)延時,方法二采用了delay自定義延時函數(shù),都是延時50000us。延時時間一樣長,利用我們學到的知識,還可以考慮如果發(fā)光二極管“亮/滅”的時間不一樣長,而且有多種變化怎么來寫程序?寫程序的過程也是一個創(chuàng)造的過程。
五、對于一個新項目,要學會對任務進行分析,不要急于去尋找別人的代碼,學會掌握程序的設計與調試
當你接到一個新的項目時,先自己構思一下整個過程,例如秒閃電路的制作。這個項目的難點在于程序設計思路,有了思路,編寫程序就容易多了。分析任務:所謂秒閃電路,即1秒定時閃爍的電路。就是讓一個LED每1秒固定閃爍一次,實際上就是讓LED亮500ms,滅500ms,然后再循環(huán)。涉及時間的問題,首先就要考慮用定時器來做。如果定時時間較長,則要盡量使定時器中斷時間間隔大些,減少中斷次數(shù),提高程序的效率。通過前面的知識我們知道,定時器0工作在方式1下最大定時只有65.536ms,經(jīng)過分析,如果我們采用定時器0,利用工作方式1,通常將定時器設為50ms的時間間隔,即每50ms中斷一次,然后通過一個變量記錄中斷次數(shù),每中斷一次,讓這個變量加1,當這個變量等于10,說明已經(jīng)中斷10次,正好就是500ms,實現(xiàn)1秒定時閃爍。設計思路有了,程序編寫就簡單了。
對任務進行分析,事先規(guī)劃好程序的流程圖,程序代碼寫出來易如反掌,但是問題又來了,不少學生把程序代碼寫好了,然后一運行,不是自己想要的結果,有的時候甚至結果出不來,頭就暈了,然后就跑去問老師“為什么我的程序不能正常運行”就等老師來給自己分析。這是一種很不好的習慣,應該自己學會發(fā)現(xiàn)問題和學會如何解決問題。在解決問題的過程中,通過程序的排錯,你會學到很多平時聽課、看書學不到的東西。糾錯的過程就是學習的過程,并且比用其他的方法都學得多、記得深。通過編譯程序,排查出簡單的語法錯誤,對生成的目標文件進行調試運行,單步執(zhí)行與全速執(zhí)行相結合,實現(xiàn)自己的程序功能。
參考文獻:
[1]金杰.MCS-51單片機C語言程序設計與實踐[M].北京:電子工業(yè)出版社,2017.
[2]老盛林,吳慧芳.單片機應用技術[M].北京:北京理工大學出版社,2018.
[3]蘇珊,高如新.單片機原理與應用[M].成都:電子科技大學出版社,2016.
編輯 張 慧