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