張正明 王麗娟 石建國 電子科技大學中山學院
單片機課程是電子信息類專業(yè)必修的專業(yè)課程,是一門綜合性和實踐性都很強的課程,通過該課程的學習,使學生了解單片機的基本原理及其應用,了解匯編指令功能、編程方法,掌握單片機應用系統(tǒng)的硬件組成,能夠使用C51 語言進行軟件開發(fā),培養(yǎng)學生分析、解決實際問題的能力。
在進行傳統(tǒng)的理論教學時,要想課堂教學安排生動、有趣,難度比較大,難以讓學生看到電路變化、程序變化對實驗結(jié)果的影響,難有切身感受;在進行實踐教學時,受教學場地、設備數(shù)量和實驗箱產(chǎn)品更新慢等因素的影響,操作靈活性有限。鑒于此,我們在教學過程中引入 Proteus 軟件和Keil 軟件,可以方便地在 Proteus 平臺上中繪制和修改硬件電路圖,加深學生對單片機應用系統(tǒng)硬件電路的理解;在 Keil 軟件中編寫和修改相應指令,然后在 Proteus 平臺上進行聯(lián)合仿真。
在虛擬的硬件平臺上看到程序運行的結(jié)果,可以加深學生對電路連接和指令功能的理解。這樣,課堂上方便老師演示和講解,實驗課上和課下方便學生進行各種應用的設計,激發(fā)學生學習的興趣和積極性,增強學習效果。
發(fā)揮Proteus 軟件和 Keil 軟件的聯(lián)合應用,可以節(jié)約耗材,縮短開發(fā)周期,具有逼真效果。下面以矩陣鍵盤的輸入和數(shù)值顯示為例說明該方法的優(yōu)勢。
4*4 矩陣鍵盤,共16 個按鍵,如果連接成獨立按鍵就需要16 個IO 管腳,而連接成矩陣鍵盤只需要8 個IO 管腳,節(jié)省了8 個管腳,按鍵越多節(jié)省的管腳越多,這就是矩陣鍵盤的優(yōu)點,當然其缺點就是判斷具體按鍵的過程要復雜一下,這是以軟件的復雜性來換取硬件資源的節(jié)省的。
在Keil 平臺上建立工程文件并編輯程序,匯編鏈接產(chǎn)生HEX文件,在Proteus 平臺上連接電路圖,并在單片機芯片的屬性中鏈接對應的HEX 文件,即可以運行單片機應用系統(tǒng)。
圖1 4*4 矩陣鍵盤及顯示
在圖1 中,第0、1、 2、 3 列分別與P1.0、P1.1、 P1.2、 P1.3 相連接,第0、1、 2、 3 行分別與P1.4、 P1.5、P1.6、P1.7 相連接。在程序中可以先對管腳做適當定義,后面的程序就可以只考慮行列位置,而忽略具體管腳。由于采用逐行掃描方式,我們這里只定義列管腳,不定義行管腳。逐行掃描時,只有加到檢查行的信號為0,而其他行和所有列信號為1,4 次掃描的輸出信號我們用4 個元素的一維數(shù)組output 來表示。
sbit COL0=P1^0;
sbit COL1=P1^1;
sbit COL2=P1^2;
sbit COL3=P1^3;
uchar code output[4]={0xEF,0xDF,0xBF,0x7F};
我們用一個函數(shù)getkey( )來實現(xiàn)按鍵的讀入和判斷,當K0~K15 按下時,函數(shù)返回0-F,如果沒有按鍵按下,函數(shù)返回0xFF。下面就是函數(shù)中的關(guān)鍵程序段。每個for 循環(huán)都執(zhí)行4 次循環(huán),相應地對4 行按鍵進行行掃描判別,i 對應第i 行,然后根據(jù)COL0~3的值判別按鍵列的位置,從而得到按鍵值。
if(P1= =0x0F)
result=0xFF;
else
{
for(i=0;i<4;i++)
{
P1=output[i];
if(!COL0) {result=0+4*i;break;}
else if(!COL1) {result=1+4*i;break;}
else if(!COL2) {result=2+4*i;break;}
else if(!COL3) {result=3+4*i;break;}
}
}
有了getkey( )函數(shù),就可以在需要的時候調(diào)用該函數(shù),讀取按鍵值,并進行顯示,下面展示了本程序的主函數(shù)。void main()
{
uchar x=0;
ledtube(x);
while(1)
{
x=getkey();
if(x!=0xff)
ledtube(x);
}
}
其中,ledtube(x)函數(shù)把x 值以數(shù)碼管形式顯示出來,這里的數(shù)碼管與P2 口相連接,數(shù)碼管采用共陰極數(shù)碼管。圖1 中顯示的是當按鍵K9 按下時的運行情況。
上例中還可以通過改變R2 的值,觀察限流電阻的作用,當電阻值由51 歐姆變小時數(shù)碼管亮度增強,而當電阻值由51 歐姆增大時數(shù)碼管亮度減弱,電阻增大到120 歐姆時,數(shù)碼管不亮。
如果以上矩陣鍵盤接線有變化,只需要在定義相應的管腳和output 初始化時做相應的修改即可。也可以按列掃描的方法讀取按鍵值。
圖2 6*6 矩陣鍵盤及顯示
如果增加按鍵數(shù)量,也可以由以上的程序稍作修改,就可以完成相應的任務。同時也可以增加獨立數(shù)碼管的數(shù)量顯示更多的信息。
圖2 是6*6 矩陣鍵盤的連接圖,為簡單起見,將列信號與P1 口相連接,將行信號與P3 口相連接,再增加一個數(shù)碼管,通過修改程序可以實現(xiàn)36 個按鍵的讀入和值的顯示。
兩個數(shù)碼管分別連接到P0 口和P2 口,但是這時必須采用共陽極數(shù)碼管,同時在P0 口的管腳處增加了上拉電阻,上拉電阻值為10K歐姆。這是P0 端口在使用時和其它三個端口的區(qū)別。所有這些設置和現(xiàn)象在仿真環(huán)境下可以輕易做到,圖2 是按下K26 時的運行情況。
本文以矩陣鍵盤的讀取和值的顯示為例,介紹了Proteus 軟件和Keil 軟件在單片機學習中的作用,有效利用好這兩個軟件可以方便介紹電路和指令的作用,提高教學效果。