基于A(yíng)T89C2051的電子鐘設計
電路見(jiàn)圖1.
本文引用地址:http://dyxdggzs.com/article/246452.htm

一片20引腳的單片機AT89C2051為電子鐘主體,其顯示數據從P1口分時(shí)輸出,P3.0~3.3則輸出對應的位選通信號。由于LED數碼管點(diǎn)亮時(shí)耗電較大,故使用了四只PNP型晶體管VT1~VT4進(jìn)行放大。本來(lái)筆者還有一種更簡(jiǎn)的設計方案(見(jiàn)圖2),可省去VT1~VT4及R1~R4八個(gè)元件,但這種設計由于單片機輸出口的灌入電流有限(約20mA),數碼管亮度較暗而不向讀者介紹,除非你采用了高亮度的發(fā)光數碼管。

P3.4、P3.5、3.7外接了三個(gè)輕觸式按鍵,這里我們分別命名為:模式設定鍵set(P3.4)、時(shí)調整鍵hour(P3.5)、分調整鍵min(P3.7)。C1、R13組成上電復位電路。VT5及蜂鳴器Bz為鬧時(shí)訊響電路。三端穩壓器7805輸出的5V電壓供整個(gè)系統工作。此電子鐘可與任何9~20V/100mA的交直流電源適配器配合工作,適應性強。
電子鐘功能
1.走時(shí):通過(guò)模式設定鍵set選擇為走時(shí),U1、U2顯示小時(shí),U3、U4顯示分。U2的小數點(diǎn)為秒點(diǎn),每秒閃爍一次。
2.走時(shí)調整:通過(guò)模式設定鍵set選擇為走時(shí)調整,按下hour鍵對U1、U2的走時(shí)“時(shí)”顯示進(jìn)行調整(每0.2秒遞加1)。按下min鍵對U3、U4的走時(shí)“分”顯示進(jìn)行調整(每0.2秒遞加1)。
3.鬧時(shí)調整:通過(guò)模式設定鍵set選擇為鬧時(shí)調整,按下hour鍵對U1、U2的鬧時(shí)“時(shí)”顯示進(jìn)行調整(每0.2秒遞加1)。按下min鍵對U3、U4的鬧時(shí)“分”顯示進(jìn)行調整(每0.2秒遞加1)。
4.鬧時(shí)啟/停設定:通過(guò)模式設定鍵set選擇為鬧時(shí)啟/停設定,按下min鍵U3的小數點(diǎn)點(diǎn)亮,鬧時(shí)功能啟動(dòng);按下hour鍵U3的小數點(diǎn)熄滅,鬧時(shí)功能關(guān)停。
由于電路設計得極其簡(jiǎn)單,因此豐富的功能只能由軟件完成,這里軟件設計成為了關(guān)鍵。下面介紹軟件設計要點(diǎn)。
圖3為主程序狀態(tài)流程。

運行時(shí)建立的主要狀態(tài)標志如下:
flag-掉電標志。掉電后,flag內為一隨機數;重新設定時(shí)間后flag內寫(xiě)入標志數55H.
set-工作模式設定標志。
hour-走時(shí)“時(shí)”單元。
min-走時(shí)“分”單元。
sec-走時(shí)“秒”單元。
dEDA-走時(shí)5mS計數單元
t_hour-鬧時(shí)“時(shí)”單元。
t_min-鬧時(shí)“分”單元。
d_05s-0.5秒位標志。每秒鐘的前0.5秒置1,后0.5秒置0,以使秒點(diǎn)閃爍。
o_f-鬧時(shí)啟/停位標志。鬧時(shí)啟動(dòng)置1,鬧時(shí)關(guān)停置0.
另外將定時(shí)器T0設定為5mS的定時(shí)中斷。這里晶振頻率為12MHz,因此5mS的初值為-5000,但實(shí)際上程序還要作其它運算,使得時(shí)間偏長(cháng),經(jīng)調整為-4800后試驗剛好。計時(shí)單元deda每次中斷均加1.走時(shí)函數判斷deda>=200時(shí)即令秒單元sec加1.同理秒單元sec滿(mǎn)60后令分單元min加1.分單元min滿(mǎn)60后令時(shí)單元hour加1.時(shí)單元hour滿(mǎn)24后清0.
上電后,首先進(jìn)行初始化,對各狀態(tài)標志、輸入輸出口及定時(shí)器T0進(jìn)行初始化工作,以適應后面程序的要求。
隨后程序判斷有無(wú)set鍵按下,如按下,則set鍵值從0起加1.set鍵值只能從0加到3,然后又回到0.
接下來(lái),根據鍵值進(jìn)行散轉。若set=0,運行走時(shí)程序;若set=1,進(jìn)入調整鬧時(shí)時(shí)間程序;若set=2,進(jìn)入調整走時(shí)時(shí)間程序;若set=3,顯示已調好的鬧時(shí)時(shí)間,同時(shí)進(jìn)入啟/停鬧時(shí)程序。
散轉完后,進(jìn)行判斷掉電標志flag是否等于55H.若不等,說(shuō)明剛開(kāi)機上電或運行過(guò)程中掉過(guò)電,這時(shí)四個(gè)數碼管以1Hz的頻率閃爍四個(gè)8字,提示時(shí)間不準;若相等,說(shuō)明未掉電,RAM區內容未變化,時(shí)間準確。
再下來(lái)程序又轉回到初始化之后進(jìn)行循環(huán)運行。
由于使用了四只數碼管密集排列,因此只能采用雙面印刷板設計,圖4、5分別為正面(元件面)、反面的印板圖。尺寸3000milx4000mil(7.62cmx10.16cm)。圖6為計算機輸出的三維仿真印制板。



