久久久性爱视频,青娱乐这里只有精品狼牙,在线日韩av资源播放网站,掩去也俺来也久久丁香图

0 賣盤(pán)信息
BOM詢價(jià)
您現(xiàn)在的位置: 首頁(yè) > 技術(shù)方案 >工業(yè)控制 > 基于AT89C2051單片機(jī)自制倒計(jì)時(shí)器設(shè)計(jì)方案

基于AT89C2051單片機(jī)自制倒計(jì)時(shí)器設(shè)計(jì)方案

來(lái)源: elecfans
2021-11-18
類別:工業(yè)控制
eye 10
文章創(chuàng)建人 拍明

原標(biāo)題:基于AT89C2051單片機(jī)自制倒計(jì)時(shí)器設(shè)計(jì)方案

基于AT89C2051單片機(jī)自制倒計(jì)時(shí)器設(shè)計(jì)方案

倒計(jì)時(shí)器在日常生活中應(yīng)用廣泛,無(wú)論是廚房計(jì)時(shí)、運(yùn)動(dòng)計(jì)時(shí)、學(xué)習(xí)提醒,還是工業(yè)控制中的延時(shí)操作,都離不開(kāi)精確的計(jì)時(shí)功能。隨著微控制器技術(shù)的飛速發(fā)展,利用單片機(jī)設(shè)計(jì)倒計(jì)時(shí)器已成為一種主流且高效的方案。在眾多單片機(jī)型號(hào)中,AT89C2051以其高性價(jià)比、易用性、豐富的片內(nèi)外設(shè)和成熟的開(kāi)發(fā)環(huán)境,成為個(gè)人愛(ài)好者和初學(xué)者進(jìn)行電子設(shè)計(jì)實(shí)踐的理想選擇。本文將詳細(xì)闡述基于AT89C2051單片機(jī)設(shè)計(jì)自制倒計(jì)時(shí)器的完整方案,包括系統(tǒng)架構(gòu)、硬件設(shè)計(jì)、軟件編程、元器件選型與作用分析,旨在提供一份詳盡且可操作的設(shè)計(jì)指南。

image.png

1. 設(shè)計(jì)目標(biāo)與功能需求

本設(shè)計(jì)方案旨在實(shí)現(xiàn)一個(gè)功能完善、操作簡(jiǎn)便的倒計(jì)時(shí)器。具體功能需求包括:

  • 計(jì)時(shí)范圍廣: 能夠設(shè)置從1秒到99分鐘59秒的倒計(jì)時(shí)。

  • 顯示直觀: 采用LED數(shù)碼管顯示剩余時(shí)間,清晰易讀。

  • 操作便捷: 具備時(shí)間設(shè)置(分鐘、秒)、啟動(dòng)/暫停、復(fù)位等功能按鍵。

  • 計(jì)時(shí)精確: 確保倒計(jì)時(shí)時(shí)間的準(zhǔn)確性。

  • 多種提醒方式: 倒計(jì)時(shí)結(jié)束時(shí)能夠發(fā)出聲光報(bào)警。

  • 低功耗: 在空閑狀態(tài)下盡可能降低功耗。

  • 掉電保存(可選): 具有倒計(jì)時(shí)設(shè)置值掉電保存功能,方便下次使用(本方案暫不實(shí)現(xiàn),但可作為后續(xù)擴(kuò)展)。


2. 系統(tǒng)整體架構(gòu)

基于AT89C2051單片機(jī)的倒計(jì)時(shí)器系統(tǒng)主要由以下幾個(gè)核心模塊構(gòu)成:

  • 主控制器模塊: 以AT89C2051單片機(jī)為核心,負(fù)責(zé)整個(gè)系統(tǒng)的協(xié)調(diào)與控制,包括時(shí)間計(jì)算、顯示驅(qū)動(dòng)、按鍵檢測(cè)、報(bào)警控制等。

  • 時(shí)鐘模塊: 為單片機(jī)提供精確的時(shí)鐘信號(hào),確保計(jì)時(shí)準(zhǔn)確性。

  • 顯示模塊: 采用多位共陽(yáng)極或共陰極LED數(shù)碼管顯示倒計(jì)時(shí)時(shí)間。

  • 按鍵輸入模塊: 用于用戶設(shè)置時(shí)間、啟動(dòng)、暫停和復(fù)位操作。

  • 報(bào)警輸出模塊: 倒計(jì)時(shí)結(jié)束時(shí)發(fā)出聲音和/或光線提示。

  • 電源模塊: 為整個(gè)系統(tǒng)提供穩(wěn)定可靠的直流電源。

系統(tǒng)框圖如下:

       +-------------------+
       |                   |
       |  電源模塊         |
       |  (穩(wěn)壓、濾波)     |
       |                   |
       +---------+---------+
                 |
                 V
       +-------------------+
       |                   |
       |  AT89C2051        |
       |  主控制器         |
       |  (CPU, 定時(shí)器, I/O)|
       |                   |
       +---------+---------+
                 |
       +---------+---------+
       |         |         |
       V         V         V
+----------+ +----------+ +----------+
|          | |          | |          |
| 時(shí)鐘模塊 | | 顯示模塊 | | 按鍵模塊 |
| (晶振)   | | (數(shù)碼管) | | (按鍵)   |
|          | |          | |          |
+----------+ +----------+ +----------+
                 |
                 V
       +-------------------+
       |                   |
       |  報(bào)警輸出模塊     |
       |  (蜂鳴器, LED)    |
       |                   |
       +-------------------+

3. 核心元器件選型與作用分析

3.1 微控制器:AT89C2051

選型理由: AT89C2051是一款高性能、低功耗的CMOS 8位微控制器,具備2KB的Flash可編程和可擦除只讀存儲(chǔ)器(PEROM)。其主要優(yōu)點(diǎn)包括:

  • 體積小巧: 20引腳PDIP封裝,占用PCB空間小,適合小型化產(chǎn)品設(shè)計(jì)。

  • 功能集成度高: 內(nèi)部集成了CPU、FLASH存儲(chǔ)器、RAM、定時(shí)器/計(jì)數(shù)器、串行口、并行I/O口等,無(wú)需太多外部元件即可構(gòu)建完整系統(tǒng)。

  • 兼容性強(qiáng): 與MCS-51指令集完全兼容,方便開(kāi)發(fā)者移植現(xiàn)有代碼或利用成熟的開(kāi)發(fā)工具。

  • 性價(jià)比高: 價(jià)格低廉,適合個(gè)人項(xiàng)目或小批量生產(chǎn)。

  • 功耗低: 特別適合電池供電的應(yīng)用場(chǎng)景。

  • 定時(shí)器/計(jì)數(shù)器資源: 擁有2個(gè)16位定時(shí)器/計(jì)數(shù)器(Timer0和Timer1),為實(shí)現(xiàn)精確計(jì)時(shí)提供了硬件支持。

