基于單片機(jī)的液晶時鐘顯示畢業(yè)論文_第1頁
基于單片機(jī)的液晶時鐘顯示畢業(yè)論文_第2頁
基于單片機(jī)的液晶時鐘顯示畢業(yè)論文_第3頁
基于單片機(jī)的液晶時鐘顯示畢業(yè)論文_第4頁
基于單片機(jī)的液晶時鐘顯示畢業(yè)論文_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE32基于單片機(jī)的液晶時鐘顯示摘要:本文記述了采用STC89C52單片機(jī)在時鐘芯片DS12C887設(shè)計一個電子時鐘,并用液晶顯示時間、日期,具有鬧鐘設(shè)定及報警功能,利用實(shí)時時鐘芯片DS12C887走時準(zhǔn)確,自身掉電可繼續(xù)走時的特性,設(shè)計實(shí)現(xiàn)斷電不停,再上電是時間仍然準(zhǔn)確顯示在液晶上的功能。關(guān)鍵詞:單片機(jī)時鐘芯片2行液晶屏C語言一前言近年來,隨著我國科技的不斷進(jìn)步,我國的電子產(chǎn)品生產(chǎn)技術(shù)也已達(dá)到很高的水平,特別是液晶顯示技術(shù)也得到了蓬勃的長足發(fā)展。為了跟上這個偉大的時代潮流,我查閱大量文檔并詢問了數(shù)名老師,創(chuàng)作這篇論文,并自己動手制作實(shí)物,當(dāng)你看到這個實(shí)物的時候,我的汗水與心血終于結(jié)晶為成果。我做這個論文的創(chuàng)意是為了檢驗自己所學(xué)的單片機(jī)知識,也是為了適應(yīng)科學(xué)技術(shù)的不斷進(jìn)步。本次設(shè)計的課題主要是在學(xué)習(xí)完電工技師單片機(jī)模塊和單片機(jī)高級應(yīng)用班后進(jìn)行的課題設(shè)計。這個設(shè)計在現(xiàn)實(shí)生活中是實(shí)際應(yīng)用的產(chǎn)品的模擬,目前在嵌入式系統(tǒng)、電表、安全監(jiān)控系統(tǒng)中應(yīng)用十分廣泛。設(shè)計任務(wù)是:(1)在1602液晶屏是顯示年、月、日、星期、時、分、秒,而且按實(shí)時更新跳變。(2)具有鬧鐘設(shè)定和報警,報警響起時按任何鍵可以取消報警;(3)能夠使用按鍵隨時調(diào)節(jié)各個參數(shù),按鍵設(shè)計4個有效鍵,分別為功能選擇鍵、數(shù)值增大鍵、數(shù)據(jù)減少鍵和鬧鐘查看鍵;(4)每次有按鍵按下是,蜂鳴器都以短“滴”聲報警;(5)利用DS12C887自身掉電可繼續(xù)走時的特性,設(shè)計實(shí)現(xiàn)斷電時間不停,再次上電時時間仍然準(zhǔn)確顯示在液晶屏上的功能。二方案論證及選擇在許多智能化電子設(shè)備中,通常進(jìn)行一些與時間有關(guān)的控制,如果用系統(tǒng)的定時器來設(shè)計時鐘的話,偶然的掉電或晶振的無恥都會造成時間的錯亂,更糟糕的是,若完全用程序設(shè)計時鐘還會占用大量的系統(tǒng)資源,從而嚴(yán)重影響系統(tǒng)的其他功能。為此,很多芯片制造公司都設(shè)計出來各種各樣的實(shí)時時鐘芯片,如DS1302、DS12C887、MAC7111和PCF8583等。常見的芯片有兩種。一種是非常體積小的表面貼片式,通常用在高端的小型手持式儀器或設(shè)備上,如手機(jī)、MP4播放器、GPS導(dǎo)航儀等。這種芯片在使用時需要接備份電池和外部晶振,電池用來保持主系統(tǒng)在意外掉電時為時鐘芯片提供電源,外部晶振用來提供時鐘芯片所必須的振蕩頻率來源,標(biāo)準(zhǔn)頻率為32.768kHz,這種芯片體積小,所以引腳很少,操作起來非常方便,比如,DALLAS公司生產(chǎn)的串行實(shí)時時鐘芯片DS1302。另一種體積相對較大,一般為直插式,它的內(nèi)部集成有可充電鋰電池,同時內(nèi)部還集成了32.768kHz的標(biāo)準(zhǔn)晶振,一旦設(shè)定好時間,即使系統(tǒng)的主電源掉電,該時鐘芯片仍然可以靠它內(nèi)部集成的鋰電池走數(shù)年,當(dāng)系統(tǒng)重新上電是,有可為鋰電池重新充電,這樣一來可以非常有效的保持時間的有效性,使用時非常方便。這類芯片如DALLAS公司生產(chǎn)的DS12C887.設(shè)計方案一:DS1302+數(shù)碼管應(yīng)該說這個方案在電子時鐘制作中應(yīng)用最多:DS1302的使用非常方便,而且價格也不貴,同時數(shù)碼管顯示的也很清楚,特別是顯示時間很直觀,但我在查閱了很多資料后發(fā)現(xiàn)一些問題,DS1302是不自帶電池的,雖然可以通過外接紐扣電池來達(dá)到斷電時繼續(xù)走時的目的,但在實(shí)際應(yīng)用中還是比較困難的,因為DS1302上電需要復(fù)位,而復(fù)位就會把正確的走時清零,如果不復(fù)位,DS1302會出現(xiàn)各種各樣的問題,如不走時、讀出亂碼等;要解決這個問題需要增加如2402等存儲器,上電后先儲存時間值,再復(fù)位;這木做無疑增加了電路設(shè)計和軟件設(shè)計的復(fù)雜度。設(shè)計方案二:DS12C887+液晶顯示采用DS12C887作為實(shí)時時鐘芯片,1602液晶作為顯示輸出;DS12C887不僅自帶鋰電池而且內(nèi)部帶有標(biāo)準(zhǔn)晶振,無需外接,使用方便;走時精度較高,并具有與微處理器的并行接口,可方便地用于對時鐘精度要求較高的智能化儀表儀器中。采用液晶顯示功耗低,輕便防震。設(shè)計方案三:單片機(jī)定時器+數(shù)碼管這種設(shè)計如今基本已被淘汰,最大的問題在于一旦斷電就無法繼續(xù)走時,而且由于是依靠軟件編程利用定時器實(shí)現(xiàn)走時,所以走時精度不高。當(dāng)然這個方案也有它的優(yōu)點(diǎn),就是價格便宜。為了達(dá)到最好的走時顯示效果,同時也為了提高自己運(yùn)用單片機(jī)設(shè)計項目的能力,我決定選擇設(shè)計方案二進(jìn)行制作。本文主要介紹了電子時鐘的功能和設(shè)計過程。重點(diǎn)數(shù)名硬件設(shè)計和軟件設(shè)計。三硬件設(shè)計1總體方案本設(shè)計以單片機(jī)STC89C52為控制核心,由實(shí)時時鐘模塊、按鍵調(diào)整時鐘輸出模塊、鬧鐘報警模塊和顯示模塊組成。可以實(shí)現(xiàn)時間顯示、鬧鐘設(shè)置、鬧鐘到時報警等功能。鬧鐘報警模塊由蜂鳴器和DS12C887組成??蓪?shí)現(xiàn)鬧鐘控制和到時報警功能,調(diào)整輸入采用電平方式單個控制按鍵控制,時鐘芯片采用DS12C887來控制實(shí)時時鐘的運(yùn)轉(zhuǎn)。此系統(tǒng)結(jié)構(gòu)簡單,使用方便,具有精度高、體積小、功耗低和成本低等特點(diǎn),使用于我們?nèi)粘I詈凸ぁ⑥r(nóng)業(yè)生產(chǎn)中的時間顯示,還可應(yīng)用于智能化電子產(chǎn)品中,具有廣泛的應(yīng)用前景。總體電路結(jié)構(gòu)框圖如下:時鐘顯示時鐘顯示DS12C887STC89C52主控制器鍵掃描電路1602液晶顯示屏鬧鐘報警2主控制器主控制器我們采用價格便宜、體積小、性能強(qiáng)大,而且能與DS12C887直接通信的單片機(jī)STC89C52作為主控制器。電子鐘對主控制器的要求并不高,51系列單片機(jī)完全可以勝任??紤]到下載程序方便和價格等因素,我選擇了STC公司的51單片機(jī)作為系統(tǒng)的控制芯片。STC的STC89C52RC兼容51單片機(jī),價格便宜,抗干擾強(qiáng);與其它51單片機(jī)相比它最大的特點(diǎn)是具有ISP下載功能,通過一片MAX232就可以很方便的實(shí)現(xiàn)程序的下載。電源+5V電源+5V單片機(jī)STC89C52RCLCD1602PC機(jī)通訊MAX232軟件程序C語言編寫數(shù)據(jù)傳輸原理圖其數(shù)據(jù)傳輸過程如下:MAX232的11腳T1in接單片機(jī)TXD端P3.1,TTL電平從單片機(jī)的TXD端發(fā)出,經(jīng)過MAX232轉(zhuǎn)換為RS-232電平后從MAX232的14腳TIout發(fā)出,再連接到實(shí)驗板上串口座的3腳,再經(jīng)過交叉串口線后,連接至PC機(jī)的串口座的第2腳,至此計算機(jī)接收到數(shù)據(jù);PC機(jī)發(fā)送數(shù)據(jù)時從PC機(jī)串口座第3腳TXD發(fā)出數(shù)據(jù),再逆向流向單片機(jī)的RXD端P3.0接收數(shù)據(jù)。2液晶顯示模塊本文使用的1602液晶為+5V電壓驅(qū)動,帶背光,背光亮度和顯示對比度可調(diào),是一種功能較簡單、價格較便宜的液晶顯示器件。它由液晶顯示屏和驅(qū)動器兩部分組成,單片機(jī)聽你哥哥寫控制字的方式訪問驅(qū)動器來實(shí)現(xiàn)對顯示屏的控制,并有并行接口,無串行接口;采用液晶顯示界面清晰,操作方便,具有兩行顯示,每行16個字符,內(nèi)置128個字符的ASCII字符集字庫,第一行顯示實(shí)時時鐘,第二行顯示鬧鐘,還具有鬧鐘功能和液晶亮度調(diào)節(jié)功能,并且可以對其方便的進(jìn)行程序控制,完全能滿足設(shè)計的要求。(1)1602接口信號如下圖所示:字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。(2)1602的基本操作時序:讀狀態(tài)

