鄧云+朱海燕
【摘 要】本文提出結合電類專業的特點,引入Arduino單片機項目作為主線,開展C語言程序設計教學,調動學生學習積極性,提高教學成效。
【關鍵詞】C語言 項目教學 單片機項目
【中圖分類號】G 【文獻標識碼】A
【文章編號】0450-9889(2017)05C-0158-03
一直以來,傳統C語言程序設計教學主要是以語法、語句和結構為中心,以數據類型、變量、運算符、數組、指針和函數等為基本知識點展開。這樣的教學模式雖然可以很好地按照教材逐一講授知識內容,但是也容易使學生陷入知識細節,而忽視C語言程序的具體應用。雖然學生通過不斷地學習基礎知識和練習經典算法,能夠閱讀、修改、編寫簡單C語言程序,但是學生的抽象思維、自主創新意識、解決實際問題能力難以得到全面培養。另外,由于高職學生的計算機基礎、邏輯思維、英語基礎和數學運算等綜合能力都較為薄弱,這些因素也影響了學生學習C語言程序設計的興趣。
因此,為了提升學生閱讀、編寫和調試程序的能力,激發學生自主學習C語言程序設計的興趣,結合電類專業人才培養目標,提出以單片機項目為載體的C語言程序設計教學模式,通過實驗現象啟發學生思考目標實現方法,在實驗過程中引入重點理論知識,讓學生帶著興趣和目標進行C語言單片機項目學習。
一、引入單片機項目驅動C語言程序設計教學
首先讓學生體驗C語言編程控制單片機樂趣,然后,通過不同的項目引入C語言程序的結構、語法、語句等相關知識內容。例如,通過典型的跑馬燈項目引入for循環語句,通過數碼管倒計時顯示引入一維數組,通過八路搶答器引入if、switch選擇語句。利用單片機項目直觀可控的特點,以實用、夠用為導向,構建適合高職學生特點的C語言單片機項目框架,具體的教學項目框架如圖1所示。
(一)引入簡單易學的Arduino單片機實訓平臺
由于51系列單片機價格低廉,且配套教學資源豐富,傳統單片機教學一般都是采用51系列單片機,但是,51單片機最大的問題就是需要使用者掌握其內部結構、寄存器、I/O設備等諸多底層硬件結構,然后才能開展C語言程序設計教學,過多的底層硬件結構會增加學生學習單片機編程的難度,而Arduino平臺則繞開了單片機底層硬件結構,僅需少量指令即可開始程序設計,其自帶庫函數也已包含許多常用I/O設備驅動,在此基礎上進行二次開發,很容易完成功能多樣的作品。
Arduino平臺的軟硬件完全開源,許多常用子函數已經封裝成為庫函數,在此基礎上進行程序編寫,可以大大縮短軟件開發周期,提升編程效率。
例如,編寫一個毫秒級的延時函數,使用51單片機編寫則需要多行代碼才可實現,具體延時函數如下:
void delay_ms(uchar t)
{ uchar i,k;
while(t--)
{ for(i=1;i<130;i++)
for(k=1;k<130;k++) ;}
}
但是,采用Arduino單片機只需調用一個毫秒級延時函數,即編寫以下一條代碼:
delay(n); // 括號中的n表示延時長度,單位為ms。
一個同樣功能的延時函數,51單片機需要多行代碼,而Arduino單片機僅需一個函數調用,這種把過程集合化、函數化的過程省去了繁瑣的細節,既簡化了編程工作量,又讓學生更容易理解和接受。
(二)單片機控制LED閃爍,學習while循環語句
單片機控制一個LED燈閃爍項目的程序和硬件電路都比較簡單,很適合作為C語言單片機教學的入門實驗,LED燈閃爍流程圖及主要對應代碼如圖2所示。通過觀察LED燈閃爍實驗現象,啟發學生思考實現LED燈閃爍的分解步驟,結合C語言程序代碼,學生可以直觀了解C語言程序控制指令在LED燈上所呈現的對應關系。
在此項目驅動之下,學生更加容易理解while循環語句的使用方法,同時,也能啟發學生思考項目中其它C語言程序的知識要點:
1.Arduino單片機C語言認知。單片機C語言程序的結構是由setup()初始化函數和Loop()主函數構成,初始化函數主要完成單片機I/O口的功能設定,例如,pinMode(i,OUTPUT),表示第i個引腳為低阻抗輸出模式;Loop()函數則是一個程序里面的主函數,編程者的所有想法可以通過C語言控制單片機具體實施。
2.變量及函數調用。通過觀察LED燈閃爍的快慢,深入學習延時函數delay(n)的使用方法,其中n為參數傳遞,控制延時長度,單位是毫秒,調整變量n即可改變LED的閃爍速度。
3.賦值及輸出控制。digitalWrite(ledpin,HIGH)語句表示ledpin引腳輸出高電平,單片機所有數字引腳有兩種狀態,分別為高電平HIGH和低電平LOW,其狀態的改變由關鍵詞digitalWrite進行控制。
4.順序結構及循環結構。C語言程序一般默認是按照順序結構執行代碼指令,但是,在執行重復且有規律事件的時候需用循環控制結構,LED燈閃爍就是一個不斷重復亮滅的過程,因此,while語句或for語句都可以實現循環控制功能。
(三)開關控制LED燈,學習if選擇語句
外部開關控制LED燈的亮滅,實驗現象為:閉合開關SW則LED燈亮,斷開開關SW則 LED燈熄滅。通過此項目可以引導學生掌握單片機I/O口狀態的讀取方法,以及重點使用if語句進行邏輯狀態判別,程序關鍵代碼如下:
k=digitalRead(SW); //讀取數字腳0口的狀態,需要digitalRead( )語句才能得到引腳的狀態。
if(k==0) //判斷開關的狀態,按下為0,放開為1。
digitalWrite(ledpin,HIGH); //寫ledpin狀態,HIGH驅動燈亮。
else
digitalWrite(ledpin,LOW); //寫ledpin狀態,LOW則燈滅。
在此基礎上再進行功能深入拓展,把一些實際生活經驗引入程序設計。例如,當開關斷開后,LED燈需要延時一段時間再熄滅,這樣的邏輯思維可以很好解決晚上關燈后不需要摸黑上床睡覺的問題,以此類推,啟發學生思考其它類型用到開關輸入量的地方,還有銀行ATM的按鍵、食堂刷卡機等生活實例,這樣就能很好激發學生的自主探索精神和學習熱情。
(四)單片機控制LED流水燈,學習for循環語句
在第一個LED燈閃爍項目的基礎上,增加LED燈的數量,讓LED燈呈現流水效果,利用Arduino單片機的數字IO口D0至D7分別控制八個LED燈,LED流水燈的硬件電路如圖3所示,關鍵語句如下:
for(i=0;i<8;i++) //控制8個燈從左到右輪流亮滅,實現視覺流水效果。
結合實驗現象,引導學生思考for循環語句的用法,重點掌握語句中循環變量初值的設定、循環次數、結束條件,以及循環內容的分解步驟。借助LED燈輪流點亮的過程,可以讓學生很好理解延時變量長度對應控制LED流水速度,循環次數對應控制參與循環LED個數,這種直接讓程序語句關聯實驗現象的教學方法,能更加直觀有效幫助學生掌握for語句的使用方法。在八路LED流水燈的基礎上,還可以引導學生繼續增加LED燈的數量,制作心形LED流水燈,進一步激發學生自主創新思維,編寫更加豐富多彩的LED流水效果。
(五)控制數碼管顯示,學習一維數組
通過控制一個數碼管顯示一位數字,引入七段數碼管顯示驅動方式,然后進一步學習顯示數字“0”到“9”的方法,并且把驅動數碼管顯示的編碼進行歸納形成一個組,自然引入“一維數組”概念。驅動一位數碼管顯示的硬件電路如圖4所示,其中單片機的數字腳D0至D6分別接到七數碼管的a至g引腳。
數字“0”到“9”的一維數組編碼定義為:char table []={0x40,0xf9,0xa4,0x30,0x19,0x92,0x02,0xf8,0x00,0x10},分別將數組中的編碼通過八位并行輸出方式驅動七段數碼管,即可顯示“0”至“9”之間的數字,C語言的輸出表達方式為:PORTD=table[i];在顯示固定單個數字的基礎之上,還可以結合for循環語句和delay(n)延時函數,實現數字“0”至“9”之間循環動態顯示。
在完成數碼顯示基本功能之后,繼續沿用該硬件電路,引導學生修改程序代碼,設計一個“九秒倒計時器”,并且使用定時器取代delay()延時函數,讓學生在清楚項目要求和實驗結果的前提之下,運用C語言編寫定時中斷函數。
結合實際生活,在原有硬件電路基礎之上,增加一定數量的按鍵開關,即可變成一個多路搶答器,啟發學生思考如何檢測鍵盤輸入、數據處理、結果顯示及鎖定,在完成邏輯分析之后,再具體引入端口狀態讀取函數digitalRead()、是否有按鍵搶答判別語句if()、結果顯示語句PORTD=table[i]、狀態鎖定使用循環語句while()等關鍵C語言知識,通過搶答器項目的學習,能夠幫助學生直觀認識C語言的更多用途,激發學生繼續深入C語言程序設計。
(六)控制LED點陣顯示,學習二維數組
類比日常生活,點陣顯示廣告屏在街上隨處可見,深入分析點陣屏顯示原理,可以把大型屏幕可以分解成多個16×16或8×8的小模塊,結合點陣顯示現象引入“二維數組”,讓學生根據現象聯系C語言程序運用場合,這樣的項目導入方式能夠有效提高學習針對性。通過進一步分析點陣顯示過程,可以明確點陣顯示需要行列同步配合、延時長度合適才能正常工作,該項目重點訓練了如何從二維數組里調取行和列的信息,以及合理控制延時函數的方法,結合C語言程序綜合運用了逐行動態掃描技術。經過點陣顯示控制項目的學習,學生能夠掌握C語言控制一個靜態字的顯示方法,同時,引導學生思考如何實現動態顯示多個文字,讓學生自主思考C語言程序更豐富的應用范圍。
(七)設計簡易數字溫度計,學習數據處理及函數調用
溫度是日常生活中經常接觸的一個物理對象,冰箱、空調和電磁爐等家電都需用到溫度測量與控制,因此,利用單片機設計一個簡易數字溫度計能夠接近實際生活,比較容易吸引學生參與項目設計與制作。
由于溫度為連續變化的模擬量,需要經過模數轉換之后才能送入單片機進行數據處理,而Arduino單片機集成有十位模數轉換功能,即溫度模擬量對應0~1023之間的數字量。因此,簡易的數字溫度計的設計思路是:首先進行溫度模擬量到數字量的轉換,然后將AD轉換結果進行換算處理,最后將處理后的實際溫度值送入LCD液晶顯示。
簡易數字溫度計的設計流程圖及其主要程序代碼如圖5所示,通過簡易數字溫度計項目的學習,學生能夠掌握參數傳遞、返回值、函數調用和數據運算等C語言相關知識。
(八)設計無弦電子琴,綜合運用C語言程序設計
電子琴已然成為了人們喜愛的一種演奏樂器,通過單片機也可以設計一種無弦電子琴,一段樂曲是由許多不同的音階構成,每一個音階對應著一個獨有的頻率點,因此,只需要將不同的頻率點進行有規律的組合,就可以譜寫一段有趣的音樂。利用單片機定時器產生不同頻率的方波是一件非常容易實現的事,前提是需要把某一首歌曲的音階所對應的頻率點弄清楚即可,電子琴的按鍵將由光電傳感器替代,即光電管感應器輸出高低電平作為音符的按鍵,每一個按鍵對應一個音階,單片機只需檢測I/O口的高低電平即可判斷是否有鍵按下,然后,輸出特定頻率的方波驅動揚聲器發出對應的音階。
現以八度中音音符為例,音符與頻率關系的相關計算數值如表1所示,單片機定時器TIMER產生各中音的定時長度根據表1數據即可完成設定,將全部中音音符建立成一個表格,單片機通過查表方式可以快速獲取與音符頻率相對應的定時值。
電子琴項目具有較強的互動性,學生通過體驗無弦彈奏的樂趣,進而激發學生設計、制作單片機電子琴的興趣,培養學生運用C語言程序控制硬件電路的能力。
二、結束語
本文針對C語言程序設計在應用電子技術專業課程教學中所存在的問題,提出了以單片機為載體的項目式教學法,把C語言程序設計的重點知識融入相關子項目,讓學生帶著興趣和目標進行課程學習,通過項目設計與制作提高學生編寫、調試C程序的能力,經過兩個學期的實踐教學,學生編程技能得到有效提高,教學效果有了明顯改善,基本實現預期教學目標。
【參考文獻】
[1]孫慧.在電子類專業中開展 C 語言教學改革的實踐探索[J].技術與市場,2014(12)
[2]盧敏.基于 PI 能力培養的 C 語言教學改革研究與實踐[J].軟件導刊(教育技術),2014(11)
[3]黃建燈.《C 語言程序設計》教學改革探討[J].電子世界,2012(12)
[4]莫建平,潘曉明.基于C語言的單片機課程教學改革探論[J].柳州師專學報,2014(4)
[5]譚浩強.C語言程序設計教程(第三版)[M].北京:清華大學出版社,2013
【作者簡介】鄧 云(1983— ),男,廣西全州人,碩士,廣西職業技術學院講師,研究方向:電子技術。
(責編 丁 夢)