元器件功能:

  • CPU: 執(zhí)行程序指令,控制整個(gè)系統(tǒng)的運(yùn)行。

  • FLASH存儲(chǔ)器: 存儲(chǔ)用戶程序代碼和數(shù)據(jù)。

  • RAM: 提供運(yùn)行時(shí)的數(shù)據(jù)存儲(chǔ)空間。

  • I/O端口: P1和P3端口,用于連接按鍵、數(shù)碼管、蜂鳴器等外部設(shè)備,實(shí)現(xiàn)輸入輸出控制。

  • 定時(shí)器/計(jì)數(shù)器(Timer0/Timer1): 在本設(shè)計(jì)中主要用于產(chǎn)生精確的時(shí)間基準(zhǔn),例如1毫秒或1秒的定時(shí)中斷,以驅(qū)動(dòng)倒計(jì)時(shí)更新和數(shù)碼管動(dòng)態(tài)掃描。

  • 中斷系統(tǒng): 響應(yīng)定時(shí)器中斷和外部中斷(如按鍵中斷),確保程序的實(shí)時(shí)性。

3.2 時(shí)鐘晶振:12MHz 晶體振蕩器

選型理由: 晶體振蕩器是單片機(jī)正常工作所需的時(shí)鐘源。選擇12MHz是因?yàn)椋?/span>

  • 易于計(jì)算: 對(duì)于MCS-51系列單片機(jī),一個(gè)機(jī)器周期通常是12個(gè)振蕩周期。使用12MHz晶振,一個(gè)機(jī)器周期就是1微秒(1us),方便進(jìn)行精確的時(shí)間計(jì)算和定時(shí)器設(shè)置。例如,設(shè)置1ms的定時(shí)器中斷,只需將定時(shí)器重裝載值設(shè)置為(65536 - 1000)即可。

  • 穩(wěn)定性好: 晶體振蕩器提供非常穩(wěn)定的頻率,確保計(jì)時(shí)精度。

  • 常見(jiàn)標(biāo)準(zhǔn): 12MHz是51系列單片機(jī)最常用的晶振頻率之一,易于獲取。

元器件功能:

  • 提供時(shí)鐘脈沖: 為AT89C2051提供穩(wěn)定的時(shí)鐘信號(hào),驅(qū)動(dòng)單片機(jī)內(nèi)部所有操作的時(shí)序。

  • 決定指令執(zhí)行速度: 晶振頻率越高,單片機(jī)執(zhí)行指令的速度越快。

配套元件: 兩個(gè)20pF~33pF的瓷片電容(型號(hào)如22pF,耐壓值大于電源電壓)與晶振并聯(lián)接地,用于濾除噪聲和穩(wěn)定振蕩。為啥選擇20pF~33pF瓷片電容: 這些電容作為負(fù)載電容,與晶振構(gòu)成諧振電路,用于精確調(diào)節(jié)晶振的振蕩頻率,并提供穩(wěn)定的振蕩波形。它們的具體容值通常由晶振制造商推薦,在此范圍內(nèi)選擇是為了確保晶振能穩(wěn)定起振并工作在其標(biāo)稱頻率上。

3.3 顯示器件:4位共陽(yáng)極LED數(shù)碼管(如CL5641AH)

選型理由:

  • 顯示直觀: 數(shù)字顯示清晰明了,符合倒計(jì)時(shí)器的使用習(xí)慣。

  • 成本低廉: 數(shù)碼管相對(duì)于LCD等顯示器件成本更低。

  • 驅(qū)動(dòng)簡(jiǎn)單: 通過(guò)單片機(jī)I/O口直接驅(qū)動(dòng)或通過(guò)譯碼器/驅(qū)動(dòng)芯片驅(qū)動(dòng)。本設(shè)計(jì)采用單片機(jī)I/O口進(jìn)行動(dòng)態(tài)掃描驅(qū)動(dòng),節(jié)省成本和PCB空間。

  • 易于編程控制: 通過(guò)查表法或位操作即可實(shí)現(xiàn)數(shù)字顯示。

  • 共陽(yáng)極(或共陰極)選擇: 共陽(yáng)極數(shù)碼管需要高電平(1)熄滅,低電平(0)點(diǎn)亮相應(yīng)段;共陰極數(shù)碼管則相反。本設(shè)計(jì)選擇共陽(yáng)極,因?yàn)?1單片機(jī)的P0口需要外接上拉電阻才能輸出高電平,但P1、P3口可以直接輸出高低電平。如果使用P0口作為段選,則可以考慮共陰極;如果使用P1/P3口作為段選,共陽(yáng)極更方便驅(qū)動(dòng)(低電平點(diǎn)亮)。鑒于AT89C2051的I/O口數(shù)量有限,可能需要將P1和部分P3口用于段選和位選,因此選擇共陽(yáng)極或共陰極都可以,但要對(duì)應(yīng)好驅(qū)動(dòng)方式。為了簡(jiǎn)化電路,本設(shè)計(jì)假設(shè)采用共陽(yáng)極,通過(guò)P1口作為段碼輸出,P3口作為位選輸出。

元器件功能:

  • 顯示數(shù)字: 由7個(gè)筆段(a-g)和一個(gè)小數(shù)點(diǎn)(DP)組成,通過(guò)點(diǎn)亮不同筆段來(lái)顯示0-9及其他字符。

  • 顯示時(shí)間: 四位數(shù)碼管可以分別顯示分鐘的十位、個(gè)位和秒的十位、個(gè)位。