輸入:RS=L,RW=H,E=H

輸出:DB0~DB7=狀態(tài)字

寫指令

輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼

輸出:無

讀數(shù)據(jù)

輸入:RS=H,RW=H,E=H

輸出:DB0~DB7=數(shù)據(jù)

寫數(shù)據(jù)

輸入:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數(shù)據(jù)

輸出:無(3)1602的地址映射圖l602的核心芯片是HD44780。HD44780內(nèi)置了DDRAM、CGROM和CGRAM。DDRAM就是顯示數(shù)據(jù)RAM,用來寄存待顯示的字符代碼。共80個字節(jié),其地址和屏幕的對應(yīng)關(guān)系如下表:(4)指令說明初始化設(shè)置指令碼如表所示:初始化指令碼與功能對照表指令碼00111000設(shè)置顯示模式為16X200001DCBD:顯示開/關(guān)(1/0)

C:光標(biāo)顯示/不顯示(1/0)

B:光標(biāo)閃爍/不閃爍(1/0)數(shù)據(jù)控制液晶控制器內(nèi)部設(shè)有數(shù)據(jù)地址指針,用戶通過它訪問80B的顯示RAM,關(guān)系如表所示:數(shù)據(jù)指針設(shè)置指令碼功能80H+地址碼(0~27,40~67H)設(shè)置數(shù)據(jù)地址指針初始化過程a延時15msb寫指令38H;設(shè)置顯示模式c延時5msd寫指令38H;設(shè)置顯示模式e延時5msf寫指令38H;設(shè)置顯示模式g寫指令06H;顯示光標(biāo)移動設(shè)置h寫指令0CH;顯示開及光標(biāo)設(shè)置i寫指令01H;顯示清屏j寫指令80H;定位數(shù)據(jù)指針到80H數(shù)據(jù)RAM讀寫a讀顯示RAM首先,寫指令碼(指令碼為目標(biāo)RAM地址)。然后,從D0~D7口獲得數(shù)據(jù)。b寫顯示RAM首先,寫指令碼(指令碼為目標(biāo)RAM地址)。然后,寫數(shù)據(jù)到D0-D7。例如讓LCD的第一行第二個位置(RAM地址0x81)顯示字符“1”(ASCII0x31)的實(shí)現(xiàn)過程如下:E=高脈沖,RS=L,RW=L,D0~D7=0x81E=高脈沖,RS=L,RW=L,D0~D7=0x311602與CPU連接圖如下圖所示:1602與CPU連接圖3實(shí)時時鐘芯片DS12887DS12887是DALLAS半導(dǎo)體公司新推出的實(shí)時時鐘芯片RTC(RealTimeClock),可直接取代DS1287,它功能豐富,應(yīng)用廣泛。DS12887內(nèi)部自帶晶體振蕩器及鋰電池,可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補(bǔ)償,斷電后能運(yùn)行10年之久不丟失數(shù)據(jù)??蛇x用夏令時,具有24小時或12小時兩種制式。它在工業(yè)控制及智能儀器儀表中有廣泛用途,如PC機(jī)內(nèi)的時鐘信號就是由DS12887提供的。DS12887的結(jié)構(gòu)框圖(見圖1)DS12887的特點(diǎn)◆可作為個人計算機(jī)的時鐘和日歷;◆與MCl46818B和DS1287的管腳兼容◆在沒有外部電源的情況下可工作10年◆自帶晶體振蕩器及鋰電池◆可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補(bǔ)償◆有二進(jìn)制碼或BCD碼代表日歷和鬧鐘信息◆有12和24小時兩種制式,12小時制時有AM和PM提示◆可選用夏令時模式◆可以應(yīng)用于MOTOROLA和INTEL兩種總線◆數(shù)據(jù)/地址總線復(fù)用◆內(nèi)建128字節(jié)RAM ◆14字節(jié)時鐘控制寄存器◆114字節(jié)通用RAM◆可編程方波輸出◆總線兼容中斷(/IRQ)◆三種可編程中斷◆時間性中斷,可產(chǎn)生每秒一次直到每天一次中斷◆周期性中斷122mS到500mS◆時鐘更新結(jié)束中斷DS12887的引腳排列(見圖2)DS12887的引腳功能介紹:GND、VCC:直流電源,其中VCC接+5V輸入,GND接地,當(dāng)VCC輸入為+5V時,用戶可以訪問DS12C887內(nèi)RAM中的數(shù)據(jù),并可對其進(jìn)行讀、寫操作;當(dāng)VCC的輸入小于RAM進(jìn)行讀、寫操作,此時用戶不能正確獲取芯片內(nèi)的時間信+4.25V時,禁止用戶對內(nèi)部息;當(dāng)VCC的輸入小于+3V時,DS12C887會自動將電源發(fā)換到內(nèi)部自帶的鋰電池上,以保證內(nèi)部的電路能夠正常工作。MOT:模式選擇腳,DA12C887有兩種工作模式,即Motorola模式和Intel模式,當(dāng)MOT接VCC時,選用的工作模式是Motorola模式,當(dāng)MOT接GND時,選用的是Intel模式。本文主要討論Intel模式。SQW:方波輸出腳,當(dāng)供電電壓VCC大于4.25V時,SQW腳可進(jìn)行方波輸出,此時用戶可以通過對控制寄存器編程來得到13種方波信號的輸出。AD0~AD7:復(fù)用地址數(shù)據(jù)總線,該總線采用時分復(fù)用技術(shù),在總線周期的前半部分,出現(xiàn)在AD0~AD7上的是地址信息,可用以選通DS12C887內(nèi)的RAM,總線周期的后半部分出現(xiàn)在AD0~AD7上的數(shù)據(jù)信息。AS:地址選通輸入腳,在進(jìn)行讀寫操作時,AS的上升沿將AD0~AD7上出現(xiàn)的地址信息鎖存到DS12C887上,而下一個下降沿清除AD0~AD7上的地址信息,不論是否有效,DS12C887都將執(zhí)行該操作。DS/RD:數(shù)據(jù)選擇或讀輸入腳,該引腳有兩種工作模式,當(dāng)MOT接VCC時,選用Motorola工作模式,在這種工作模式中,每個總線周期的后一部分的DS為高電平,被稱為數(shù)據(jù)選通。在讀操作中,DS的上升沿使DS12C887將內(nèi)部數(shù)據(jù)送往總線AD0~AD7上,以供外部讀取。在寫操作中,DS的下降沿將使總線AD0~AD7上的數(shù)據(jù)鎖存在DS12C887中;當(dāng)MOT接GND時,選用Intel工作模式,在該模式中,該引腳是讀允許輸入腳,即ReadEnable。R/W:讀/寫輸入端,該管腳也有2種工作模式,當(dāng)MOT接VCC時,R/W工作在Motorola模式。此時,該引腳的作用是區(qū)分進(jìn)行的是讀操作還是寫操作,當(dāng)R/W為高電平時為讀操作,R/W為低電平時為寫操作;當(dāng)MOT接GND時,該腳工作在Intle模式,此時該作為寫允許輸入,即WriteEnable。CS:片選輸入,低電平有效。IRQ:中斷請求輸入,低電平有效,該腳有效對DS12C887內(nèi)的時鐘、日歷和RAM中的內(nèi)容沒有任何影響,僅對內(nèi)部的控制寄存器有影響,在典型的應(yīng)用中,RESET可以直接接VCC,這樣可以保證DS12C887在掉電時,其內(nèi)部控制寄存器不受影響。在DS12C887內(nèi)有11字節(jié)RAM用來存儲時間信息,4字節(jié)用來存儲控制信息,其具體地址及取值如表1所列。由表1可以看出:DS12C887內(nèi)部有控制寄存器的A-B等4個控制寄存器,用戶都可以在任何時候?qū)ζ溥M(jìn)行訪問以對DS12C887進(jìn)行控制操作。DS12887上電時,當(dāng)Vcc高于4.25V200mS后,芯片可以被外部程序操作。當(dāng)Vcc低于4.25V時,芯片處于寫保護(hù)狀態(tài)(所有的輸入均無效),同時所有輸出呈高阻狀態(tài)。當(dāng)Vcc低于3V時,芯片將自動把供電方式切換為由內(nèi)部電池供電。DS12887有128個RAM單元。其中4個單元用作控制寄存器,10個單元用作存放時鐘字節(jié),114字節(jié)為通用RAM。其主要寄存器如下:DS12887內(nèi)部寄存器A:UIPDV2DV1DV0RS3RS2RS1RS0UIP=l:更新已到,不能讀/寫DSl2887;UIP=0:更新末到,能讀/寫DS12887。DV2,DV1,DV0應(yīng)設(shè)置為010,表示打開晶振,允許計時。RS3,RS2,RS1,RS0為方波頻率選擇位,產(chǎn)生方波周期中斷。DS12887內(nèi)部寄存器B:SETPIEAIEUIESQWEDM24/12DSESET=0:時間更新正常進(jìn)行,每秒計數(shù)1次;SET=1:禁止更新,程序可初始化時間和日歷。PIE=l:允許周期中斷;PIE=0:禁止周期中斷。AIE=1:允許報警中斷;AIE=0:禁止報警中斷。UIE=1:允許更新結(jié)束中斷;UIE=0:禁止更新結(jié)束中斷。SQWE為方波允許位。SQWE=1:將RS3,RS2,RS1,RS0選定的方波輸出。DM=1:BCD碼;DM=0:二進(jìn)制。該位不受復(fù)位信號影響24/12:1表示24[小]時制;0表示12[小]時制。DSE為夏時制允許位。DSE=l:采用夏時制;DSE=0:不采用夏時制。DS12887內(nèi)部寄存器C:IRQFPFAFUF0000IRQF為中斷申請標(biāo)志。PF為方波周期中斷標(biāo)志。PF=1:方波周期結(jié)束,申請中斷。AF為鬧鈴中斷標(biāo)志。AF=1:當(dāng)前時間與鬧鈴時間匹配時即刻申請中斷。UF為更新周期結(jié)束中斷標(biāo)志。UF二I:更新周期結(jié)束時申請中斷。DS12887內(nèi)部寄存器D:VRT0000000VRT為內(nèi)部鋰電池狀態(tài)。VRT=1:鋰電池正常;VRT=0:鋰電池耗盡。DS12887內(nèi)部存儲器功能如附表所示:地址功能取值范圍(十進(jìn)制數(shù))取值范圍(二進(jìn)制數(shù))取值范圍(BCD碼)0秒0~5900~3B00~591秒鬧鈴0~5900~3B00~592分0~5900~3B00~593分鬧鈴0~5900~3B00~59412[小]時模式0~1201~0CAM81~8CPM01~12AM81~92PM24[小]時模式0~2300~1700~235時鬧鈴,12[小]時制1~1201~0CAM81~8CPM01~12AM81~92PM時鬧鈴,24[小]時制0~2300~1700~236星期(星期天=1)1~701~0701~077日1~3101~1F01~318月1~1201~0C01~129年0~9900~6300~9910控制寄存器A11控制寄存器B12控制寄存器C13控制寄存器D50世紀(jì)0~99NA19,20附表時序圖時序分析及軟件功能的實(shí)現(xiàn)DS12CR887有兩種接口總線時序工作方式,此系統(tǒng)中DSl2CR887工作在Intel總線時序方式,其寫命令時序如圖3所示,讀命令時序如圖4所示。從DS12CR887的時序圖可以看出,在一次讀或?qū)懖僮髦?,地址/?shù)據(jù)復(fù)用總線上先出現(xiàn)地址,后出現(xiàn)數(shù)據(jù)。寫操作時,當(dāng)片選信號CS有效時,地址鎖存信號AS的下降沿將AD0~AD7上的數(shù)據(jù)鎖存作為地址(AS高電平的寬度PWASH不小于45ns時,鎖存地址有效);隨后讀寫信號R/W為低電平(低電平寬度PWEH不小于90ns),在R/W的上升沿將AD0~AD7上的數(shù)據(jù)寫入DSl2CR887,在R/W的上升沿要求AD0~AD7的數(shù)據(jù)穩(wěn)定時間不為小于70ns(即tdsw>70ns),通過上述時序,才完成一次寫操作。讀操作同樣首先將數(shù)據(jù)線(AD0~AD7)上的信號鎖存為DS12CR887需要的地址,然后DS12CR887才能在AD0~AD7上輸出有效數(shù)據(jù)。DS12C887與單片機(jī)連接電路圖如下圖所示:1602的外形尺寸:4鍵盤輸入按鍵調(diào)整是在輸入模塊,采用按鍵單個電平控制,工友4個按鍵。采用液晶顯示,分別調(diào)整實(shí)時時鐘的時、分和鬧鐘時、分,可實(shí)現(xiàn)時間調(diào)整,鬧鐘設(shè)置的功能。之間在其時鐘運(yùn)轉(zhuǎn)的同時,在其上進(jìn)行時間調(diào)節(jié)。P2.0P2.0P2.1P2.2P2.3GNDS1S2S3S4按鍵掃描電路圖5鬧鐘報警鬧鐘報警電路,采用的時有液晶顯示屏第二行所顯示鬧鐘的設(shè)定時間為基準(zhǔn),有DS12C887時鐘芯片來控制,判斷液晶顯示屏第一行所顯示實(shí)時時鐘是否與液晶屏第二行所顯示鬧鐘的設(shè)定時間一致,如果相同則蜂鳴器鳴響,如不同則繼續(xù)判斷。P3.2P3.2R=1KGNDBEEPVCC+5VQ1(PNP)鬧鐘報警電路圖如上所示。四程序設(shè)計1主程序流程圖開始開始結(jié)束初始化DS12C887LCD顯示時間和鬧鐘程序DS12C887開始振蕩判斷是否有按鍵按下判斷鬧鐘是否到時調(diào)整時間和鬧鐘蜂鳴器鬧鐘響YYNN主程序流程圖主程序因為使用了時鐘芯片DS12C887,程序只需要從DS12C887各個寄存器中讀出年、月、日、時、分、秒等數(shù)據(jù),子啊處理即可。在首次對DS12C887進(jìn)行操作前,必須對它初始化,然后從DS12C887中讀出數(shù)據(jù),再經(jīng)過處理后,送給顯示緩沖單元。控制按鍵有效,進(jìn)入年調(diào)整程序等待按鍵程序控制按鍵有效,進(jìn)入年調(diào)整程序等待按鍵程序+或-鍵有效年+或-1控制鍵有效,跳出時間調(diào)整程序進(jìn)入主循環(huán)程序控制按鍵有效,進(jìn)入月調(diào)整程序等待按鍵程序+或-鍵有效月+或-1控制按鍵有效,進(jìn)入日調(diào)整程序等待按鍵程序+或-鍵有效日+或-1控制按鍵有效,進(jìn)入星期調(diào)整程序等待按鍵程序+或-鍵有效星期+或-1控制按鍵有效,進(jìn)入小時調(diào)整程序等待按鍵程序+或-鍵有效小時+或-1控制按鍵有效,進(jìn)入分鐘調(diào)整程序等待按鍵程序+或-鍵有效分+或-12時間調(diào)整流程圖3C語言程序設(shè)計##include<reg52.h>#include"define.h"voiddelay(uintz)//延時zms函數(shù){ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddi()//蜂鳴器報警聲音{beep=0;delay(100);beep=1;}//=======================================voidwrite_com(ucharcom)//寫液晶命令函數(shù){ rs=0; P0=com; delay(1); lcden=1; delay(3); lcden=0; delay(1);}voidwrite_date(uchardate)//寫液晶數(shù)據(jù)函數(shù){ rs=1; P0=date; delay(1); lcden=1; delay(3); lcden=0; delay(1);}//======================================================voidinit()//初始化函數(shù){ ucharnum; EA=1;//打開總中斷 EX1=1;//打開外部中斷1 IT1=1;//設(shè)置負(fù)跳變沿觸發(fā)中斷 flag1=0;//變量初始化 flag=0; s1num=0; lcden=0; dsas=0;/*************************以下幾行在首次設(shè)置DS12C887時使用,** write_ds(0x0B,0xa6);//set=1,設(shè)置24h,數(shù)據(jù)二進(jìn)制,鬧鐘中斷 write_ds(0x0A,0x20);//打開振蕩器************************* if(!(read_ds(0x0d))){di();ceshi=0;}/***************************以后不必寫入***********************/ delay(10); write_com(0x38);//1602液晶初始化 write_com(0x0C); write_com(0x06); write_com(0x01); write_com(0x80); for(num=0;num<15;num++)//寫入液晶固定部分顯示 { write_date(table[num]); delay(1); } write_com(0x80+0x40); for(num=0;num<12;num++) { write_date(table1[num]); delay(10); }}////****1602液晶刷新時分秒函數(shù)4為時,7為分,10為秒voidwrite_sfm(ucharadd,chardate){ ucharshi,ge; shi=date/10; ge=date%10; write_com(0x80+0x40+add); write_date(0x30+shi); write_date(0x30+ge);}//****液晶年月日函數(shù)3為年,6為月,9為日voidwrite_nyr(ucharadd,chardate){ ucharshi,ge; shi=date/10; ge=date%10; write_com(0x80+add); write_date(0x30+shi); write_date(0x30+ge);}//****1602液晶刷新星期函數(shù)voidwrite_week(charwe){ write_com(0x80+12); switch(we) { case1: write_date('M');//delay(1); write_date('O');//delay(1); write_date('N');//delay(1); break; case2: write_date('T');//delay(1); write_date('U');//delay(1); write_date('E');//delay(1); break; case3: write_date('W');//delay(1); write_date('E');//delay(1); write_date('D');//delay(1); break; case4: write_date('T');//delay(1); write_date('H');//delay(1); write_date('U');//delay(1); break; case5: write_date('F');//delay(1); write_date('R');//delay(1); write_date('I');//delay(1); break; case6: write_date('S');//delay(1); write_date('A');//delay(1); write_date('T');//delay(1); break; case7: write_date('S');//delay(1); write_date('U');//delay(1); write_date('N');//delay(1); break; default:break;// write_date('e');delay(1);// write_date('r');delay(1);// write_date('r');delay(1); }}//voidkeyscan(){ if(flag_ri==1)//這里用來消除鬧鐘報警,按任一鍵取消 { if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { delay(5); if((s1==0)||(s2==0)||(s3==0)||(s4==0)) { while(!(s1&&s2&&s3&&s4)); di();//消除報警標(biāo)志 flag_ri=0; } } }//*****************檢測s1_menu if(s1==0)//檢測s1_menu { delay(5); if(s1==0) { while(!s1); di(); flag=1; s1num++;//記錄按下次數(shù) if(flag1==1){if(s1num==4)s1num=1;}//鬧鈴調(diào)整 switch(s1num)//光標(biāo)閃爍點(diǎn)定位 { case1:write_com(0x80+0x40+10);//flash_sec write_com(0x0f); break; case2:write_com(0x80+0x40+7);//flash_min break; case3:write_com(0x80+0x40+4);//flash_hour break; case4:write_com(0x80+12); //flash_week break; case5:write_com(0x80+9); //flash_day break; case6:write_com(0x80+6); //flash_mon break; case7:write_com(0x80+3); //flsah_year break; case8:s1num=0; write_com(0x0c); flag=0; break; }}}//****************檢測按鍵S2 if(s1num!=0)//只有當(dāng)s1按下后,才檢測s2和s3 { if(s2==0)//檢測s2 { delay(5); if(s2==0) { di(); while(!s2); switch(s1num)//根據(jù)功能鍵次數(shù)調(diào)節(jié)相應(yīng)數(shù)值 { case1: if(flag1) { amiao++;if(amiao>59)amiao=0; write_sfm(10,amiao); write_com(0x80+0x40+10); write_ds(1,amiao); } else { miao++; if(miao>59)miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); write_ds(0,miao); } break; case2: if(flag1) { afen++; if(afen>59)afen=0; write_sfm(7,afen); write_com(0x80+0x40+7); write_ds(3,afen); } else { fen++; if(fen>59)fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); write_ds(2,fen); } break; case3: if(flag1) { ashi++; if(ashi>23)ashi=0; write_sfm(4,ashi); write_com(0x80+0x40+4); write_ds(5,ashi); } else { shi++; if(shi>23)shi=0; write_sfm(4,shi); write_com(0x80+0x40+4); write_ds(4,shi); } break; case4:week++; if(week>7)week=1; write_week(week); write_com(0x80+12); write_ds(6,week); break; case5:day++; if(day>31)day=1;write_nyr(9,day);write_com(0x80+9); write_ds(7,day);break; case6:month++; if(month>12)month=1;write_nyr(6,month);write_com(0x80+6); write_ds(8,month);break; case7:year++; if(year>99)year=0; write_ds(9,year); write_nyr(3,year);write_com(0x80+3);break; } } }//***************check_s3-- if(s3==0); { delay(1); if(s3==0) { di(); while(!s3); switch(s1num)//根據(jù)功能鍵次數(shù)調(diào)節(jié)相應(yīng)數(shù)值 { case1: if(flag1) { amiao--; if(amiao<0)amiao=59; write_sfm(10,amiao); write_com(0x80+0x40+10); write_ds(1,amiao); } else { miao--; if(miao<0)miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); write_ds(0,miao); } break; case2: if(flag1) { afen--; if(afen<0)afen=59; write_sfm(7,afen); write_com(0x80+0x40+7); write_ds(3,afen); } else { fen--; if(fen<0)fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); write_ds(2,fen); } break; case3: if(flag1) { ashi--; if(ashi<0)ashi=23; write_sfm(4,ashi); write_com(0x80+0x40+4); write_ds(5,ashi); } else { shi--; if(shi<0)shi=23; write_sfm(4,shi); write_com(0x80+0x40+4); write_ds(4,shi); } break; case4:week--; if(week<1)week=7; write_week(week); write_com(0x80+12); write_ds(6,week); break; case5:day--; if(day<1)day=31; write_nyr(9,day); write_com(0x80+9); write_ds(7,day); break; case6:month--; if(month<1)month=12; write_nyr(6,month); write_com(0x80+6); write_ds(8,month); break; case7:year--; if(year<0)year=99; write_ds(9,year); write_nyr(3,year); write_com(0x80+3); break; } } } }//******************檢測s4_alarm if(s4==0)//檢測s4 { delay(5); if(s4==0) { write_com(0x0c);flag=0;s1num=0; flag1=~flag1; while(!s4); di(); if(flag1==0)//退出鬧鐘設(shè)置時保存數(shù)值 { write_com(0x80+0x40); write_date(''); write_date(''); } else//進(jìn)入鬧鐘設(shè)置 { read_alarm();//讀取原始數(shù)據(jù) write_com(0x80+0x40);write_date('R');//顯示標(biāo)志write_date('i');write_com(0x80+0x40+3);write_sfm(4,ashi);//送液晶顯示鬧鐘時間write_sfm(7,afen); write_sfm(10,amiao); }}}}//=============================voidwrite_ds(ucharadd,uchardate)//寫12C887函數(shù){ dscs=0; dsrd=1;dswr=1; P0=add;//先寫地址 dsas=0;delay(1);//鎖存8位地址 P0=date; dswr=0; dsas=1; dscs=1;delay(1);}ucharread_ds(ucharadd){//讀12C887函數(shù) uchards_date; dscs=0; dsrd=1;dswr=1; P0=add;//if(add==2)i=47;//先寫地址 dsas=0; //鎖存8位地址 P0=0xff; dsrd=0;//delay(1); ds_date=P0;//再du數(shù)據(jù)// if(i==ds_date){ceshi=1;while(1);}// else{ceshi=0;di();} dsas=1; dscs=1;delay(1); returnds_date;}voidck_ds_uip()//set=0時,需要檢測UIP位,確定是否可以讀寫{ uchari; dscs=0; dsrd=1;dswr=1; P0=0x0a;//先寫地址 dsas=0; //鎖存8位地址 P0=0xff; dsrd=0; while((P0&0x80)&(i++<255));//ceshi=!ceshi;//判斷uip是否為0 dsas=1; dscs=1;delay(1);}/*首次操作12C887時給予寄存器初始化voidset_time(){//首次上電初始化時間函數(shù)write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);}*/voidread_alarm()//讀取12C887鬧鐘值{ amiao=read_ds(1); afen=read_ds(3); ashi=read_ds(5);}//***********************************************************voidmain()//主函數(shù){ delay(100); init();//調(diào)用初始化函數(shù) while(1){ if(flag_ri==1)//當(dāng)鬧鐘中斷時進(jìn)入這里 { di(); delay(100); di(); delay(500);} keyscan();//按鍵掃描 if(flag==0&&flag1==0)//正常工作時進(jìn)入這里{ keyscan();//按鍵掃描//**************讀取12C887數(shù)據(jù) miao=read_ds(0); fen=read_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論