蘇州健雄職業技術學院 趙素玲
使用AT89C51單片機控制一個2片的七段數碼管,循環從00~99進行自動顯示。在此時間是可以根據要求進行調整的,并不一定是間隔時間為1秒。程序中延時子函數的延時時間的改變很容易就能進行時間長短的調整。該程序還很容易實現從99~00的倒計時,這種功能可以通過按鈕開關的選擇來實現,但是加上了按鈕程序,程序就變得更復雜、更長。由于篇幅限制在本文中沒有使用按鈕程序,所以倒計時的程序是單獨給出的。系統的具體要求有以下四點:(1)以AT89C51芯片為核心控制器,加上外圍輔助電路,設計出系統仿真電路圖;(2)根據要求用Keil軟件編寫出C語言程序代碼;(3)用一個2位的七段數碼管自動的從00~99正計時循環顯示;(4)用一個2位的七段數碼管自動的從99~00倒計時循環顯示。

圖1 電路仿真圖
系統仿真電路圖主要由AT89C51單片機芯片、電源、地、石英晶體振蕩電路、復位電路、兩片七段共陰極數碼管組成。兩個電容C2、C3(30PF)與X1(石英晶體)組成了石英晶體振蕩電路。電阻R1(1K)、電容C1(22UF)構成復位電路。P1口控制2位七段數碼管,P1口輸出字形碼,由于P1口作為輸出口必須接上拉電阻。若是選用其他的三個口作為輸出口則不需要接上拉電阻,這是由AT89C51單片機自身的特點決定的。P2口是片選端,控制兩片數碼管進行輪流工作。P2口的輸入信號在1111 1110和1111 1101之間快速進行變化,這個變化的速度一定要夠快,若是慢了看起來就不是兩個數碼管在同時工作了,而是輪流工作。這里用到的是動態掃描的原理,所謂的動態掃描就是通過輪流控制兩個數碼管的片選端,使十位和個位數碼管輪流工作顯示相應的數字,這就是動態掃描。仿真電路中選的是共陰極的七段數碼管,需要給工作的數碼管輸入低電平“0”,給不工作的數碼管輸入高電平“1”。在電路中我選的是AT89C51作為核心控制器,設計的仿真電路圖如下圖1所示。
系統仿真電路元器件清單列表如表1所示。

表1 元器件清單列表
系統C語言程序代碼,以下為00~99正計數的秒表程序:
以下為99~00倒計數的秒表程序,在此倒計時的程序不是以圖片的形式給出的,而是源程序代碼。雙斜線后面的是程序注釋部分,程序在運行的時候是不運行這部分的,注釋是為了更清楚地表達每一條程序含義。#include
delay1ms(uint z)//帶有形參的延時1毫秒延時子函數,可以通過改變Z的值來調節延時時間,Z值越大延時時間越長。
uchar x,y;for(x=z;x>0;x++);for(y=100;y>0;y--);void main()//主函數;uchar i,j;//設變量;while(1)//大循環;for(i=10;i>0;i--)for(j=10;j>0;j--);P2=0xfd;//P2=1111 1101顯示個位。P0=smg1[j-1];//P0口輸出個位字形碼。delay1ms(30);//調用延時子函數,這里面的Z值不能太大。P2=0xfe;//P2=1111 1110顯示十位。P0=smg1[i-1];//P0口輸出十位位字形碼。delay1ms(30);//調用延時子函數,這里面的Z值不能太大。
在程序設計的時候,我們需要先對用到的變量進行初始化設置,這樣做是為了保證程序可以有效的運行。在程序編寫的時候,為了程序書寫方便,我們通常會把常用到的功能塊編成子函數的形式。在這個系統的程序中我們用到一個延時子函數,延時時間為1毫秒左右。在調用這個延時子函數時,Z值越大延時的時間就越長。共陰極數碼管的字形碼以一維數組smg1的形式給出,共陽極數碼管的字形碼以一維數組smg2的形式給出。本仿真圖采用的是共陰極數碼管,所以程序中用的是數組smg1。若是采用的共陽極數碼管,程序中用的則是數組smg2。這部分程序需要在熟悉兩片數碼管的工作原理、AT89C51的管腳分配及各個管腳的功能、二進制、十六進制計數的原理和規則,期中在C語言中)0X表示十六進制的意思,需要掌握一定的數字電路和C語言的基礎上才能寫出來。
通過仿真可以看出程序完全能實現預期設想,當然在仿真的過程中也不是一帆風順的,重點在延時函數Z值的設定上。Z值太大則容易出現眼睛看起來兩片數碼管是輪流工作的現象,Z的值太小則會出現秒表跳動太快的現象。所以這個時間若想試的合適需要反復修改,直到看起來比較舒服為止。在此截圖“00”開始狀態和“99”結束狀態,由于跳動比較快,正好截下來這兩個點并不容易,另外還截了一個中間的任意狀態“46”狀態。仿真圖如下圖2圖3圖4所示。

圖2 “00”起始狀態仿真截圖
對于這個系統的程序代碼計的是兩位的數字秒表的自動顯示,其基本原理就是利用動態掃描的原理。其實對于這樣的系統很容易擴展到更多位的秒表,比如三個數碼管可以顯示000~999,四位數碼管則可以顯示0000~9999。文中同時給出了正計和倒計時的程序,程序設計思路簡單清晰,同時給出了必要的注釋。作為一個實用的秒表程序應該設計起動、停止按鈕,正、倒計時選擇開關,清零按鈕,多次重復計數的功能。若是這些功能全加上則程序就變得復雜得多,故在此不在多述。