配套元件:

  • 限流電阻: 每個(gè)數(shù)碼管的段碼輸入端都需要串聯(lián)一個(gè)限流電阻(如220歐姆~1K歐姆,具體取決于數(shù)碼管的導(dǎo)通電壓和單片機(jī)的輸出能力,一般選用220歐姆~330歐姆)來(lái)限制流過(guò)LED的電流,防止LED燒毀,并使發(fā)光亮度均勻。為啥選擇限流電阻: LED是電流型器件,通過(guò)的電流必須限制在一個(gè)安全范圍內(nèi),否則會(huì)因?yàn)檫^(guò)電流而損壞。同時(shí),限流電阻也能確保各個(gè)段的亮度一致。

  • 三極管(如S8050 NPN型)或ULN2003達(dá)林頓管陣列: 用于驅(qū)動(dòng)數(shù)碼管的位選。由于單片機(jī)的I/O口驅(qū)動(dòng)能力有限,無(wú)法直接驅(qū)動(dòng)整個(gè)數(shù)碼管,需要通過(guò)三極管或ULN2003進(jìn)行電流放大。對(duì)于共陽(yáng)極數(shù)碼管,位選信號(hào)是低電平有效,因此需要NPN型三極管作為開(kāi)關(guān),當(dāng)基極接收到單片機(jī)輸出的低電平信號(hào)時(shí),三極管導(dǎo)通,使得數(shù)碼管的公共陽(yáng)極接地(或通過(guò)三極管連接到地),從而點(diǎn)亮相應(yīng)的數(shù)碼管。通常選擇S8050(NPN)或S8550(PNP)等常見(jiàn)小功率三極管。為啥選擇S8050: S8050是一種通用NPN型晶體管,其集電極電流(Ic)可達(dá)500mA,完全能夠滿足驅(qū)動(dòng)一位數(shù)碼管所需的電流。其開(kāi)關(guān)特性良好,飽和壓降低,適合作為開(kāi)關(guān)管使用。使用多個(gè)S8050可以獨(dú)立控制每個(gè)數(shù)碼管的亮滅,配合單片機(jī)的動(dòng)態(tài)掃描實(shí)現(xiàn)多位數(shù)碼管顯示。

3.4 按鍵輸入:輕觸按鍵(如KSC系列)

選型理由:

  • 手感好: 輕觸按鍵操作舒適,回彈迅速。

  • 成本低: 價(jià)格便宜,廣泛應(yīng)用于各類電子產(chǎn)品。

  • 體積?。?/strong> 占用空間小,方便布局。

  • 易于連接: 直接與單片機(jī)I/O口連接即可。

元器件功能:

  • 輸入控制信號(hào): 用于設(shè)置時(shí)間(分鐘加、秒加)、啟動(dòng)/暫停計(jì)時(shí)、復(fù)位計(jì)時(shí)等操作。

配套元件:

  • 上拉電阻: 一般每個(gè)按鍵都需外接一個(gè)10K歐姆的上拉電阻到VCC。為啥選擇上拉電阻: 當(dāng)按鍵未按下時(shí),按鍵所在的I/O口通過(guò)上拉電阻被拉到高電平(VCC),確保輸入信號(hào)的確定性。當(dāng)按鍵按下時(shí),按鍵將I/O口直接連接到地,使I/O口變?yōu)榈碗娖健_@樣單片機(jī)就能 reliably 地檢測(cè)到按鍵的按下?tīng)顟B(tài),避免了I/O口懸空時(shí)產(chǎn)生的不確定狀態(tài)。

3.5 報(bào)警輸出:無(wú)源蜂鳴器或有源蜂鳴器、LED指示燈

選型理由:

  • 蜂鳴器: 提供聲音報(bào)警,提醒用戶倒計(jì)時(shí)結(jié)束。

    • 無(wú)源蜂鳴器: 需要單片機(jī)提供一定頻率的方波信號(hào)來(lái)驅(qū)動(dòng)發(fā)聲,可以發(fā)出不同音調(diào)的聲音,編程靈活性高。

    • 有源蜂鳴器: 內(nèi)部集成振蕩電路,只需提供直流電壓即可發(fā)聲,使用簡(jiǎn)單。本設(shè)計(jì)推薦使用無(wú)源蜂鳴器: 雖然需要額外編程驅(qū)動(dòng),但可以控制發(fā)聲頻率和時(shí)長(zhǎng),實(shí)現(xiàn)更豐富的報(bào)警效果,例如短促的“滴滴”聲或連續(xù)的報(bào)警聲。

  • LED指示燈: 提供視覺(jué)報(bào)警,與聲音報(bào)警互補(bǔ),尤其在嘈雜環(huán)境下更有效。紅色或綠色LED都可以。

元器件功能:

  • 蜂鳴器: 倒計(jì)時(shí)結(jié)束時(shí)發(fā)出聲音報(bào)警。

  • LED指示燈: 倒計(jì)時(shí)結(jié)束時(shí)閃爍或常亮,提供視覺(jué)報(bào)警。

配套元件:

  • 三極管(如S8050 NPN型): 如果單片機(jī)I/O口驅(qū)動(dòng)能力不足以直接驅(qū)動(dòng)蜂鳴器或LED(尤其是蜂鳴器,需要較大電流),則需要通過(guò)三極管進(jìn)行電流放大。蜂鳴器通常需要通過(guò)三極管驅(qū)動(dòng)。LED指示燈通常直接串聯(lián)一個(gè)限流電阻(如220歐姆~1K歐姆)連接到單片機(jī)I/O口即可。為啥選擇S8050: 與驅(qū)動(dòng)數(shù)碼管位選類似,S8050可以作為開(kāi)關(guān),當(dāng)單片機(jī)輸出信號(hào)時(shí),驅(qū)動(dòng)蜂鳴器或LED。

  • 續(xù)流二極管(對(duì)于蜂鳴器): 對(duì)于無(wú)源蜂鳴器,當(dāng)驅(qū)動(dòng)蜂鳴器的三極管關(guān)閉時(shí),蜂鳴器線圈中儲(chǔ)存的能量會(huì)產(chǎn)生反向電動(dòng)勢(shì),可能會(huì)損壞三極管。并聯(lián)一個(gè)快速恢復(fù)二極管(如1N4148或1N4007)在蜂鳴器兩端,可以為反向電動(dòng)勢(shì)提供一個(gè)通路,保護(hù)三極管。

