1 設計任務及要求分析
1.1 設計任務:基于單片機的電子時鐘設計
1.2 要求:
1.2.1 用LCD液晶作為顯示設備
1.2.2 可以分別設定小時、分鐘和秒,復位后時間為 00 00 00
1.2.3 能實現日期的設置年、月、日
1.3 擴展要求:如鬧鐘功能、顯示星期、整點音樂報時等
2 系統方案
2.1 系統整體方案的論證
電路原理設計是基于小系統板包括電源電路、復位電路、按鍵電路、DS1302時鐘電路、液晶顯示驅動電路、輸出控制電路。電源部分是用電池來提供的3v-5v,晶體振蕩器采用的是12MHz的石英晶體振蕩器。
整個系統用單片機為中央控制器,由單片機執行采集時鐘芯片的時間信號并通過顯示模塊來輸出信號及相關的控制功能。時鐘芯片產生時鐘信號,利用單片機的I/O口傳給單片機;并通過I/O口實現LCD的顯示。系統設有4個獨立式按鍵可以對時間年、月、日和星期進行調整,還可以設置鬧鐘。具體如圖2.1所示:
圖2.1 系統整體框圖
3 硬件設計與實現
3.1單片機最小系統
STC89C52是一款非常適合單片機初學者學習的單片機,它完全兼容傳統的8051,8031的指令系統,他的運行速度要比8051快最高支持達33MHz的晶體震蕩器,在此系統中使用12MHz的晶振。
AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統可編程Flash存儲器。使用Atmel公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。STC89C52具有以下標準功能:8k字節Flash,256字節RAM,32 位I/O 口線,看門狗定時器,2 個數據指針,三個16位定時器/計數器。一個6向量2級中斷結構,全雙工串行口及時鐘電路。另外,STC89C52 可降至0Hz 靜態邏輯操作,支持2種軟件可選擇節電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。
3.2振蕩電路的工作原理
STC89C52單片機內部有一個高增益反相放大器,用于構成振蕩器,但要形成時鐘,外部還需附加電路。XTAL1引腳為反相放大器和時鐘發生電路的輸入端,XTAL2引腳為反相放大器的輸出端。振蕩電路如圖3.1所示:
圖3.1 振蕩電路圖
3.2時鐘電路的工作原理
片內時鐘發生器實質是個2分頻的觸發其輸入來自振蕩器的fosc,輸出為2相時鐘信號,即節拍信號P1、P2,器頻率為fosc\2。2個節拍為1個狀態時鐘S。狀態時鐘再3分頻后為ALE信號,其頻率為fosc\6,狀態時鐘6分頻后為機器周期信號,器頻率為fosc\12。特殊功能寄存器PCON的PD位可以控制振蕩器的工作,當PD=0時,振蕩器停止工作,單片機進入低功耗工作狀態,復位后,PD=0,振蕩器正常工作。時鐘電路如圖3.2所示:
圖3.2時鐘電路圖
3.3單片機最小系統電路圖
圖3.3單片機最小系統電路圖
3.4 時鐘芯片
(1)DS1302是一種可編程的實時時鐘芯片,具有計算2100年前的時間的能力,包括時鐘/日歷寄存器和31字節(8位)的數據暫存寄存器,數據通信權通過一條串行輸出口。時鐘/日歷提供包括秒、分、時、日期、月份和年份信息。閏年可自行調整,以串行方式向單片機傳送單字節或多字節的秒、分、時、日、月、年等實時時間數據;只通過三根線進行數據的控制和傳遞:RST、I/O、SCLK;其在電路的功能是還具有在出現主電源斷電時備用電源可繼續保持時鐘的連續運行。時鐘引腳圖如圖3.4所示:
圖3.4時鐘引腳圖
(2)DS1302芯片內部寄存器讀寫地址及位定義格式如表3-1:
寄存器名 | 讀寫地址 | 取值范圍 | 位定義 | |||||||||
寫操作 | 讀操作 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||
秒寄存器 | 80H | 81H | 00-59 | CH | 秒十位 | 秒個位 | ||||||
分寄存器 | 82H | 83H | 00-59 | 0 | 分時位 | 分個位 | ||||||
時寄存器 | 84H | 85H | 01-12或00-23 | 12/24 | 0 | AM/PM | 十位 | 小時個位 | ||||
日期寄存器 | 86H | 87H | 01-28-31 | 0 | 0 | 十位 | 日個位 | |||||
星期寄存器 | 8AH | 8BH | 01-07 | 0 | 0 | 0 | 0 | 星期位 | ||||
月寄存器 | 88H | 89H | 01-12 | 0 | 0 | 0 | 十位 | 月個位 | ||||
年寄存器 | 8CH | 8DH | 00-99 | 年十位 | 年個位 | |||||||
控制寄存器 控制寄存器 | 8EH 8EH | 8FH 8FH |
| WP WP | 0 0 | 0 | 0 | 0 | 0 | 0 | 0 |
表3-1 DS1302芯片內部寄存器讀寫地址及位定義
如果單片機要對DS1302內部寄存器進行讀寫操作,必須先將與寄存器對應的位操作地址傳送給DS1302,然后再進行讀寫數據的操作。控制寄存器是用來決定能否對DS1302進行讀寫操作,當控制字的最高位WP=0時,允許進行讀寫操作;當WP=1時,禁止讀寫操作。所以單片機對DS1302進行讀寫操作時,必須先將控制字00H寫入到DS1302的控制寄存器中。
3.5 液晶顯示電路
LCD顯示器能顯示數碼管不能顯示的其他字符、文字和圖形,是十分重要的顯示終端,LCD1602是字符點陣液晶顯示模塊。利用LCD1602,所用的時間年、月、日、星期可同時可見,一目了然,采用雙行顯示,讓電子鐘能夠更直觀的顯示。其實圖如圖3.5、顯示電路圖如圖3.6、引腳功能如表3-2所示:
圖3.5 液晶顯示器實圖
圖3.6 液晶顯示電路圖
引腳號 | 引腳名稱 | 引腳功能含義 |
1 | Vss | 地管腳(GND) |
2 | Vdd | +5V電源引腳(Vcc) |
3 | Vo | 液晶顯示驅動電源(0~5V),可接電位器 |
4 | RS | 數據和指令選擇控制端,RS=0:命令/狀態RS=1:數據 |
5 | R/W | 讀寫控制線,R/W=0:寫操作,R/W=1:讀操作 |
6 | E | 數據讀寫操作控制位,E線向LCD模塊發送一個脈沖,LCD模塊與單片機之間將進行一次數據轉換 |
7~14 | DB0~DB7 | 數據線,可以用8位連接,也可以用高四位連接,節約資源 |
15 | A | 背光控制正電源 |
16 | K | 背光控制地 |
表3-2 LCD液晶顯示器引腳功能
3.6 輸出控制電路
在P2.0端口接一個蜂鳴器,用于整點報時和響鬧鈴。具體如圖3.7所示:
圖3.7輸出控制電路圖
3.7按鍵電路
本次設計采用按鍵電平復位,按鍵電平復位相當于按復位鍵后,復位端通過電阻與Vcc電源接通,按鍵電路圖如圖3.8所示:
圖3.8按鍵電路圖
4 軟件設計與實現
4.1軟件總體設計方案
4.1.1 軟件設計目標
軟件部分總體上是模塊化的設計思想,通過子程序調用設計方式 ,將所有的模塊綜合到一起,使程序可讀性較高。
4.1.2 總體架構說明
該時鐘程序設計思路如下:
(1)在程序頭將設計中的一些固定空間進行分配并注釋。
(2)初始化程序,如設定時鐘初始顯示“2016年6月30日,星期四,00:00”以便一開始就能進入整點報時狀態,顯示該功能;設定使用定時器1;將一些未到時鐘設計功能的功能端口關閉等。
(3)開始主程序進行程序掃描,先掃描拆字子程序,將分配好的時分秒等高地位的數字調入到顯示子程序中。→顯示子程序通過分配的空間對應口將拆字子程序的內容在液晶顯示器上顯示相應的時分秒,再調用走時程序使時鐘進行讀秒等工作。→進入按鍵掃描,判斷按鍵是否有變動,若有就根據設計程序對相應的按鍵按入次數而進行實現相應的功能。如進入時間調整、鬧鐘設置、鬧鐘開啟與否等。→進入鬧鐘的判斷,在時分上與設置的鬧鈴時間吻合的話就做相對應的判斷,再依據是否有開啟鬧鐘而進行響鈴與否,如果有響鈴則設置其一直響鈴知道有人為按取消按鍵取消鬧鈴。→進入整點報時掃描,判斷是否在時分上都進入了整點,如果是就報時,然后就退出整點報時,等到下一個整點的到來。→最后返回主程序頭重新依次掃描。顯示過程設有消隱,按鍵設有去抖。
(4)子程序部分。在主程序的調用下依據不同的子程序工能而編寫子程序,有多級嵌套。這些子程序包括拆字子程序、延時子程序、走時間子程序、整點報時子程序、按鍵處理子程序、調時間子程序、鬧鐘設置子程序、鬧鐘子程序、鬧鐘開啟子程序。主流程圖如圖4.1所示:
子程序詳解表如表4-1所示:
子程序名稱 | 功能 | 改變 |
Sub1 | 鬧鐘 | Pf |
Sub2 | 報時一聲 | Pf、th1、jiepai |
zhengshi | 判斷當前時間是否是整時 | shengshu 、cxbs |
baoshi | 執行報時功能 | Shengshu、cxbs |
bijiao | 判斷是否到鬧鐘時間 | TR0 |
opr00 | 設置當前時間狀態 | IsSheZhi、r1、KeyCode |
opr01 | 進入設置鬧鐘時間狀態 | IsSheZhi、r1、KeyCode |
opr02 | 把所設置的時間作為當前時間 | KeyCode、sec、min、hour、day、month、IsSheZhi |
opr03 | 把所設置的時間作為鬧鐘時間 | KeyCode、IsSheZhi |
write | DS18b20寫 | DQ、r4、r7 |
read | DS18b20讀 | DQ、r0、r4、r5、r7 |
set1302 | ds1302初始化 | Rst、Sclk、r0、r1、r6 |
get1302 | 讀出秒,分,時,日,月,星期,年讀出秒,分,時,日,月,星期,年 | Rst、Sclk、r0、r1、r6 |
clockrd | ds1302讀子程序 | Sclk 、r7 |
Ds1302R | ds1302寫數據子程序 | Sclk 、r7 |
chaizi | 時鐘拆字 | DspBuf、b、r0 |
Initdisplay | 初始狀態顯示 | Dptr |
dispGD | 固定字符顯示 |
|
word | 字‘年’,‘月’,‘日’ ‘°c’ |
|
LcdDspBuf | 寫入顯示數字 | R0、R2 |
LcdWrDat | 寫入數據 | LCDRS、LCDRW、LcdE
|
LcdWrCmd | 寫入命令 | LCDRS、LCDRW、LcdE
|
lcd_init | LCD初始化 |
|
delay | 延時 | r6、r7 |
anjian1 | 執行按鍵1的功能 | KeyCode、IsSheZhi |
anjian2 | 執行按鍵2的功能 | KeyCode、IsSheZhi |
anjian3 | 執行按鍵3的功能 | KeyCode、QH |
anjian4 | 執行按鍵4的功能 | KeyCode、bs |
www www www | 掃描當前時間編輯位 |
|
wwwa | 掃描鬧鐘時間編輯位 |
|
yan500ms | 延時500ms |
|
hex2bcd | 拆字子程序 |
|
display_nz | 顯示鬧鐘時間 |
|
表4-1 子程序詳解表
4.2按鍵模塊設計
設計系統中的按鍵模塊僅占用四個I/O口,從89s52芯片p1.0、p1.1、p1.2、p1.3四個引腳接入進行控制。當沒有按鍵按下時,均為高電平,有按鍵按下時相應I/O口為低電平,但并沒有立即執行相應的程序,延時5ms后若再為低電平,等I/O口恢復高電平,即按鍵松開時,才執行相應的程序,此時按鍵才起作用。這樣該按鍵模塊具有去抖動,且按鍵按下一次僅作用一次,起到精確判斷的作用。
4.2.1 按鍵1的說明
按鍵1有四種功能,分別為下面4個子程序:
(1)子程序0的功能為:進入設置當前時間狀態,且令keycode=2;
(2)子程序1的功能為:進入設置鬧鐘時間狀態,且令keycode=3;
(3)子程序2的功能為:把所設置的時間作為當前時間,且令keycode=0;
(4)子程序3的功能為:把所設置的時間作為鬧鐘時間,且令keycode=0;
每次按下按鍵1,按鍵1程序根據的KeyCode內容轉入各對應的子程序中(因為當KeyCode值不同時,經過計算得到dptr的值不同,然后經過jmp @a+dptr指令就可跳轉到不同的子程序中,具體程序說明),從而實現不同的功能。
從各按鍵的功能可知,每次按下按鍵1,都會改變KeyCode內容,使按鍵1的功能發生改變。
4.2.2 按鍵2的說明
按鍵2有兩種不同的功能:對應于設置狀態為加1;對應于非設置狀態為切換屏幕。所以按鍵2程序開頭就先判斷鬧鐘是否處于設置狀態。
當鬧鐘處于非設置狀態時,keycode等于0或1;處于設置狀態時,keycode等于2或3;所以可用如下語段判斷鬧鐘是否處于設置狀態:
當鬧鐘處于設置狀態,keycode值大于2,c等于0
當鬧鐘處于非設置狀態,keycode值小于2,c等于1
4.2.3 其他按鍵的說明
剩下3、4按鍵都于按鍵2類似,先判斷是否處于設置狀態,然后轉入不同的語句,不再說明。
4.2.4 報時功能的說明:
當報時功能開啟,即bs=0時,LCD上會出現相應的標示符號,此時主程序將掃描zhengshi子程序。
zhengshi子程序能判斷當前時間是否為整點,若為整點將使cxbs=0,且把hour由BCD碼化為二進制存儲在字節shengshu(為報時聲數,將在baoshi子程序中使用)中,之后主程序將掃描baoshi子程序,即開始報時。
chuzhi=0, 由baoshi子程序可知,鬧鐘從0秒開始報時,當報時完畢將自動令cxbs=1。
4.2.5 鬧鐘功能的說明:
當鬧鐘功能開啟,即bj=0時,LCD上會出現相應的標示符號此時,主程序將掃描zhengshi子程序。zhengshi子程序對當前時間和鬧鐘時間進行比較,當它們的分、時全相等時開啟中斷sub1,否則關閉中斷sub1。這樣就可實現鬧鐘鬧鈴一分鐘后自動停止鳴叫的要求。
4.2.6 加1、移位功能的說明:
將年份前兩位與年(year)、月(month)、星期(week)、日(day)、時(hour)、分(min)、秒(sec)拆字后分別存儲在DspBuf-2、DspBuf-1、DspBuf+0、DspBuf+1、DspBuf+2、DspBuf+3等13個字節中。而把它們的每一為在LCD上的顯示位置地址放在如下表中:
tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h;
當前時間各編輯位在LCD上的位置表。然后執行mov r1,#DspBuf+12; inc @r1就可實現對秒個位加1。執行:dec r1和子程序www就可實現移位功能.
4.3 時鐘模塊設計
單片機要先從DS1302芯片中讀取時鐘數據,然后通過LCD顯示出來。在讀取DS1302的時間和日期之前,先要對DS1302進行賦初始時間并開啟時鐘。時鐘被啟動后若未接收到新的賦時間指令,其內部的時鐘將一直不停的運行,以保證時間的實時性和準確性;期間單片機可隨時讀取DS1302內部時間和日期寄存器中的數值。
4.4 液晶顯示模塊設計
本設計液晶時鐘顯示系統設計上由液晶顯示器顯示、時鐘芯片DS1302提供時間,可為使用者提供完整的時間信息。由于LED數碼管只能顯示數字而無法顯示其他中英文字符,并對成本及功能考慮,因此從設計的成本及功能的角度考慮,采用LCD一1602顯示模塊,它可以顯示年、月、日、星期等中文字目。LCD一1602驅動電路簡單,可以由單片機直接輸出命令驅動。
5 實物調試及測試
5.1 實物圖
圖5.1 實物圖
5.2 實物調試
圖5.2 K1鍵功能圖
圖5.3 K4鍵功能圖
5.3 測試結果及分析
引腳 | 測試結果 | 結論 |
40(VCC) | 電壓值5.09V | 良好 |
31(EA*) | 電壓值5.09V | 良好 |
30(ALE) | 波形為方波 | 良好 |
表5-1 測試結果分析表
5.4仿真結果圖如下所示
圖5.4 K4仿真結果圖
6 不足與展望
6.1 設計不足之處
6.2 設計的展望
(2)實現陰歷和陽歷的轉化
7設計心得
本文的電子鐘系統是以單片機(STC89C52)為核心,時鐘芯片DS1302、LED1602顯示等部分組成。具體應用Keil2軟件調試程序以及Proteus軟件進行基于單片機的電子鐘設計與仿真。實現了硬件軟化的目的。
經過一段時間的課程設計,我們發現對于書上很多知識還不能靈活運用,有很多知識還要我們去學習。此次電子時鐘的設計給我們奠定了一個實踐的基礎,很是受益匪淺。讓我們認識到學習不但要立足于書本,而且要注重實踐,要以解決理論和實際教學中的實際問題為目的。通過自己的手來解決問題比用腦子解決問題更加深刻。學習就應該采取理論與實踐結合的方式,這種做法既有助于完成理論知識的鞏固,而且可以加強我們的動手和解決實際問題的能力。
單片機源程序如下:
電子時鐘資料.rar
(555.89 KB, 下載次數: 550)
QIANDUPDUO 發表于 2024-3-25 09:44
初始化程序中有定義led燈指示接口,但是原理圖中為什么沒有畫呢
awe123 發表于 2023-6-15 16:35
真的很有用!!!感謝!!!學到很多!!
QIANDUPDUO 發表于 2024-3-25 15:30
芯片不是使用STC89C52嗎,為什么原理圖中畫的卻是AT89C51
QIANDUPDUO 發表于 2024-3-30 18:18
看到有說是keil中找不到STC系列。 可以用AT89C52代替STC89C52
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |