2021-08-22 13:21:09 索煒達電子 840
項目編號:E421
文件大?。?33K
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述
本文將向你介紹如何利用89c51系列單片機實現(xiàn)數(shù)字鬧鐘。包含時間調(diào)整和鬧鐘設(shè)定(本篇文章面向一點都不懂得小白,很啰嗦,高手略過文字)注意:本文hex文件超過4k,請選擇較大內(nèi)存的單片機
需求分析
首先我們需要了解需求:做一個數(shù)字鬧鐘,可以計時,可以通過按鈕調(diào)時,通過按鈕設(shè)定鬧鈴時間。我們平時所見的數(shù)字鐘,總是有一個‘:’在不停閃動表示頻率。同時時間以時、分、秒的形式顯示。所以我們需要驅(qū)動八個數(shù)碼管,用以實現(xiàn)日、時、分、秒(當然,你也可以選擇月日時分,只要你明白其中運行的原理)。本例將使用閃動的‘.’代替‘:’,使用5個按鈕實現(xiàn)調(diào)時,設(shè)鐘。
標題所需材料
-STC89C52 *1
-7seg mpx8 ca 數(shù)碼管 *1
-10Ω排阻(RX8) *1
-100Ω電阻 *1
-1KΩ電阻*1
-無源蜂鳴器 *1
-晶體管2N4403 *1
-12MHz晶振 *1
-47uF電容 *3
-按鈕 *5
-開關(guān)*1
-導(dǎo)線若干 如果沒有,可以用模擬器實現(xiàn)
電路原理圖
程序設(shè)計
這里是關(guān)鍵的一步,關(guān)系到我們的時鐘能否點亮和正常運行。 時鐘需要計時,并且經(jīng)過顯示才能被我們看到。我們需要單片機在后臺計時,并通過驅(qū)動數(shù)碼管顯示時間。單片機驅(qū)動數(shù)碼管的方式是掃描,我們使用的是7seg-mpx8-ca數(shù)碼管(七段八位數(shù)碼管)
上圖是七段一位數(shù)碼管 只有一個陰極端口和和七個陽極端口,想要讓它顯示數(shù)字需要讓a-g的陽極端按照一定規(guī)律接入高電平,陰極需要接地。a-g和dp都是一個單獨的LED。
#define FOSC 120000L//晶振頻率
void delay(unsigned int ms)
{
unsigned int t = FOSC/1200;//計算周期為12
for(;ms != 0;ms--,t = FOSC/1200)
while(t--);
}
但本文采用單片機內(nèi)置定時/計數(shù)器計算時間。(因為機器周期是可調(diào)的,并且機器在做任何計算的過程中都會占用計算周期,計算的步驟和方式消耗時間是不定的,而且會占用當前線程,所以delay有時是不準確的,占位置的。)
定時器的操作比delay要復(fù)雜一些,但優(yōu)勢在于它計時較為準確(時鐘的必需品),而且計時器不會干擾到我們的主線程(節(jié)約資源)。
上圖為七段八位數(shù)碼管 可以看做八個一位數(shù)碼管共用七段陽極接口。
你可能會想這么多管共用七個端口,它們怎么會顯示不同的數(shù)字呢? 這就是為什么需要掃描的原因了——當我們希望在數(shù)碼管顯示‘12’的時候,需要在第一個數(shù)碼管的七段中輸入‘1’,并且設(shè)置第一個陰極口為低電平,第二個陰極口為高電平,這樣第一個數(shù)碼管顯示‘1’第二個數(shù)碼管黑屏;以極快的速度,再將七段接口輸入‘2’,同時第二個數(shù)碼管置低電平,第一個置高電平,如此循環(huán)。這樣就造成了交替閃爍的‘12’。由于人眼有視覺殘留,所以看到的是靜止的‘12’(掃描周期小于20ms效果更好)。
講完如何驅(qū)動數(shù)碼管,現(xiàn)在需要考慮如何讓單片機在后臺計時了。 后臺計時的方法有很多種, 有根據(jù)晶振頻率和機器計算周期的比計時。
目錄│文件列表:
└ C52DigitalClock
│ LICENSE.txt
├ keil
│ │ STARTUP.A51
│ │ timer2.c
│ │ timer2.uvgui.Klaoye
│ │ timer2.uvopt
│ │ timer2.uvproj
│ ├ Listings
│ │ │ STARTUP.lst
│ │ │ timer2.lst
│ │ └ timer2.m51
│ └ Objects
│ │ STARTUP.obj
│ │ timer2
│ │ timer2.build_log.htm
│ │ timer2.hex
│ │ timer2.lnp
│ └ timer2.obj
├ pictures
│ │ 1.PNG
│ │ main.PDF
│ │ main.png
│ │ thread.png
│ └ 捕獲.PNG
└ protues
│ Backup Of main.pdsbak
│ Last Loaded main.pdsbak
│ main.pdsprj
└ main.pdsprj.Klaoye-PC.Klaoye.workspace