3.6 電源模塊:AMS1117-3.3/5.0V穩(wěn)壓芯片、電解電容、瓷片電容

選型理由:

  • AT89C2051工作電壓: AT89C2051的工作電壓范圍較寬,通常為2.7V至6V。為了方便兼容其他5V邏輯器件,并獲得更好的穩(wěn)定性,通常選擇5V作為系統(tǒng)電源。

  • 穩(wěn)壓: 電池供電或適配器供電時(shí),電壓可能不穩(wěn)定或高于單片機(jī)所需電壓,需要穩(wěn)壓芯片提供穩(wěn)定的5V或3.3V直流電源。

  • AMS1117系列: 是一種常見(jiàn)的低壓差線性穩(wěn)壓器,有多種輸出電壓型號(hào),如AMS1117-5.0V(輸出5V)和AMS1117-3.3V(輸出3.3V)。由于AT89C2051可以工作在5V,且大部分?jǐn)?shù)字邏輯器件也兼容5V,所以選擇AMS1117-5.0V作為首選。其優(yōu)點(diǎn)是壓差小,封裝緊湊,易于使用。

元器件功能:

  • 提供穩(wěn)定電壓: 將外部輸入的較高或不穩(wěn)定的直流電壓(如9V電池或5V USB供電)轉(zhuǎn)換為AT89C2051及其外設(shè)所需的穩(wěn)定直流電壓(通常為5V)。

  • 濾波: 輸入和輸出端的電解電容和瓷片電容用于濾波,去除電源噪聲,使電源更純凈。

配套元件:

  • 輸入電解電容: (如10uF-100uF,耐壓值高于輸入電壓)用于平滑輸入電壓波動(dòng)。

  • 輸出電解電容: (如10uF-100uF,耐壓值高于輸出電壓)用于穩(wěn)定輸出電壓,抑制紋波。

  • 輸入/輸出瓷片電容: (如0.1uF,耐壓值高于輸入/輸出電壓)用于濾除高頻噪聲。為啥選擇這些電容: 大容量電解電容用于低頻濾波和儲(chǔ)能,補(bǔ)償瞬間電流變化;小容量瓷片電容則用于高頻濾波,吸收高頻噪聲,防止其進(jìn)入芯片,確保電源的純凈和芯片的穩(wěn)定工作。

4. 硬件電路設(shè)計(jì)

4.1 單片機(jī)最小系統(tǒng)

AT89C2051單片機(jī)最小系統(tǒng)包括:

  • AT89C2051芯片: 核心處理器。

  • 晶振電路: 12MHz晶振和兩個(gè)22pF瓷片電容。晶振連接到P1.0和P1.1(Xtal1和Xtal2)引腳。

  • 復(fù)位電路: RC復(fù)位電路或按鍵復(fù)位。通常采用一個(gè)10uF電解電容和10K歐姆電阻組成上電復(fù)位,同時(shí)并聯(lián)一個(gè)復(fù)位按鍵到RST引腳,使RST引腳與VCC通過(guò)電阻相連,與地通過(guò)電容和按鍵相連。按鍵按下時(shí),電容放電,RST為低電平;松開(kāi)按鍵后,電容充電,RST為高電平,完成復(fù)位。

Code snippet

graph TD
   A[VCC] --> R1(10KΩ)
   R1 --> RST(AT89C2051 RST引腳)
   RST --> C1(10μF)
   C1 --> G1(GND)
   RST -- 按鍵 --> G2(GND)

   XTAL1(AT89C2051 XTAL1) --> X1(12MHz 晶振)
   XTAL2(AT89C2051 XTAL2) --> X1
   XTAL1 --> C2(22pF)
   C2 --> G3(GND)
   XTAL2 --> C3(22pF)
   C3 --> G4(GND)

4.2 數(shù)碼管顯示電路

本設(shè)計(jì)采用4位共陽(yáng)極LED數(shù)碼管,通過(guò)單片機(jī)進(jìn)行動(dòng)態(tài)掃描驅(qū)動(dòng)。

  • 段碼線: 將數(shù)碼管的a、b、c、d、e、f、g、DP段連接到AT89C2051的P1口(P1.0-P1.7)。每個(gè)段碼線串聯(lián)一個(gè)220歐姆限流電阻。

  • 位選線: 將4位數(shù)碼管的公共陽(yáng)極連接到4個(gè)S8050三極管的集電極。S8050的發(fā)射極接地。S8050的基極分別通過(guò)限流電阻(如1K歐姆)連接到AT89C2051的P3口(P3.0-P3.3)。

工作原理: 單片機(jī)通過(guò)P1口輸出對(duì)應(yīng)數(shù)字的段碼(低電平點(diǎn)亮)。同時(shí),通過(guò)P3口控制S8050三極管的導(dǎo)通,每次只使一個(gè)數(shù)碼管的位選線有效(基極輸出低電平使NPN三極管導(dǎo)通)。通過(guò)快速輪流點(diǎn)亮每位數(shù)碼管,利用人眼的視覺(jué)暫留效應(yīng),實(shí)現(xiàn)多位數(shù)碼管同時(shí)顯示的效果。

Code snippet

graph TD
   A[AT89C2051 P1.0-P1.7 (段碼)] --> R_Seg(220Ω 限流電阻) --> Seg_A_G_DP(數(shù)碼管 段 A-G, DP)

   AT89C2051_P3_0[P3.0 (位選1)] --> R_Base1(1KΩ) --> B1[S8050 基極]
   AT89C2051_P3_1[P3.1 (位選2)] --> R_Base2(1KΩ) --> B2[S8050 基極]
   AT89C2051_P3_2[P3.2 (位選3)] --> R_Base3(1KΩ) --> B3[S8050 基極]
   AT89C2051_P3_3[P3.3 (位選4)] --> R_Base4(1KΩ) --> B4[S8050 基極]

   Num_1_Common[數(shù)碼管1 公共陽(yáng)極] --> S8050_C1(S8050 集電極)
   Num_2_Common[數(shù)碼管2 公共陽(yáng)極] --> S8050_C2(S8050 集電極)
   Num_3_Common[數(shù)碼管3 公共陽(yáng)極] --> S8050_C3(S8050 集電極)
   Num_4_Common[數(shù)碼管4 公共陽(yáng)極] --> S8050_C4(S8050 集電極)

   S8050_E1(S8050 發(fā)射極) --> G_S8050_E1(GND)
   S8050_E2(S8050 發(fā)射極) --> G_S8050_E2(GND)
   S8050_E3(S8050 發(fā)射極) --> G_S8050_E3(GND)
   S8050_E4(S8050 發(fā)射極) --> G_S8050_E4(GND)

4.3 按鍵輸入電路

設(shè)置3-4個(gè)按鍵:

  • S1(SET_MIN): 分鐘加按鍵。連接到AT89C2051的一個(gè)I/O口(如P3.4),上拉電阻到VCC。

  • S2(SET_SEC): 秒加按鍵。連接到AT89C2051的一個(gè)I/O口(如P3.5),上拉電阻到VCC。

  • S3(START/PAUSE): 啟動(dòng)/暫停按鍵。連接到AT89C2051的一個(gè)I/O口(如P3.6),上拉電阻到VCC。

  • S4(RESET): 復(fù)位按鍵。連接到AT89C2051的一個(gè)I/O口(如P3.7),上拉電阻到VCC。

工作原理: 當(dāng)按鍵按下時(shí),I/O口被拉低;當(dāng)按鍵釋放時(shí),I/O口通過(guò)上拉電阻恢復(fù)高電平。單片機(jī)通過(guò)檢測(cè)I/O口的高低電平變化來(lái)判斷按鍵狀態(tài)。為避免按鍵抖動(dòng),軟件中需進(jìn)行消抖處理。

Code snippet

graph TD
   A[VCC] --> R_PullUp1(10KΩ) --> P_IO1(AT89C2051 P3.4)
   P_IO1 --> S1(SET_MIN 按鍵) --> G1(GND)

   VCC --> R_PullUp2(10KΩ) --> P_IO2(AT89C2051 P3.5)
   P_IO2 --> S2(SET_SEC 按鍵) --> G2(GND)

   VCC --> R_PullUp3(10KΩ) --> P_IO3(AT89C2051 P3.6)
   P_IO3 --> S3(START/PAUSE 按鍵) --> G3(GND)

   VCC --> R_PullUp4(10KΩ) --> P_IO4(AT89C2051 P3.7)
   P_IO4 --> S4(RESET 按鍵) --> G4(GND)

4.4 報(bào)警輸出電路

  • 無(wú)源蜂鳴器: 將無(wú)源蜂鳴器的一端連接到S8050三極管的集電極,另一端連接到VCC。S8050的發(fā)射極接地。S8050的基極通過(guò)限流電阻(如1K歐姆)連接到AT89C2051的一個(gè)I/O口(如P1.7,如果P1口有空閑)。蜂鳴器兩端并聯(lián)一個(gè)1N4148續(xù)流二極管。

  • LED指示燈: 將LED的正極通過(guò)220歐姆限流電阻連接到VCC,負(fù)極連接到AT89C2051的一個(gè)I/O口(如P3.0,如果P3口有空閑)。倒計(jì)時(shí)結(jié)束時(shí),單片機(jī)將該I/O口拉低即可點(diǎn)亮LED?;蛘?,正極通過(guò)限流電阻連接到單片機(jī)I/O口,負(fù)極接地,單片機(jī)拉高點(diǎn)亮。為了節(jié)省I/O口,也可以復(fù)用數(shù)碼管的位選口作為報(bào)警LED的驅(qū)動(dòng)口。

Code snippet

graph TD
   AT89C2051_P_Buzzer[P1.7 (蜂鳴器控制)] --> R_Base_Buzzer(1KΩ) --> B_Buzzer[S8050 基極]
   Buzzer_P[蜂鳴器 +] --> VCC_Buzzer(VCC)
   Buzzer_N[蜂鳴器 -] --> S8050_C_Buzzer(S8050 集電極)
   S8050_E_Buzzer(S8050 發(fā)射極) --> G_Buzzer(GND)
   Buzzer_N -- D_Buzzer(1N4148 續(xù)流二極管) --> VCC_Buzzer

   AT89C2051_P_LED[P3.0 (LED控制)] --> R_LED(220Ω) --> LED_P(LED 正極)
   LED_N(LED 負(fù)極) --> G_LED(GND)

4.5 電源電路

  • 外部輸入: 可以是DC 9V適配器(如果使用AMS1117-5.0V),或者直接使用5V USB供電。

  • AMS1117-5.0V穩(wěn)壓: 輸入端接10uF電解電容和0.1uF瓷片電容,輸出端接10uF電解電容和0.1uF瓷片電容。AMS1117的GND引腳接地。

Code snippet

graph TD
   DC_IN[DC_INPUT (如9V)] --> C_IN_E(10μF 電解電容) --> AMS1117_IN(AMS1117-5.0V IN)
   C_IN_P(0.1μF 瓷片電容) --> AMS1117_IN
   AMS1117_GND(AMS1117 GND) --> GND_Power(GND)
   AMS1117_OUT(AMS1117-5.0V OUT) --> C_OUT_E(10μF 電解電容) --> VCC_System(VCC_5V)
   AMS1117_OUT --> C_OUT_P(0.1μF 瓷片電容) --> VCC_System

5. 軟件編程設(shè)計(jì)

軟件設(shè)計(jì)是實(shí)現(xiàn)倒計(jì)時(shí)器功能的關(guān)鍵。采用C語(yǔ)言進(jìn)行編程,結(jié)構(gòu)化、模塊化設(shè)計(jì),提高代碼可讀性和可維護(hù)性。

5.1 開(kāi)發(fā)環(huán)境

  • IDE: Keil uVision

  • 編譯器: Keil C51 Compiler

  • 燒錄工具: STC-ISP(或其他支持AT89C2051的燒錄器)

5.2 軟件模塊劃分

  • 主函數(shù)(main.c): 初始化系統(tǒng),進(jìn)入主循環(huán),處理按鍵事件,調(diào)度顯示和計(jì)時(shí)任務(wù)。

  • 定時(shí)器中斷服務(wù)程序(timer.c): 用于實(shí)現(xiàn)精確計(jì)時(shí)和數(shù)碼管動(dòng)態(tài)掃描。

  • 按鍵處理模塊(key.c): 讀取按鍵狀態(tài),進(jìn)行消抖,并根據(jù)按鍵事件執(zhí)行相應(yīng)操作。

  • 顯示模塊(display.c): 負(fù)責(zé)數(shù)碼管的段碼轉(zhuǎn)換和位選控制,實(shí)現(xiàn)數(shù)字顯示。

  • 報(bào)警模塊(alarm.c): 控制蜂鳴器和LED的報(bào)警輸出。

  • 全局變量定義(globals.h): 定義時(shí)間變量、標(biāo)志位等。

