張正明 王麗娟 石建國 電子科技大學中山學院
單片機課程是電子信息類專業必修的專業課程,是一門綜合性和實踐性都很強的課程,通過該課程的學習,使學生了解單片機的基本原理及其應用,了解匯編指令功能、編程方法,掌握單片機應用系統的硬件組成,能夠使用C51 語言進行軟件開發,培養學生分析、解決實際問題的能力。
在進行傳統的理論教學時,要想課堂教學安排生動、有趣,難度比較大,難以讓學生看到電路變化、程序變化對實驗結果的影響,難有切身感受;在進行實踐教學時,受教學場地、設備數量和實驗箱產品更新慢等因素的影響,操作靈活性有限。鑒于此,我們在教學過程中引入 Proteus 軟件和Keil 軟件,可以方便地在 Proteus 平臺上中繪制和修改硬件電路圖,加深學生對單片機應用系統硬件電路的理解;在 Keil 軟件中編寫和修改相應指令,然后在 Proteus 平臺上進行聯合仿真。
在虛擬的硬件平臺上看到程序運行的結果,可以加深學生對電路連接和指令功能的理解。這樣,課堂上方便老師演示和講解,實驗課上和課下方便學生進行各種應用的設計,激發學生學習的興趣和積極性,增強學習效果。
發揮Proteus 軟件和 Keil 軟件的聯合應用,可以節約耗材,縮短開發周期,具有逼真效果。下面以矩陣鍵盤的輸入和數值顯示為例說明該方法的優勢。
4*4 矩陣鍵盤,共16 個按鍵,如果連接成獨立按鍵就需要16 個IO 管腳,而連接成矩陣鍵盤只需要8 個IO 管腳,節省了8 個管腳,按鍵越多節省的管腳越多,這就是矩陣鍵盤的優點,當然其缺點就是判斷具體按鍵的過程要復雜一下,這是以軟件的復雜性來換取硬件資源的節省的。
在Keil 平臺上建立工程文件并編輯程序,匯編鏈接產生HEX文件,在Proteus 平臺上連接電路圖,并在單片機芯片的屬性中鏈接對應的HEX 文件,即可以運行單片機應用系統。

圖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 個元素的一維數組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};
我們用一個函數getkey( )來實現按鍵的讀入和判斷,當K0~K15 按下時,函數返回0-F,如果沒有按鍵按下,函數返回0xFF。下面就是函數中的關鍵程序段。每個for 循環都執行4 次循環,相應地對4 行按鍵進行行掃描判別,i 對應第i 行,然后根據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( )函數,就可以在需要的時候調用該函數,讀取按鍵值,并進行顯示,下面展示了本程序的主函數。void main()
{
uchar x=0;
ledtube(x);
while(1)
{
x=getkey();
if(x!=0xff)
ledtube(x);
}
}
其中,ledtube(x)函數把x 值以數碼管形式顯示出來,這里的數碼管與P2 口相連接,數碼管采用共陰極數碼管。圖1 中顯示的是當按鍵K9 按下時的運行情況。
上例中還可以通過改變R2 的值,觀察限流電阻的作用,當電阻值由51 歐姆變小時數碼管亮度增強,而當電阻值由51 歐姆增大時數碼管亮度減弱,電阻增大到120 歐姆時,數碼管不亮。
如果以上矩陣鍵盤接線有變化,只需要在定義相應的管腳和output 初始化時做相應的修改即可。也可以按列掃描的方法讀取按鍵值。

圖2 6*6 矩陣鍵盤及顯示
如果增加按鍵數量,也可以由以上的程序稍作修改,就可以完成相應的任務。同時也可以增加獨立數碼管的數量顯示更多的信息。
圖2 是6*6 矩陣鍵盤的連接圖,為簡單起見,將列信號與P1 口相連接,將行信號與P3 口相連接,再增加一個數碼管,通過修改程序可以實現36 個按鍵的讀入和值的顯示。
兩個數碼管分別連接到P0 口和P2 口,但是這時必須采用共陽極數碼管,同時在P0 口的管腳處增加了上拉電阻,上拉電阻值為10K歐姆。這是P0 端口在使用時和其它三個端口的區別。所有這些設置和現象在仿真環境下可以輕易做到,圖2 是按下K26 時的運行情況。
本文以矩陣鍵盤的讀取和值的顯示為例,介紹了Proteus 軟件和Keil 軟件在單片機學習中的作用,有效利用好這兩個軟件可以方便介紹電路和指令的作用,提高教學效果。