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