5.3 關(guān)鍵算法與實(shí)現(xiàn)

5.3.1 定時(shí)器配置與中斷

利用AT89C2051的Timer0或Timer1,配置為16位定時(shí)器模式,每隔一定時(shí)間(如1毫秒或10毫秒)觸發(fā)一次中斷。

以Timer0為例,配置為模式1(16位定時(shí)器):

// 假設(shè)晶振為12MHz,機(jī)器周期為1us
// 定時(shí)1ms,則計(jì)數(shù)器需計(jì)數(shù)1000個(gè)機(jī)器周期
// 定時(shí)器初值 = 65536 - 定時(shí)時(shí)間 / 機(jī)器周期
// 定時(shí)1ms,初值 = 65536 - 1000 = 64536 (0xFC18)

void Timer0_Init() {
   TMOD |= 0x01;  // Timer0工作在模式1 (16位定時(shí)器)
   TH0 = 0xFC;    // 定時(shí)器初值高8位
   TL0 = 0x18;    // 定時(shí)器初值低8位
   EA = 1;        // 開(kāi)總中斷
   ET0 = 1;       // 允許Timer0中斷
   TR0 = 1;       // 啟動(dòng)Timer0
}

unsigned int ms_count = 0; // 毫秒計(jì)數(shù)器
unsigned int sec_count = 0; // 秒計(jì)數(shù)器
unsigned char min_display = 0; // 分鐘顯示值
unsigned char sec_display = 0; // 秒顯示值
bit timer_running = 0; // 計(jì)時(shí)器運(yùn)行標(biāo)志
bit alarm_on = 0; // 報(bào)警標(biāo)志

void Timer0_ISR() interrupt 1 { // Timer0中斷服務(wù)程序
   TH0 = 0xFC;    // 重新裝載定時(shí)器初值
   TL0 = 0x18;

   // 毫秒計(jì)數(shù),用于動(dòng)態(tài)掃描和精確計(jì)時(shí)
   ms_count++;

   // 每10ms進(jìn)行一次數(shù)碼管掃描(假設(shè)掃描頻率100Hz)
   // 或者更高頻率,如每1ms掃描一次,提高亮度均勻性
   DisplayScan(); // 數(shù)碼管動(dòng)態(tài)掃描函數(shù)

   if (ms_count >= 1000) { // 每1000ms(即1秒)
       ms_count = 0;
       if (timer_running) { // 如果計(jì)時(shí)器正在運(yùn)行
           if (sec_display > 0) {
               sec_display--;
           } else {
               if (min_display > 0) {
                   min_display--;
                   sec_display = 59;
               } else {
                   // 倒計(jì)時(shí)結(jié)束
                   timer_running = 0; // 停止計(jì)時(shí)
                   alarm_on = 1;      // 啟動(dòng)報(bào)警
               }
           }
       }
   }

   // 報(bào)警處理(例如蜂鳴器每500ms響一次,持續(xù)2秒)
   if (alarm_on) {
       sec_count++; // 報(bào)警持續(xù)時(shí)間計(jì)數(shù)
       if (sec_count % 500 == 0) { // 每500ms翻轉(zhuǎn)蜂鳴器狀態(tài)
           BUZZER_PIN = ~BUZZER_PIN; // 翻轉(zhuǎn)蜂鳴器IO口狀態(tài)
       }
       if (sec_count >= 2000) { // 報(bào)警持續(xù)2秒
           alarm_on = 0;
           sec_count = 0;
           BUZZER_PIN = 1; // 關(guān)閉蜂鳴器 (假設(shè)高電平關(guān)閉)
       }
   }
}

5.3.2 按鍵處理與消抖

采用查詢方式讀取按鍵狀態(tài),并加入軟件消抖。

#define KEY_SET_MIN P3_4
#define KEY_SET_SEC P3_5
#define KEY_START_PAUSE P3_6
#define KEY_RESET P3_7

// 按鍵狀態(tài)變量
unsigned char key_state_min = 0;
unsigned char key_state_sec = 0;
unsigned char key_state_start_pause = 0;
unsigned char key_state_reset = 0;

// 按鍵消抖函數(shù),在主循環(huán)中周期性調(diào)用
void KeyScan() {
   // SET_MIN 按鍵
   if (KEY_SET_MIN == 0) { // 按鍵按下
       delay_ms(10);       // 延時(shí)消抖
       if (KEY_SET_MIN == 0) {
           if (key_state_min == 0) { // 首次按下
               key_state_min = 1;
               // 執(zhí)行分鐘加操作
               if (!timer_running) { // 只有在非計(jì)時(shí)狀態(tài)下才能設(shè)置時(shí)間
                   min_display++;
                   if (min_display > 99) min_display = 0;
               }
           }
       }
   } else { // 按鍵釋放
       key_state_min = 0;
   }

   // SET_SEC 按鍵
   if (KEY_SET_SEC == 0) {
       delay_ms(10);
       if (KEY_SET_SEC == 0) {
           if (key_state_sec == 0) {
               key_state_sec = 1;
               // 執(zhí)行秒加操作
               if (!timer_running) {
                   sec_display++;
                   if (sec_display > 59) sec_display = 0;
               }
           }
       }
   } else {
       key_state_sec = 0;
   }

   // START/PAUSE 按鍵
   if (KEY_START_PAUSE == 0) {
       delay_ms(10);
       if (KEY_START_PAUSE == 0) {
           if (key_state_start_pause == 0) {
               key_state_start_pause = 1;
               // 切換計(jì)時(shí)狀態(tài)
               timer_running = ~timer_running;
               alarm_on = 0; // 暫?;騿?dòng)時(shí)關(guān)閉報(bào)警
               BUZZER_PIN = 1; // 關(guān)閉蜂鳴器
           }
       }
   } else {
       key_state_start_pause = 0;
   }

   // RESET 按鍵
   if (KEY_RESET == 0) {
       delay_ms(10);
       if (KEY_RESET == 0) {
           if (key_state_reset == 0) {
               key_state_reset = 1;
               // 復(fù)位倒計(jì)時(shí)
               min_display = 0;
               sec_display = 0;
               timer_running = 0;
               alarm_on = 0;
               BUZZER_PIN = 1; // 關(guān)閉蜂鳴器
           }
       }
   } else {
       key_state_reset = 0;
   }
}

