這是我做的使用LCD1602顯示的電子時(shí)鐘的設(shè)計(jì),從編程到制作實(shí)物花了不少的時(shí)間。程序使用純匯編語言編寫,在proteus中仿真驗(yàn)證,并完成了實(shí)物的制作,調(diào)試完全通過,功能包括時(shí)間、日期,鬧鈴,整點(diǎn)提示等功能,使用LCD1602顯示清晰。
題 目: 基于52單片機(jī)電子時(shí)鐘的設(shè)計(jì)
學(xué) 院: 物理與機(jī)電工程學(xué)院
專 業(yè): 電子信息科學(xué)與技術(shù)
作者姓名:
指導(dǎo)教師: *** 職稱: 講師
基于52單片機(jī)電子時(shí)鐘的設(shè)計(jì)
摘要
本次設(shè)計(jì)的多功能時(shí)鐘系統(tǒng)采用STC89C52單片機(jī)為核心器件,利用其定時(shí)器/計(jì)數(shù)器定時(shí)和記數(shù)的原理,結(jié)合液晶顯示電路、時(shí)鐘芯片DS1302電路、電源電路以及按鍵電路來設(shè)計(jì)計(jì)時(shí)器。將軟硬件有機(jī)地結(jié)合起來,使得系統(tǒng)能夠?qū)崿F(xiàn)液晶顯示,顯示有年、月、日、時(shí)、分、秒以及星期,還可以設(shè)置鬧鐘和整點(diǎn)報(bào)時(shí)。其中軟件系統(tǒng)采用單片機(jī)匯編語言編寫程序,包括顯示程序、鬧鐘程序、中斷、延時(shí)程序,按鍵消抖程序等,并在keil中調(diào)試運(yùn)行,硬件系統(tǒng)利用PROTEUS強(qiáng)大的功能來實(shí)現(xiàn),簡單且易于觀察,在仿真中就可以觀察到實(shí)際的工作狀態(tài)。
1 設(shè)計(jì)任務(wù)及要求分析 1.1 設(shè)計(jì)任務(wù):基于單片機(jī)的電子時(shí)鐘設(shè)計(jì) 1.2 要求: 1.2.1 用LCD液晶作為顯示設(shè)備 1.2.2 可以分別設(shè)定小時(shí)、分鐘和秒,復(fù)位后時(shí)間為 00 00 00 1.2.3 能實(shí)現(xiàn)日期的設(shè)置年、月、日 1.3 擴(kuò)展要求:如鬧鐘功能、顯示星期、整點(diǎn)音樂報(bào)時(shí)等 2 系統(tǒng)方案 2.1 系統(tǒng)整體方案的論證 電路原理設(shè)計(jì)是基于小系統(tǒng)板包括電源電路、復(fù)位電路、按鍵電路、DS1302時(shí)鐘電路、液晶顯示驅(qū)動(dòng)電路、輸出控制電路。電源部分是用電池來提供的3v-5v,晶體振蕩器采用的是12MHz的石英晶體振蕩器。 整個(gè)系統(tǒng)用單片機(jī)為中央控制器,由單片機(jī)執(zhí)行采集時(shí)鐘芯片的時(shí)間信號(hào)并通過顯示模塊來輸出信號(hào)及相關(guān)的控制功能。時(shí)鐘芯片產(chǎn)生時(shí)鐘信號(hào),利用單片機(jī)的I/O口傳給單片機(jī);并通過I/O口實(shí)現(xiàn)LCD的顯示。系統(tǒng)設(shè)有4個(gè)獨(dú)立式按鍵可以對(duì)時(shí)間年、月、日和星期進(jìn)行調(diào)整,還可以設(shè)置鬧鐘。具體如圖2.1所示: 圖2.1 系統(tǒng)整體框圖
3 硬件設(shè)計(jì)與實(shí)現(xiàn) 3.1單片機(jī)最小系統(tǒng) STC89C52是一款非常適合單片機(jī)初學(xué)者學(xué)習(xí)的單片機(jī),它完全兼容傳統(tǒng)的8051,8031的指令系統(tǒng),他的運(yùn)行速度要比8051快最高支持達(dá)33MHz的晶體震蕩器,在此系統(tǒng)中使用12MHz的晶振。 AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash存儲(chǔ)器。使用Atmel公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。STC89C52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16位定時(shí)器/計(jì)數(shù)器。一個(gè)6向量2級(jí)中斷結(jié)構(gòu),全雙工串行口及時(shí)鐘電路。另外,STC89C52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式?臻e模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。 3.2振蕩電路的工作原理 STC89C52單片機(jī)內(nèi)部有一個(gè)高增益反相放大器,用于構(gòu)成振蕩器,但要形成時(shí)鐘,外部還需附加電路。XTAL1引腳為反相放大器和時(shí)鐘發(fā)生電路的輸入端,XTAL2引腳為反相放大器的輸出端。振蕩電路如圖3.1所示: 
圖3.1 振蕩電路圖 3.2時(shí)鐘電路的工作原理 片內(nèi)時(shí)鐘發(fā)生器實(shí)質(zhì)是個(gè)2分頻的觸發(fā)其輸入來自振蕩器的fosc,輸出為2相時(shí)鐘信號(hào),即節(jié)拍信號(hào)P1、P2,器頻率為fosc\2。2個(gè)節(jié)拍為1個(gè)狀態(tài)時(shí)鐘S。狀態(tài)時(shí)鐘再3分頻后為ALE信號(hào),其頻率為fosc\6,狀態(tài)時(shí)鐘6分頻后為機(jī)器周期信號(hào),器頻率為fosc\12。特殊功能寄存器PCON的PD位可以控制振蕩器的工作,當(dāng)PD=0時(shí),振蕩器停止工作,單片機(jī)進(jìn)入低功耗工作狀態(tài),復(fù)位后,PD=0,振蕩器正常工作。時(shí)鐘電路如圖3.2所示: 
圖3.2時(shí)鐘電路圖 3.3單片機(jī)最小系統(tǒng)電路圖 
圖3.3單片機(jī)最小系統(tǒng)電路圖 3.4 時(shí)鐘芯片 (1)DS1302是一種可編程的實(shí)時(shí)時(shí)鐘芯片,具有計(jì)算2100年前的時(shí)間的能力,包括時(shí)鐘/日歷寄存器和31字節(jié)(8位)的數(shù)據(jù)暫存寄存器,數(shù)據(jù)通信權(quán)通過一條串行輸出口。時(shí)鐘/日歷提供包括秒、分、時(shí)、日期、月份和年份信息。閏年可自行調(diào)整,以串行方式向單片機(jī)傳送單字節(jié)或多字節(jié)的秒、分、時(shí)、日、月、年等實(shí)時(shí)時(shí)間數(shù)據(jù);只通過三根線進(jìn)行數(shù)據(jù)的控制和傳遞:RST、I/O、SCLK;其在電路的功能是還具有在出現(xiàn)主電源斷電時(shí)備用電源可繼續(xù)保持時(shí)鐘的連續(xù)運(yùn)行。時(shí)鐘引腳圖如圖3.4所示: 
圖3.4時(shí)鐘引腳圖
(2)DS1302芯片內(nèi)部寄存器讀寫地址及位定義格式如表3-1:
表3-1 DS1302芯片內(nèi)部寄存器讀寫地址及位定義 如果單片機(jī)要對(duì)DS1302內(nèi)部寄存器進(jìn)行讀寫操作,必須先將與寄存器對(duì)應(yīng)的位操作地址傳送給DS1302,然后再進(jìn)行讀寫數(shù)據(jù)的操作。控制寄存器是用來決定能否對(duì)DS1302進(jìn)行讀寫操作,當(dāng)控制字的最高位WP=0時(shí),允許進(jìn)行讀寫操作;當(dāng)WP=1時(shí),禁止讀寫操作。所以單片機(jī)對(duì)DS1302進(jìn)行讀寫操作時(shí),必須先將控制字00H寫入到DS1302的控制寄存器中。 3.5 液晶顯示電路 LCD顯示器能顯示數(shù)碼管不能顯示的其他字符、文字和圖形,是十分重要的顯示終端,LCD1602是字符點(diǎn)陣液晶顯示模塊。利用LCD1602,所用的時(shí)間年、月、日、星期可同時(shí)可見,一目了然,采用雙行顯示,讓電子鐘能夠更直觀的顯示。其實(shí)圖如圖3.5、顯示電路圖如圖3.6、引腳功能如表3-2所示: 
圖3.5 液晶顯示器實(shí)圖 
圖3.6 液晶顯示電路圖
| | | | | | | | | | | 液晶顯示驅(qū)動(dòng)電源(0~5V),可接電位器 | | | 數(shù)據(jù)和指令選擇控制端,RS=0:命令/狀態(tài)RS=1:數(shù)據(jù) | | | 讀寫控制線,R/W=0:寫操作,R/W=1:讀操作 | | | 數(shù)據(jù)讀寫操作控制位,E線向LCD模塊發(fā)送一個(gè)脈沖,LCD模塊與單片機(jī)之間將進(jìn)行一次數(shù)據(jù)轉(zhuǎn)換 | | | 數(shù)據(jù)線,可以用8位連接,也可以用高四位連接,節(jié)約資源 | | | | | | |
表3-2 LCD液晶顯示器引腳功能 3.6 輸出控制電路 在P2.0端口接一個(gè)蜂鳴器,用于整點(diǎn)報(bào)時(shí)和響鬧鈴。具體如圖3.7所示: 
圖3.7輸出控制電路圖 3.7按鍵電路 本次設(shè)計(jì)采用按鍵電平復(fù)位,按鍵電平復(fù)位相當(dāng)于按復(fù)位鍵后,復(fù)位端通過電阻與Vcc電源接通,按鍵電路圖如圖3.8所示: 
圖3.8按鍵電路圖
4 軟件設(shè)計(jì)與實(shí)現(xiàn) 4.1軟件總體設(shè)計(jì)方案 4.1.1 軟件設(shè)計(jì)目標(biāo) 軟件部分總體上是模塊化的設(shè)計(jì)思想,通過子程序調(diào)用設(shè)計(jì)方式 ,將所有的模塊綜合到一起,使程序可讀性較高。 4.1.2 總體架構(gòu)說明 該時(shí)鐘程序設(shè)計(jì)思路如下: (1)在程序頭將設(shè)計(jì)中的一些固定空間進(jìn)行分配并注釋。 (2)初始化程序,如設(shè)定時(shí)鐘初始顯示“2016年6月30日,星期四,00:00”以便一開始就能進(jìn)入整點(diǎn)報(bào)時(shí)狀態(tài),顯示該功能;設(shè)定使用定時(shí)器1;將一些未到時(shí)鐘設(shè)計(jì)功能的功能端口關(guān)閉等。 (3)開始主程序進(jìn)行程序掃描,先掃描拆字子程序,將分配好的時(shí)分秒等高地位的數(shù)字調(diào)入到顯示子程序中!@示子程序通過分配的空間對(duì)應(yīng)口將拆字子程序的內(nèi)容在液晶顯示器上顯示相應(yīng)的時(shí)分秒,再調(diào)用走時(shí)程序使時(shí)鐘進(jìn)行讀秒等工作。→進(jìn)入按鍵掃描,判斷按鍵是否有變動(dòng),若有就根據(jù)設(shè)計(jì)程序?qū)ο鄳?yīng)的按鍵按入次數(shù)而進(jìn)行實(shí)現(xiàn)相應(yīng)的功能。如進(jìn)入時(shí)間調(diào)整、鬧鐘設(shè)置、鬧鐘開啟與否等。→進(jìn)入鬧鐘的判斷,在時(shí)分上與設(shè)置的鬧鈴時(shí)間吻合的話就做相對(duì)應(yīng)的判斷,再依據(jù)是否有開啟鬧鐘而進(jìn)行響鈴與否,如果有響鈴則設(shè)置其一直響鈴知道有人為按取消按鍵取消鬧鈴。→進(jìn)入整點(diǎn)報(bào)時(shí)掃描,判斷是否在時(shí)分上都進(jìn)入了整點(diǎn),如果是就報(bào)時(shí),然后就退出整點(diǎn)報(bào)時(shí),等到下一個(gè)整點(diǎn)的到來!詈蠓祷刂鞒绦蝾^重新依次掃描。顯示過程設(shè)有消隱,按鍵設(shè)有去抖。 (4)子程序部分。在主程序的調(diào)用下依據(jù)不同的子程序工能而編寫子程序,有多級(jí)嵌套。這些子程序包括拆字子程序、延時(shí)子程序、走時(shí)間子程序、整點(diǎn)報(bào)時(shí)子程序、按鍵處理子程序、調(diào)時(shí)間子程序、鬧鐘設(shè)置子程序、鬧鐘子程序、鬧鐘開啟子程序。主流程圖如圖4.1所示:
子程序詳解表如表4-1所示: | | | | | | | | | | 判斷當(dāng)前時(shí)間是否是整時(shí) | | | | | | | | | 設(shè)置當(dāng)前時(shí)間狀態(tài) | | | 進(jìn)入設(shè)置鬧鐘時(shí)間狀態(tài) | | | 把所設(shè)置的時(shí)間作為當(dāng)前時(shí)間 | KeyCode、sec、min、hour、day、month、IsSheZhi | | 把所設(shè)置的時(shí)間作為鬧鐘時(shí)間 | | | | | | | | | | | | 讀出秒,分,時(shí),日,月,星期,年讀出秒,分,時(shí),日,月,星期,年 | | | | | | | | | | | | | | | |
| | |
| | | | | | | | | | | |
| | | | | | | | | | | | | | | | | |
| | |
| | |
| | |
| | |
|
表4-1 子程序詳解表 4.2按鍵模塊設(shè)計(jì) 設(shè)計(jì)系統(tǒng)中的按鍵模塊僅占用四個(gè)I/O口,從89s52芯片p1.0、p1.1、p1.2、p1.3四個(gè)引腳接入進(jìn)行控制。當(dāng)沒有按鍵按下時(shí),均為高電平,有按鍵按下時(shí)相應(yīng)I/O口為低電平,但并沒有立即執(zhí)行相應(yīng)的程序,延時(shí)5ms后若再為低電平,等I/O口恢復(fù)高電平,即按鍵松開時(shí),才執(zhí)行相應(yīng)的程序,此時(shí)按鍵才起作用。這樣該按鍵模塊具有去抖動(dòng),且按鍵按下一次僅作用一次,起到精確判斷的作用。 4.2.1 按鍵1的說明 按鍵1有四種功能,分別為下面4個(gè)子程序: (1)子程序0的功能為:進(jìn)入設(shè)置當(dāng)前時(shí)間狀態(tài),且令keycode=2; (2)子程序1的功能為:進(jìn)入設(shè)置鬧鐘時(shí)間狀態(tài),且令keycode=3; (3)子程序2的功能為:把所設(shè)置的時(shí)間作為當(dāng)前時(shí)間,且令keycode=0; (4)子程序3的功能為:把所設(shè)置的時(shí)間作為鬧鐘時(shí)間,且令keycode=0; 每次按下按鍵1,按鍵1程序根據(jù)的KeyCode內(nèi)容轉(zhuǎn)入各對(duì)應(yīng)的子程序中(因?yàn)楫?dāng)KeyCode值不同時(shí),經(jīng)過計(jì)算得到dptr的值不同,然后經(jīng)過jmp @a+dptr指令就可跳轉(zhuǎn)到不同的子程序中,具體程序說明),從而實(shí)現(xiàn)不同的功能。 從各按鍵的功能可知,每次按下按鍵1,都會(huì)改變KeyCode內(nèi)容,使按鍵1的功能發(fā)生改變。 4.2.2 按鍵2的說明 按鍵2有兩種不同的功能:對(duì)應(yīng)于設(shè)置狀態(tài)為加1;對(duì)應(yīng)于非設(shè)置狀態(tài)為切換屏幕。所以按鍵2程序開頭就先判斷鬧鐘是否處于設(shè)置狀態(tài)。 當(dāng)鬧鐘處于非設(shè)置狀態(tài)時(shí),keycode等于0或1;處于設(shè)置狀態(tài)時(shí),keycode等于2或3;所以可用如下語段判斷鬧鐘是否處于設(shè)置狀態(tài): 當(dāng)鬧鐘處于設(shè)置狀態(tài),keycode值大于2,c等于0 當(dāng)鬧鐘處于非設(shè)置狀態(tài),keycode值小于2,c等于1 4.2.3 其他按鍵的說明 剩下3、4按鍵都于按鍵2類似,先判斷是否處于設(shè)置狀態(tài),然后轉(zhuǎn)入不同的語句,不再說明。 4.2.4 報(bào)時(shí)功能的說明: 當(dāng)報(bào)時(shí)功能開啟,即bs=0時(shí),LCD上會(huì)出現(xiàn)相應(yīng)的標(biāo)示符號(hào) ,此時(shí)主程序?qū)呙鑪hengshi子程序。 zhengshi子程序能判斷當(dāng)前時(shí)間是否為整點(diǎn),若為整點(diǎn)將使cxbs=0,且把hour由BCD碼化為二進(jìn)制存儲(chǔ)在字節(jié)shengshu(為報(bào)時(shí)聲數(shù),將在baoshi子程序中使用)中,之后主程序?qū)呙鑒aoshi子程序,即開始報(bào)時(shí)。 chuzhi=0, 由baoshi子程序可知,鬧鐘從0秒開始報(bào)時(shí),當(dāng)報(bào)時(shí)完畢將自動(dòng)令cxbs=1。 4.2.5 鬧鐘功能的說明: 當(dāng)鬧鐘功能開啟,即bj=0時(shí),LCD上會(huì)出現(xiàn)相應(yīng)的標(biāo)示符號(hào) 此時(shí),主程序?qū)呙鑪hengshi子程序。zhengshi子程序?qū)Ξ?dāng)前時(shí)間和鬧鐘時(shí)間進(jìn)行比較,當(dāng)它們的分、時(shí)全相等時(shí)開啟中斷sub1,否則關(guān)閉中斷sub1。這樣就可實(shí)現(xiàn)鬧鐘鬧鈴一分鐘后自動(dòng)停止鳴叫的要求。 4.2.6 加1、移位功能的說明: 將年份前兩位與年(year)、月(month)、星期(week)、日(day)、時(shí)(hour)、分(min)、秒(sec)拆字后分別存儲(chǔ)在DspBuf-2、DspBuf-1、DspBuf+0、DspBuf+1、DspBuf+2、DspBuf+3等13個(gè)字節(jié)中。而把它們的每一為在LCD上的顯示位置地址放在如下表中: tab4:db 80h,81h,82h,83h,85h,86h,88h,89h,8eh,0c2h,0c3h,0c5h,0c6h,0c8h,0c9h; 當(dāng)前時(shí)間各編輯位在LCD上的位置表。然后執(zhí)行mov r1,#DspBuf+12; inc @r1就可實(shí)現(xiàn)對(duì)秒個(gè)位加1。執(zhí)行:dec r1和子程序www就可實(shí)現(xiàn)移位功能. 4.3 時(shí)鐘模塊設(shè)計(jì) 單片機(jī)要先從DS1302芯片中讀取時(shí)鐘數(shù)據(jù),然后通過LCD顯示出來。在讀取DS1302的時(shí)間和日期之前,先要對(duì)DS1302進(jìn)行賦初始時(shí)間并開啟時(shí)鐘。時(shí)鐘被啟動(dòng)后若未接收到新的賦時(shí)間指令,其內(nèi)部的時(shí)鐘將一直不停的運(yùn)行,以保證時(shí)間的實(shí)時(shí)性和準(zhǔn)確性;期間單片機(jī)可隨時(shí)讀取DS1302內(nèi)部時(shí)間和日期寄存器中的數(shù)值。 4.4 液晶顯示模塊設(shè)計(jì) 本設(shè)計(jì)液晶時(shí)鐘顯示系統(tǒng)設(shè)計(jì)上由液晶顯示器顯示、時(shí)鐘芯片DS1302提供時(shí)間,可為使用者提供完整的時(shí)間信息。由于LED數(shù)碼管只能顯示數(shù)字而無法顯示其他中英文字符,并對(duì)成本及功能考慮,因此從設(shè)計(jì)的成本及功能的角度考慮,采用LCD一1602顯示模塊,它可以顯示年、月、日、星期等中文字目。LCD一1602驅(qū)動(dòng)電路簡單,可以由單片機(jī)直接輸出命令驅(qū)動(dòng)。 5 實(shí)物調(diào)試及測試 5.1 實(shí)物圖 
圖5.1 實(shí)物圖 5.2 實(shí)物調(diào)試 - 按下K1鍵進(jìn)入調(diào)節(jié)功能選擇狀態(tài)

圖5.2 K1鍵功能圖 - 按下2鍵有加1和顯示調(diào)節(jié)鬧鐘界面的功能
- 按下K3鍵進(jìn)入光標(biāo)移動(dòng)功能,選擇調(diào)節(jié)年、月、日和時(shí)間等
- 按下K4顯示出整點(diǎn)報(bào)時(shí)圖標(biāo)


圖5.3 K4鍵功能圖
5.3 測試結(jié)果及分析 表5-1 測試結(jié)果分析表 5.4仿真結(jié)果圖如下所示 
圖5.4 K4仿真結(jié)果圖 6 不足與展望 6.1 設(shè)計(jì)不足之處 - 沒有停止鬧鐘的硬件功能
- 沒有實(shí)現(xiàn)按鍵減1,只能加1調(diào)節(jié)時(shí)鐘
- 沒有實(shí)現(xiàn)音樂整點(diǎn)報(bào)時(shí)
- 沒有安裝三極管,蜂鳴器聲音很小
6.2 設(shè)計(jì)的展望 (2)實(shí)現(xiàn)陰歷和陽歷的轉(zhuǎn)化 7設(shè)計(jì)心得 本文的電子鐘系統(tǒng)是以單片機(jī)(STC89C52)為核心,時(shí)鐘芯片DS1302、LED1602顯示等部分組成。具體應(yīng)用Keil2軟件調(diào)試程序以及Proteus軟件進(jìn)行基于單片機(jī)的電子鐘設(shè)計(jì)與仿真。實(shí)現(xiàn)了硬件軟化的目的。 經(jīng)過一段時(shí)間的課程設(shè)計(jì),我們發(fā)現(xiàn)對(duì)于書上很多知識(shí)還不能靈活運(yùn)用,有很多知識(shí)還要我們?nèi)W(xué)習(xí)。此次電子時(shí)鐘的設(shè)計(jì)給我們奠定了一個(gè)實(shí)踐的基礎(chǔ),很是受益匪淺。讓我們認(rèn)識(shí)到學(xué)習(xí)不但要立足于書本,而且要注重實(shí)踐,要以解決理論和實(shí)際教學(xué)中的實(shí)際問題為目的。通過自己的手來解決問題比用腦子解決問題更加深刻。學(xué)習(xí)就應(yīng)該采取理論與實(shí)踐結(jié)合的方式,這種做法既有助于完成理論知識(shí)的鞏固,而且可以加強(qiáng)我們的動(dòng)手和解決實(shí)際問題的能力。
單片機(jī)源程序如下:
- ;初始化
- P_Lcd equ P0 ;液晶lcd數(shù)據(jù)總線
- pq equ p1 ;按鍵接口
- pf bit p2.0 ;蜂鳴器接口
- led bit p2.1 ;led燈指示接口
- lcdrs bit p2.5 ;lcdrs=1選擇數(shù)據(jù)寄存器,lcdrs=0選擇指令寄存器
- lcdrw bit p2.6 ;lcdrw=1進(jìn)行讀操作,lcdrw=0進(jìn)行寫操作
- lcde bit p2.7 ;lcdep由1-->0 時(shí),液晶模塊執(zhí)行命令
- sclk bit p3.5 ;時(shí)鐘芯片時(shí)鐘線引腳
- io bit p3.6 ;時(shí)鐘芯片數(shù)據(jù)傳輸線引腳
- rst bit p3.7 ;時(shí)鐘芯片復(fù)位線引腳
- IsSheZhi bit 30h ;設(shè)置狀態(tài)標(biāo)示位
- BJ bit 31h ;比較標(biāo)示位
- QH bit 32h ;切換標(biāo)示位
- bs bit 33h ;報(bào)時(shí)功能標(biāo)示位
- cxbs bit 34h ;執(zhí)行報(bào)時(shí)標(biāo)志位
- sec equ 50h
- min equ 51h
- hour equ 52h
- day equ 53h
- week equ 54h
- month equ 55h
- year equ 56h
- KeyCode equ 57h ;按鍵1功能子程序序號(hào)存儲(chǔ)地址
- jiepai equ 58h ;存放報(bào)時(shí)聲音的節(jié)拍常數(shù)
- chuzhi equ 59h ;報(bào)時(shí)開始秒時(shí)間常數(shù)
- shengshu equ 5ah ;存放報(bào)時(shí)聲數(shù)
- DspBuf equ 60h ;當(dāng)前時(shí)間拆字后存儲(chǔ)首地址
- dspba equ 70h ;鬧鐘時(shí)間首地址
- org 0h
- ljmp main
- org 00bh
- ljmp sub1
- org 01bh
- ljmp sub2
- org 30h
- ;主程序
- main:
- clr IsSheZhi
- clr QH
- setb BJ
- setb bs
- setb cxbs
- mov KeyCode,#00h
- mov sp ,#30h
- mov year,#16h ;為當(dāng)前時(shí)間賦初值
- mov month,#06h
- mov week,#4h
- mov day,#30h
- mov hour,#00h
- mov min,#00h
- mov sec,#00h
- mov DspBuf-1,#0h
- mov DspBuf-2,#02h
- mov jiepai,#80h ;設(shè)置節(jié)拍常數(shù)
- mov chuzhi,#00h ;設(shè)置1秒時(shí)開始報(bào)時(shí)
- mov dspba+0,#00h ;為鬧鐘時(shí)間賦初值
- mov dspba+1,#09h
- mov dspba+2,#0h
- mov dspba+3,#0h
- mov TH0,#0ffh
- mov TL0,#0ffh
- mov TH1,#0ffh
- mov TL1,#0ffh
- mov IE,#8aH
- mov TMOD,#11h
- setb pf
- acall lcd_init ;調(diào)LCM的初始化程序
- lcall word ;把自創(chuàng)字符寫入CGRAM的子程序
- lcall set1302 ;DS1302初始化
- mainloop:
- jb IsSheZhi, SheZhi ;判斷是否處于設(shè)置狀態(tài),處于設(shè)置狀態(tài)則跳轉(zhuǎn)
- lcall get1302 ;調(diào)讀時(shí)間子程序
- lcall chaizi
- lcall display ;調(diào)顯示子程序,顯示當(dāng)前時(shí)間與溫度
- SheZhi:
- jb BJ,xq ;判斷鬧鐘功能是否開啟,未開啟則跳轉(zhuǎn)
- lcall bijiao ;調(diào)比較子程序,比較當(dāng)前時(shí)間與鬧鐘時(shí)間
- xq:
- lcall anjian ;按鍵掃描
- jb bs,bs_1
- lcall zhengshi ;判斷當(dāng)前時(shí)間是否是整時(shí),即能否報(bào)時(shí)
- bs_1:
- jb cxbs,cx_1
- lcall baoshi ;執(zhí)行報(bào)時(shí)功能
- cx_1:
- sjmp mainloop
- ;液晶顯示初始化設(shè)定
- lcd_init:
- mov a,#01h ;清除LCD的顯示內(nèi)容(清屏)
- acall LcdWrCmd
- mov a,#10 ;10ms延時(shí)
- acall delay
- mov a,#38h ;顯示模式設(shè)置(使用8位數(shù)據(jù),顯示兩行,使用5*7的字型)
- acall LcdWrCmd
- mov a,#10
- acall delay
- mov a,#0ch ;顯示開及光標(biāo)設(shè)置(顯示器開,光標(biāo)關(guān),字符不閃爍)
- acall LcdWrCmd
- mov a,#10
- acall delay
- mov a,#06h ;顯示光標(biāo)移動(dòng)設(shè)置(字符不動(dòng),光標(biāo)自動(dòng)右移)
- acall LcdWrCmd
- mov a,#10
- acall delay
- ret
- ;LCM命令嵌入
- LcdWrCmd:
- clr LCDRW
- clr LCDRS
- mov P_Lcd, A
- mov a,#6
- acall delay
- setb LcdE
- clr LcdE
- ret
- ;LCM數(shù)據(jù)輸入
- LcdWrDat:
- setb LCDRS
- clr LCDRW
- mov P_Lcd, A
- mov a,#6
- acall delay
- setb LcdE
- clr LcdE
- ret
- ;延時(shí)子程序
- delay:
- mov r7,a ;設(shè)置a為自定義變量,可省去其他延時(shí)程序的編寫
- d2: mov r6,#250 ;設(shè)置1ms延時(shí)
- d1:
- nop
- nop
- djnz r6,d1
- djnz r7,d2
- ret
- ;ds1302初始化程序set1302
- set1302:
- mov a,#8eh ;寫ds1302控制寄存器地址
- mov b,#00h ;允許寫操作,將WP位設(shè)置為低電平
- lcall clockwr
- mov a,#8ch ;寫年初值
- mov b,year
- lcall clockwr
- mov a,#88h ;寫月初值
- mov b,month
- lcall clockwr
- mov a,#8ah ;寫星期初值
- mov b,week
- lcall clockwr
- mov a,#86h ;寫日期初值
- mov b,day
- lcall clockwr
- mov a,#84h ;寫時(shí)初值
- mov b,hour
- lcall clockwr
- mov a,#82h ;寫分初值
- mov b,min
- lcall clockwr
- mov a,#80h ;寫秒初值
- mov b,sec
- lcall clockwr
- ret
- ;讀時(shí)間子程序get1302
- get1302:mov a,#81h ;讀秒
- lcall clockrd
- mov sec,a
- mov a,#83h ;讀分
- lcall clockrd
- mov min,a
- mov a,#85h ;讀時(shí)
- lcall clockrd
- mov hour,a
- mov a,#87h ;讀日
- lcall clockrd
- mov day,a
- mov a,#8bh ;讀星期
- lcall clockrd
- mov week,a
- mov a,#89h ;讀月
- lcall clockrd
- mov month,a
- mov a,#8dh ;讀年
- lcall clockrd
- mov year,a
- ret
- ;ds1302讀子程序
- clockrd:clr rst ;rst先設(shè)置低電平,再設(shè)置高電平,起到去亂碼作用
- clr sclk ;sclk置為低電平
- setb rst ;rst置為高電平,選通DS1302
- mov r7,#8 ;串行移位傳送次數(shù)
- rds1:
- rrc a
- mov io,c ;輸出一位寄存器讀地址
- setb sclk ;發(fā)串行脈沖
- nop
- nop
- clr sclk ;sclk置為低電平
- djnz r7,rds1
- nop ;延時(shí),防后面串行讀數(shù)據(jù)丟失
- nop
- setb io ;8位地址輸出完畢,IO設(shè)置為輸入端口
- mov r7,#8
- rds2:
- mov c,io ;讀入一位數(shù)據(jù)
- rrc a
- setb sclk ;發(fā)串行脈沖
- nop
- nop
- clr sclk
- djnz r7,rds2
- clr rst
- setb sclk
- ret
- ;ds1302寫數(shù)據(jù)子程序
- clockwr:
- push acc ;設(shè)置堆棧,入棧
- push b
- clr rst
- clr sclk
- setb rst ;選通DS1302
- mov r7,#8
- wrs1:
- rrc a
- mov io,c ;輸出一位寄存器寫地址
- clr sclk ;發(fā)串行輸出脈沖
- setb sclk
- djnz r7,wrs1
- nop
- mov a,b ;將待寫入數(shù)據(jù)送A
- mov r7,#8
- wrs2:
- rrc a
- mov io,c ;經(jīng)IO輸出一位數(shù)據(jù)
- clr sclk
- setb sclk
- djnz r7,wrs2
- pop b ;出棧
- pop acc
- ret
- ;顯示設(shè)置—— 分配時(shí)間顯示空間
- chaizi:
- mov a,year ;拆年
- mov r0,#60h
- acall hex2bcd
- mov a,month ;拆月
- mov r0,#62h
- acall hex2bcd
- mov a,day ;拆日期
- mov r0,#64h
- lcall hex2bcd
- mov a,week;
- mov 66h,a
- mov a,hour ;拆時(shí)
- mov r0,#67h
- lcall hex2bcd
- mov a,min
- mov r0,#69h ;拆分
- lcall hex2bcd
- mov a,sec
- mov r0,#6bh ;拆秒
- acall hex2bcd
- ret
- ;顯示設(shè)置—— 采用除法指令實(shí)現(xiàn)的拆字子程序
- hex2bcd:
- mov b,a
- anl a,#0f0h
- swap a
- mov @r0,a
- mov a,b
- anl a,#0fh
- inc r0
- mov @r0,a
- ret
- ;顯示設(shè)置——連續(xù)顯示相鄰的兩字節(jié)
- LcdDspBuf:
- mov A, @R0
- orl a,#30h
- acall LcdWrDat
- inc R0
- djnz R2, LcdDspBuf
- ret
- ;顯示設(shè)置——自創(chuàng)字符寫入CGRAM的子程序
- word:
- mov a,#40h
- lcall LcdWrCmd
- mov r5,#40
- mov dptr,#tab1
- mov r4,#0
- nextt:
- mov a,r4
- movc a,@a+dptr
- lcall LcdWrDat
- inc r4
- djnz r5,nextt
- ret
- tab1:
- db 08h,0fh,12h,0fh,0ah,1fh,02h,00h;年
- db 0fh,09h,0fh,09h,0fh,09h,13h,00h;月
- db 0fh,09h,09h,0fh,09h,09h,0fh,00h;日
- db 06h,0fh,1fh,0fh,07h,1bh,19h,00h;顯示鬧鐘功能開啟標(biāo)示符號(hào)
- db 15h,15h,04h,11h,1bh,1fh,0eh,00h;顯示報(bào)時(shí)功能開啟標(biāo)示符號(hào)
- ;進(jìn)入鬧鐘功能設(shè)置顯示
- display_nz:
- mov a,#0c2h
- acall LcdWrCmd ;確定鬧鐘時(shí)間的首地址
- mov R0, #dspba+0
- mov R2, #2
- acall LcdDspBuf ;顯示時(shí)
- mov a,#3ah ;顯示分隔符號(hào)
- acall LcdWrDat
- mov R0, #dspba+2
- mov R2, #2
- acall LcdDspBuf ;顯示時(shí)
- jb BJ,XT ;判斷鬧鐘功能是否開啟
- mov a,#0c0h
- acall LcdWrCmd
- mov a,#03h ;顯示鬧鐘功能開啟標(biāo)示符號(hào)
- acall LcdWrDat
- XT: ret
- ;正常顯示設(shè)置
- display:
- mov a,#80h
- acall LcdWrCmd ;指明顯示的首地址
- mov R0, #DspBuf-2
- mov R2, #2
- acall LcdDspBuf ;顯示年份前兩位
- mov R0, #DspBuf+0
- mov R2, #2
- acall LcdDspBuf ;顯示年后兩位
- mov a,#00h ;顯示漢字年
- acall LcdWrDat
- mov R0, #DspBuf+2
- mov R2, #2
- acall LcdDspBuf ;顯示月份
- mov a,#01h ;顯示漢月字年
- acall LcdWrDat
- mov R0, #DspBuf+4
- mov R2, #2
- acall LcdDspBuf ;顯示日期
- mov a,#02h ;顯示漢日字年
- acall LcdWrDat
- mov a,#8ch ;w指明星期的首地址
- acall LcdWrCmd
- mov a,#57h
- acall LcdWrDat ;顯示w
- mov a,#3ah ;顯示分隔符號(hào)
- acall LcdWrDat
- mov a,66h ;顯示星期值
- orl a,#30h
- acall LcdWrDat
- jb bs,XtT ;判斷報(bào)時(shí)功能是否開啟
- mov a,#04h ;顯示報(bào)時(shí)功能開啟標(biāo)示符號(hào)
- acall LcdWrDat
- XtT:
- mov a,#0c2h
- acall LcdWrCmd ;確定地址
- mov R0, #DspBuf+7
- mov R2, #2
- acall LcdDspBuf ;顯示時(shí)
- mov a,#3ah ;顯示分隔符號(hào)
- acall LcdWrDat
- mov R0, #DspBuf+9
- mov R2, #2
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png (49.79 KB, 下載次數(shù): 153)
下載附件
2018-5-15 03:09 上傳
所有資料51hei提供下載:
電子時(shí)鐘資料.rar
(555.89 KB, 下載次數(shù): 550)
2018-5-14 15:20 上傳
點(diǎn)擊文件名下載附件
包含原理圖,論文,程序等 下載積分: 黑幣 -5
|