蘇州健雄職業(yè)技術(shù)學院 趙素玲
使用AT89C51單片機控制一個2片的七段數(shù)碼管,循環(huán)從00~99進行自動顯示。在此時間是可以根據(jù)要求進行調(diào)整的,并不一定是間隔時間為1秒。程序中延時子函數(shù)的延時時間的改變很容易就能進行時間長短的調(diào)整。該程序還很容易實現(xiàn)從99~00的倒計時,這種功能可以通過按鈕開關(guān)的選擇來實現(xiàn),但是加上了按鈕程序,程序就變得更復雜、更長。由于篇幅限制在本文中沒有使用按鈕程序,所以倒計時的程序是單獨給出的。系統(tǒng)的具體要求有以下四點:(1)以AT89C51芯片為核心控制器,加上外圍輔助電路,設(shè)計出系統(tǒng)仿真電路圖;(2)根據(jù)要求用Keil軟件編寫出C語言程序代碼;(3)用一個2位的七段數(shù)碼管自動的從00~99正計時循環(huán)顯示;(4)用一個2位的七段數(shù)碼管自動的從99~00倒計時循環(huán)顯示。
圖1 電路仿真圖
系統(tǒng)仿真電路圖主要由AT89C51單片機芯片、電源、地、石英晶體振蕩電路、復位電路、兩片七段共陰極數(shù)碼管組成。兩個電容C2、C3(30PF)與X1(石英晶體)組成了石英晶體振蕩電路。電阻R1(1K)、電容C1(22UF)構(gòu)成復位電路。P1口控制2位七段數(shù)碼管,P1口輸出字形碼,由于P1口作為輸出口必須接上拉電阻。若是選用其他的三個口作為輸出口則不需要接上拉電阻,這是由AT89C51單片機自身的特點決定的。P2口是片選端,控制兩片數(shù)碼管進行輪流工作。P2口的輸入信號在1111 1110和1111 1101之間快速進行變化,這個變化的速度一定要夠快,若是慢了看起來就不是兩個數(shù)碼管在同時工作了,而是輪流工作。這里用到的是動態(tài)掃描的原理,所謂的動態(tài)掃描就是通過輪流控制兩個數(shù)碼管的片選端,使十位和個位數(shù)碼管輪流工作顯示相應的數(shù)字,這就是動態(tài)掃描。仿真電路中選的是共陰極的七段數(shù)碼管,需要給工作的數(shù)碼管輸入低電平“0”,給不工作的數(shù)碼管輸入高電平“1”。在電路中我選的是AT89C51作為核心控制器,設(shè)計的仿真電路圖如下圖1所示。
系統(tǒng)仿真電路元器件清單列表如表1所示。
表1 元器件清單列表
系統(tǒng)C語言程序代碼,以下為00~99正計數(shù)的秒表程序:
以下為99~00倒計數(shù)的秒表程序,在此倒計時的程序不是以圖片的形式給出的,而是源程序代碼。雙斜線后面的是程序注釋部分,程序在運行的時候是不運行這部分的,注釋是為了更清楚地表達每一條程序含義。#include
delay1ms(uint z)//帶有形參的延時1毫秒延時子函數(shù),可以通過改變Z的值來調(diào)節(jié)延時時間,Z值越大延時時間越長。
uchar x,y;for(x=z;x>0;x++);for(y=100;y>0;y--);void main()//主函數(shù);uchar i,j;//設(shè)變量;while(1)//大循環(huán);for(i=10;i>0;i--)for(j=10;j>0;j--);P2=0xfd;//P2=1111 1101顯示個位。P0=smg1[j-1];//P0口輸出個位字形碼。delay1ms(30);//調(diào)用延時子函數(shù),這里面的Z值不能太大。P2=0xfe;//P2=1111 1110顯示十位。P0=smg1[i-1];//P0口輸出十位位字形碼。delay1ms(30);//調(diào)用延時子函數(shù),這里面的Z值不能太大。
在程序設(shè)計的時候,我們需要先對用到的變量進行初始化設(shè)置,這樣做是為了保證程序可以有效的運行。在程序編寫的時候,為了程序書寫方便,我們通常會把常用到的功能塊編成子函數(shù)的形式。在這個系統(tǒng)的程序中我們用到一個延時子函數(shù),延時時間為1毫秒左右。在調(diào)用這個延時子函數(shù)時,Z值越大延時的時間就越長。共陰極數(shù)碼管的字形碼以一維數(shù)組smg1的形式給出,共陽極數(shù)碼管的字形碼以一維數(shù)組smg2的形式給出。本仿真圖采用的是共陰極數(shù)碼管,所以程序中用的是數(shù)組smg1。若是采用的共陽極數(shù)碼管,程序中用的則是數(shù)組smg2。這部分程序需要在熟悉兩片數(shù)碼管的工作原理、AT89C51的管腳分配及各個管腳的功能、二進制、十六進制計數(shù)的原理和規(guī)則,期中在C語言中)0X表示十六進制的意思,需要掌握一定的數(shù)字電路和C語言的基礎(chǔ)上才能寫出來。
通過仿真可以看出程序完全能實現(xiàn)預期設(shè)想,當然在仿真的過程中也不是一帆風順的,重點在延時函數(shù)Z值的設(shè)定上。Z值太大則容易出現(xiàn)眼睛看起來兩片數(shù)碼管是輪流工作的現(xiàn)象,Z的值太小則會出現(xiàn)秒表跳動太快的現(xiàn)象。所以這個時間若想試的合適需要反復修改,直到看起來比較舒服為止。在此截圖“00”開始狀態(tài)和“99”結(jié)束狀態(tài),由于跳動比較快,正好截下來這兩個點并不容易,另外還截了一個中間的任意狀態(tài)“46”狀態(tài)。仿真圖如下圖2圖3圖4所示。
圖2 “00”起始狀態(tài)仿真截圖
對于這個系統(tǒng)的程序代碼計的是兩位的數(shù)字秒表的自動顯示,其基本原理就是利用動態(tài)掃描的原理。其實對于這樣的系統(tǒng)很容易擴展到更多位的秒表,比如三個數(shù)碼管可以顯示000~999,四位數(shù)碼管則可以顯示0000~9999。文中同時給出了正計和倒計時的程序,程序設(shè)計思路簡單清晰,同時給出了必要的注釋。作為一個實用的秒表程序應該設(shè)計起動、停止按鈕,正、倒計時選擇開關(guān),清零按鈕,多次重復計數(shù)的功能。若是這些功能全加上則程序就變得復雜得多,故在此不在多述。