// 簡(jiǎn)單延時(shí)函數(shù) (實(shí)際應(yīng)用中應(yīng)避免在中斷中調(diào)用,或使用更精確的延時(shí))
void delay_ms(unsigned int ms) {
   unsigned int i, j;
   for (i = 0; i < ms; i++) {
       for (j = 0; j < 1200; j++); // 12MHz晶振,約1ms延時(shí)
   }
}

5.3.3 數(shù)碼管動(dòng)態(tài)掃描顯示

在定時(shí)器中斷中調(diào)用顯示掃描函數(shù),以實(shí)現(xiàn)穩(wěn)定和亮度均勻的顯示。

// 段碼表 (共陽(yáng)極,低電平點(diǎn)亮)
unsigned char code_table[] = {
   0xC0, // 0
   0xF9, // 1
   0xA4, // 2
   0xB0, // 3
   0x99, // 4
   0x92, // 5
   0x82, // 6
   0xF8, // 7
   0x80, // 8
   0x90, // 9
   0xFF  // 熄滅
};

// 位選控制引腳 (假設(shè)共陽(yáng)極,低電平使能位選三極管)
sbit DIG1_EN = P3^0; // 數(shù)碼管1 (分鐘十位)
sbit DIG2_EN = P3^1; // 數(shù)碼管2 (分鐘個(gè)位)
sbit DIG3_EN = P3^2; // 數(shù)碼管3 (秒十位)
sbit DIG4_EN = P3^3; // 數(shù)碼管4 (秒個(gè)位)

// 顯示緩存
unsigned char display_buffer[4]; // 存儲(chǔ)分鐘十位,分鐘個(gè)位,秒十位,秒個(gè)位

void UpdateDisplayBuffer() {
   display_buffer[0] = min_display / 10;
   display_buffer[1] = min_display % 10;
   display_buffer[2] = sec_display / 10;
   display_buffer[3] = sec_display % 10;
}

unsigned char current_digit = 0; // 當(dāng)前掃描的位數(shù)

void DisplayScan() {
   // 先關(guān)閉所有位選,防止重影
   DIG1_EN = 1;
   DIG2_EN = 1;
   DIG3_EN = 1;
   DIG4_EN = 1;

   // 更新顯示數(shù)據(jù)
   UpdateDisplayBuffer();

   switch (current_digit) {
       case 0: // 顯示分鐘十位
           P1 = code_table[display_buffer[0]];
           DIG1_EN = 0;
           break;
       case 1: // 顯示分鐘個(gè)位
           // 如果是分鐘個(gè)位,并且秒位不是0且未計(jì)時(shí),則點(diǎn)亮小數(shù)點(diǎn)作為分隔符
           if (sec_display != 0 && !timer_running) {
               P1 = code_table[display_buffer[1]] & 0x7F; // 0x7F表示點(diǎn)亮小數(shù)點(diǎn)
           } else {
               P1 = code_table[display_buffer[1]];
           }
           DIG2_EN = 0;
           break;
       case 2: // 顯示秒十位
           P1 = code_table[display_buffer[2]];
           DIG3_EN = 0;
           break;
       case 3: // 顯示秒個(gè)位
           P1 = code_table[display_buffer[3]];
           DIG4_EN = 0;
           break;
   }

   current_digit++;
   if (current_digit >= 4) {
       current_digit = 0;
   }
}

5.3.4 主函數(shù)邏輯

#include <reg51.h> // 包含51單片機(jī)頭文件

// 定義I/O口別名 (根據(jù)實(shí)際電路連接修改)
sbit BUZZER_PIN = P1^7; // 蜂鳴器控制引腳

// 全局變量聲明 (在globals.h中聲明,這里為了完整性再次列出)
extern unsigned char min_display;
extern unsigned char sec_display;
extern bit timer_running;
extern bit alarm_on;

// 函數(shù)聲明
void Timer0_Init();
void KeyScan();
void DisplayScan();
void UpdateDisplayBuffer();
void delay_ms(unsigned int ms);


void main() {
   // 初始化系統(tǒng)
   min_display = 0;
   sec_display = 0;
   timer_running = 0;
   alarm_on = 0;
   BUZZER_PIN = 1; // 默認(rèn)關(guān)閉蜂鳴器

   Timer0_Init(); // 初始化定時(shí)器0

   while (1) {
       KeyScan(); // 掃描按鍵

       // 可以在這里添加其他不要求嚴(yán)格實(shí)時(shí)性的任務(wù)
       // 例如:低功耗模式切換 (如果需要)
       // CheckPowerMode();
   }
}

5.4 軟件注意事項(xiàng)

  • 中斷優(yōu)先級(jí): 本設(shè)計(jì)中定時(shí)器中斷是核心,通常設(shè)置為高優(yōu)先級(jí)。按鍵處理可以放在主循環(huán)中。

  • 按鍵消抖: 軟件消抖是必須的,防止一個(gè)按鍵按下被識(shí)別多次。

  • 資源限制: AT89C2051的RAM和FLASH資源有限,編寫(xiě)代碼時(shí)要盡量精簡(jiǎn),避免使用過(guò)于復(fù)雜的算法和過(guò)多的全局變量。

  • 端口復(fù)用: AT89C2051的P1口和P3口是復(fù)用的,設(shè)計(jì)時(shí)要合理分配I/O口資源,避免沖突。例如,P1.0/P1.1用于晶振,P3.0/P3.1是RXD/TXD,P3.2/P3.3是INT0/INT1。

  • 低功耗: 如果是電池供電,可以考慮在空閑時(shí)進(jìn)入單片機(jī)掉電模式,通過(guò)按鍵喚醒。但本設(shè)計(jì)為簡(jiǎn)化,暫未實(shí)現(xiàn)此功能。

