1. 程式人生 > >基於51微控制器的LCD1602電子時鐘

基於51微控制器的LCD1602電子時鐘

摘要:
51系列微控制器是各微控制器中最為典型和最有代表性的一種。由RAM ,ROM,CPU構成,定時,計數和多種介面於一體的微控制器。本次設計的數位電子時鐘採用了STC89C52晶片進行控制,使用DS1302時鐘晶片產生時鐘資料,通過LCD1602液晶顯示屏進行重新整理顯示。同時,使用4*4矩陣鍵盤,可以進行日期和時間的調整,且操作簡單,計時誤差小,顯示亮度高,具有良好的實用價值。

一.電子時鐘的功能及原理
1.本設計採用時鐘晶片,通過微控制器對其輸出的時間資料進行年、月、日、時、分、秒的解碼,並將解碼後的資料送到顯示屏進行顯示。微控制器使用定時器T0,每定時2ms後,微控制器便產生一個的計時溢位中斷,在中斷服務函式對矩陣按鍵進行動態掃描,這樣既避免了按鍵消抖,又減輕了CPU的工作載荷。
2.此外,為了提高電子時鐘的實用性,本課題還添加了一個矩陣鍵盤和蜂鳴器,通過矩陣鍵盤來調整時間,16個按鍵分別為‘0~9數字鍵’、‘設定鍵’、‘esc鍵’、‘增加鍵’、‘減少鍵’、‘向左鍵’、‘向右鍵’。 微控制器確定有按鍵按下,在蜂鳴器控制腳產生一個高電平,使蜂鳴器發出“嘀”的一聲,以此來說明按下的動作被執行了。
3.同時電子時鐘具有報時的功能,當時間到了整點,比如到了10點鐘時,蜂鳴器會連續發出10個響聲,表示現在是10點正;當時間到了某點30分時,蜂鳴器會響一聲,表示現在是某時半點。

二.電子時鐘的硬體設計
1.總體硬體框圖
在這裡插入圖片描述
2 電子時鐘硬體系統主要模組功能簡要介紹
(1)微控制器:本次設計採用AT89C52晶片,低功耗、高效能CMOS8位微控制器,具有 8K 在系統可程式設計Flash 儲存器。256位元組RAM, 32 位I/O 口線,與工業80C51 產品指令和引腳完全相容。價格較低,能滿足本次設計的要求
在這裡插入圖片描述
(2) 電源和復位模組:AT89C52需5V電壓,所以可以採用USB介面的5V電源對其供電,復位電路可採用上電覆位、按鍵電平復位、按鍵脈衝復位3種,本次採用按鍵電平復位。
(3)顯示模組:該模組由LCD1602液晶顯示屏組成,共有16個引腳,其中有11個需與微控制器相接,工作控制引腳分別接於微控制器的P2.4-P2.6腳,資料引腳接於微控制器的P0.0-P0.7口上,使用可調電阻實現對顯示屏文字清析度的調節。
在這裡插入圖片描述


(4)矩陣鍵盤模組:鍵盤由16個按鍵組成,行腳分別接在微控制器的P1.0-P1.3口,列腳分別接在微控制器P1.4-P1.7口上。
在這裡插入圖片描述
(5)DS1302時鐘模組:為了保證同步工作方式的思想,微控制器必須有時鐘訊號,以使其系統在時鐘訊號的控制下按時序協調工作。
在這裡插入圖片描述
(6)總體實物圖
在這裡插入圖片描述
3. 電子時鐘元器件清單
在這裡插入圖片描述
三.電子時鐘軟體系統的設計

1 電子時鐘軟體系統主要模組功能簡要介紹
(1) 主程式:主程式的主要功能是進行定時器/計數器,顯示緩衝區的初始化,顯示,以及判斷是否有功能鍵按下,判斷按下的鍵並調相應的鍵功能程式。
(2) 鍵功能程式:鍵功能程式的主要功能是執行對應的功能,主要對16個按鍵進行編碼,當微控制器得到按下的鍵的編碼,微控制器便會跳轉到相應的子程式執行相應的功能。
(3) 中斷服務程式:中斷服務程式的主要功能是進行計時操作和按鍵掃描,程式開始進行按鍵檢測,然後判斷計數溢位是否滿了100次,若不滿100次則表明沒有到達最小的重新整理時間,則中斷結束;若滿100次表明已到達了重新整理時間,則將重新整理時間標誌位置1,進行時間的重新整理。

2 電子時鐘軟體系統程式流程框圖
在這裡插入圖片描述
3.主程式程式碼

void main()
{
    InitLCD1602(); //初始化 lcd1602
    InitDS1302(); //初始化 DS1302
    ConfgiTimer0(2); //初始化定時器,並定時 2ms
    Delay_nms(10);
    buz = 0;
    LcdShowStr(0,0,"Date:20 - - ");
    LcdShowStr(0,1,"Time: : : ");
    while(1)
    {
        KeyDriver();//檢測按鍵動作
        if (flag200ms == 1 && (setTimeIndex == 0)) //每 200ms 且 setTimeIndex==0 處於非設定時間狀態時重新整理一次時間顯示
        {
            flag200ms = 0;
            GetTimeFromDS1302(&timeBuf); //從 DS1302 中獲取時間到 timeBuf 結構體指標變數的成員中
            if(timeBuf.sec != psec) //當前秒值和上一次的秒值不相等
            {
                RefreshLcdShowTime();//重新整理時間顯示
                psec = timeBuf.sec;//備份當前的秒值(秒暫存器值)
                On_Timr_Alarm();
            }
        }
    }
}

原始碼下載:關注公眾號,首頁回覆“電子時鐘”獲取電子時鐘的原始碼工程
在這裡插入圖片描述