元件選用
為了走時(shí)準確,晶振X最好選用溫漂小的。四個(gè)數碼管U1~U4可選用發(fā)綠光的,這樣光澤較柔和。蜂鳴器Bz要購買(mǎi)繞線(xiàn)型的電動(dòng)式蜂鳴器(市場(chǎng)上有一種加電壓即工作的蜂鳴器這里不適用),因驅動(dòng)信號為脈沖信號。其它元件一般無(wú)特殊要求。
使用方法
上電后,四個(gè)LED數碼管閃爍四個(gè)8字。
按一下set鍵,閃爍現象消失(此時(shí)set=1),U1的小數點(diǎn)亮,說(shuō)明此刻可以調整鬧時(shí)時(shí)間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調整好的數據被同時(shí)送入RAM區的鬧時(shí)記憶“時(shí)”單元t_hour和鬧時(shí)記憶“分”單元t_min.
再按一下set鍵,set=2,U2的小數點(diǎn)亮,此刻可以調整走時(shí)時(shí)間。按下hour鍵,U1、U2作加法;按下min鍵,U3、U4作加法。這些調整好的數據也被同步送入RAM區的“時(shí)”記憶單元hour和“分”記憶單元min.
再按一下set鍵,set=3,顯示剛才調整的鬧時(shí)時(shí)間,此刻可以選擇啟動(dòng)/關(guān)停鬧時(shí)。按下min鍵,o_f位標志置1,U3的小數點(diǎn)亮,鬧時(shí)啟動(dòng);按下hour鍵,o_f位標志置0,U3的小數點(diǎn)滅,鬧時(shí)關(guān)閉。
若再按一下set鍵,set=0,電路進(jìn)入走時(shí)狀態(tài),U1、U2顯示小時(shí),U3、U4顯示分。U2的小數點(diǎn)作秒點(diǎn)閃爍。
在鬧時(shí)啟動(dòng)的情況下,走時(shí)到達設定鬧時(shí),則蜂鳴器Bz鳴響一分鐘進(jìn)行提醒。
附:用C51編寫(xiě)的源程序清單(已由實(shí)驗板運行通過(guò))
#include /*包含器件配置文件*/
#define uchar unsigned char
#define uint unsigned int
char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,};/*0~9的數碼管段碼*/
uchar hour=0,min=0,sec=0; /*時(shí)、分、秒單元清零*/
uchar deda=0; /*5mS計數單元清零*/
uchar t_hour=0,t_min=0; /*鬧時(shí)時(shí)、分單元清零*/
bit d_05s=0; /*0.5秒標志*/
bit o_f=0; /*鬧時(shí)啟/停標志*/
uchar set=0; /*模式設定標志*/
uchar m=0;
uchar flag=0; /*RAM掉電標志*/
void delay(uint k); /*延時(shí)子函數*/
void conv(); /*走時(shí)單元轉換*/
void p_out(); /*判別鬧時(shí)到否子函數*/
void dirve(); /*走時(shí)時(shí)間輸出驅動(dòng)子函數*/
void t_dirve(); /*鬧時(shí)時(shí)間輸出驅動(dòng)子函數*/
/*鬧時(shí)啟/停子函數*/
void time1_of()
{uchar m;
if(P3_7==0)delay(1);
if(P3_7==0)o_f=1;
for(m=0;m<30;m++)
{
t_dirve();
P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);
if(P3_1==0){if(o_f==1)P1_7=0;}else P1_7=1;
delay(1);
}
if(P3_5==0)delay(1);
if(P3_5==0) o_f=0;
for(m=0;m<30;m++)
{
t_dirve();
P1=DATA_7SEG[t_min/10];P3=0xfd;delay(1);
if(P3_1==0){if(o_f==1)P1_7=0;else P1_7=1;}
delay(1);
}
}
/*走時(shí)函數*/
void time()
{
conv(); /*走時(shí)單元轉換*/
dirve(); /*走時(shí)時(shí)間輸出驅動(dòng)子函數*/
p_out(); /*判別鬧時(shí)到否子函數*/
蜂鳴器相關(guān)文章:蜂鳴器原理 晶振相關(guān)文章:晶振原理
評論