6. 調(diào)試與測(cè)試

在完成硬件搭建和軟件編程后,需要進(jìn)行充分的調(diào)試和測(cè)試,確保倒計(jì)時(shí)器功能正常。

  • 分模塊測(cè)試:

    • 電源模塊測(cè)試: 上電后測(cè)量AMS1117的輸出電壓是否穩(wěn)定在5V。

    • 最小系統(tǒng)測(cè)試: 編寫(xiě)一個(gè)簡(jiǎn)單的跑馬燈程序,測(cè)試單片機(jī)是否正常工作,晶振是否起振。

    • 數(shù)碼管顯示測(cè)試: 編寫(xiě)程序,讓數(shù)碼管循環(huán)顯示0-9,檢查所有段和位是否正常點(diǎn)亮,亮度是否均勻。

    • 按鍵測(cè)試: 編寫(xiě)程序,按下按鍵時(shí)點(diǎn)亮一個(gè)LED,測(cè)試按鍵是否能被正確識(shí)別,并觀察消抖效果。

    • 蜂鳴器測(cè)試: 編寫(xiě)程序,讓蜂鳴器發(fā)出聲音,測(cè)試報(bào)警功能。

  • 聯(lián)調(diào): 將各模塊整合,運(yùn)行完整的倒計(jì)時(shí)程序。

    • 計(jì)時(shí)精度測(cè)試: 使用秒表校準(zhǔn)倒計(jì)時(shí)器的計(jì)時(shí)精度,如果偏差大,可能需要微調(diào)定時(shí)器初值或檢查晶振。

    • 按鍵功能測(cè)試: 逐一測(cè)試分鐘加、秒加、啟動(dòng)/暫停、復(fù)位等按鍵功能是否符合預(yù)期。

    • 報(bào)警功能測(cè)試: 倒計(jì)時(shí)結(jié)束時(shí),測(cè)試聲光報(bào)警是否正常觸發(fā)。

    • 穩(wěn)定性測(cè)試: 長(zhǎng)時(shí)間運(yùn)行倒計(jì)時(shí)器,觀察是否有異常現(xiàn)象,如死機(jī)、顯示錯(cuò)亂等。

7. 擴(kuò)展與改進(jìn)

在完成基本功能后,可以考慮以下擴(kuò)展和改進(jìn),提升倒計(jì)時(shí)器的實(shí)用性和用戶體驗(yàn):

  • 掉電保存功能: 使用EEPROM(如24C02)或AT89C2051內(nèi)部的Flash存儲(chǔ),保存設(shè)置的倒計(jì)時(shí)時(shí)間,在下次上電時(shí)自動(dòng)恢復(fù)。

  • 低功耗模式: 引入單片機(jī)睡眠模式,在沒(méi)有計(jì)時(shí)或操作時(shí)進(jìn)入低功耗狀態(tài),延長(zhǎng)電池壽命。通過(guò)按鍵中斷喚醒。

  • 更多的功能模式:

    • 正計(jì)時(shí)模式: 增加秒表功能。

    • 多組預(yù)設(shè)時(shí)間: 允許用戶存儲(chǔ)幾組常用時(shí)間,方便快速調(diào)用。

    • 循環(huán)計(jì)時(shí): 實(shí)現(xiàn)計(jì)時(shí)結(jié)束后自動(dòng)復(fù)位并開(kāi)始下一輪計(jì)時(shí)。

  • 顯示升級(jí):

    • 液晶顯示器(LCD): 如果預(yù)算和I/O口允許,可以使用1602或12864LCD顯示更多信息,如當(dāng)前狀態(tài)、模式等。

    • 更亮的數(shù)碼管: 選擇更高亮度的數(shù)碼管,或者調(diào)整限流電阻值(在安全電流范圍內(nèi))。

  • 更強(qiáng)大的報(bào)警: 增加震動(dòng)電機(jī),實(shí)現(xiàn)無(wú)聲震動(dòng)提醒。

  • 外觀設(shè)計(jì): 設(shè)計(jì)一個(gè)美觀的外殼,提升產(chǎn)品整體質(zhì)感。

  • 溫度補(bǔ)償晶振: 對(duì)于對(duì)計(jì)時(shí)精度要求非常高的應(yīng)用,可以考慮使用TCXO(溫度補(bǔ)償晶體振蕩器)來(lái)進(jìn)一步提高精度。

8. 總結(jié)

基于AT89C2051單片機(jī)設(shè)計(jì)自制倒計(jì)時(shí)器是一個(gè)非常適合初學(xué)者和電子愛(ài)好者的實(shí)踐項(xiàng)目。通過(guò)本方案的詳細(xì)闡述,從設(shè)計(jì)目標(biāo)、系統(tǒng)架構(gòu)、元器件選型到硬件電路和軟件編程,希望能夠?yàn)樽x者提供清晰的指導(dǎo)。在實(shí)際操作中,理解每個(gè)元器件的作用、合理規(guī)劃電路、細(xì)致編寫(xiě)代碼以及耐心調(diào)試是成功的關(guān)鍵。通過(guò)這個(gè)項(xiàng)目,不僅能掌握AT89C2051單片機(jī)的基本應(yīng)用,還能深入理解數(shù)字電路、C語(yǔ)言編程和嵌入式系統(tǒng)開(kāi)發(fā)的基礎(chǔ)知識(shí),為今后更復(fù)雜的電子設(shè)計(jì)打下堅(jiān)實(shí)的基礎(chǔ)。

責(zé)任編輯:David

【免責(zé)聲明】

1、本文內(nèi)容、數(shù)據(jù)、圖表等來(lái)源于網(wǎng)絡(luò)引用或其他公開(kāi)資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對(duì)本文的引用持有異議,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時(shí)處理。

2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。

3、本文內(nèi)容僅代表作者觀點(diǎn),拍明芯城不對(duì)內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請(qǐng)讀者明確相關(guān)結(jié)果。

4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請(qǐng)聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。

拍明芯城擁有對(duì)此聲明的最終解釋權(quán)。

相關(guān)資訊

拍明芯城微信圖標(biāo)

各大手機(jī)應(yīng)用商城搜索“拍明芯城”

下載客戶端,隨時(shí)隨地買賣元器件!

拍明芯城公眾號(hào)
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號(hào)
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告