




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PAGEPAGE32基于單片機的液晶時鐘顯示摘要:本文記述了采用STC89C52單片機在時鐘芯片DS12C887設計一個電子時鐘,并用液晶顯示時間、日期,具有鬧鐘設定及報警功能,利用實時時鐘芯片DS12C887走時準確,自身掉電可繼續走時的特性,設計實現斷電不停,再上電是時間仍然準確顯示在液晶上的功能。關鍵詞:單片機時鐘芯片2行液晶屏C語言一前言近年來,隨著我國科技的不斷進步,我國的電子產品生產技術也已達到很高的水平,特別是液晶顯示技術也得到了蓬勃的長足發展。為了跟上這個偉大的時代潮流,我查閱大量文檔并詢問了數名老師,創作這篇論文,并自己動手制作實物,當你看到這個實物的時候,我的汗水與心血終于結晶為成果。我做這個論文的創意是為了檢驗自己所學的單片機知識,也是為了適應科學技術的不斷進步。本次設計的課題主要是在學習完電工技師單片機模塊和單片機高級應用班后進行的課題設計。這個設計在現實生活中是實際應用的產品的模擬,目前在嵌入式系統、電表、安全監控系統中應用十分廣泛。設計任務是:(1)在1602液晶屏是顯示年、月、日、星期、時、分、秒,而且按實時更新跳變。(2)具有鬧鐘設定和報警,報警響起時按任何鍵可以取消報警;(3)能夠使用按鍵隨時調節各個參數,按鍵設計4個有效鍵,分別為功能選擇鍵、數值增大鍵、數據減少鍵和鬧鐘查看鍵;(4)每次有按鍵按下是,蜂鳴器都以短“滴”聲報警;(5)利用DS12C887自身掉電可繼續走時的特性,設計實現斷電時間不停,再次上電時時間仍然準確顯示在液晶屏上的功能。二方案論證及選擇在許多智能化電子設備中,通常進行一些與時間有關的控制,如果用系統的定時器來設計時鐘的話,偶然的掉電或晶振的無恥都會造成時間的錯亂,更糟糕的是,若完全用程序設計時鐘還會占用大量的系統資源,從而嚴重影響系統的其他功能。為此,很多芯片制造公司都設計出來各種各樣的實時時鐘芯片,如DS1302、DS12C887、MAC7111和PCF8583等。常見的芯片有兩種。一種是非常體積小的表面貼片式,通常用在高端的小型手持式儀器或設備上,如手機、MP4播放器、GPS導航儀等。這種芯片在使用時需要接備份電池和外部晶振,電池用來保持主系統在意外掉電時為時鐘芯片提供電源,外部晶振用來提供時鐘芯片所必須的振蕩頻率來源,標準頻率為32.768kHz,這種芯片體積小,所以引腳很少,操作起來非常方便,比如,DALLAS公司生產的串行實時時鐘芯片DS1302。另一種體積相對較大,一般為直插式,它的內部集成有可充電鋰電池,同時內部還集成了32.768kHz的標準晶振,一旦設定好時間,即使系統的主電源掉電,該時鐘芯片仍然可以靠它內部集成的鋰電池走數年,當系統重新上電是,有可為鋰電池重新充電,這樣一來可以非常有效的保持時間的有效性,使用時非常方便。這類芯片如DALLAS公司生產的DS12C887.設計方案一:DS1302+數碼管應該說這個方案在電子時鐘制作中應用最多:DS1302的使用非常方便,而且價格也不貴,同時數碼管顯示的也很清楚,特別是顯示時間很直觀,但我在查閱了很多資料后發現一些問題,DS1302是不自帶電池的,雖然可以通過外接紐扣電池來達到斷電時繼續走時的目的,但在實際應用中還是比較困難的,因為DS1302上電需要復位,而復位就會把正確的走時清零,如果不復位,DS1302會出現各種各樣的問題,如不走時、讀出亂碼等;要解決這個問題需要增加如2402等存儲器,上電后先儲存時間值,再復位;這木做無疑增加了電路設計和軟件設計的復雜度。設計方案二:DS12C887+液晶顯示采用DS12C887作為實時時鐘芯片,1602液晶作為顯示輸出;DS12C887不僅自帶鋰電池而且內部帶有標準晶振,無需外接,使用方便;走時精度較高,并具有與微處理器的并行接口,可方便地用于對時鐘精度要求較高的智能化儀表儀器中。采用液晶顯示功耗低,輕便防震。設計方案三:單片機定時器+數碼管這種設計如今基本已被淘汰,最大的問題在于一旦斷電就無法繼續走時,而且由于是依靠軟件編程利用定時器實現走時,所以走時精度不高。當然這個方案也有它的優點,就是價格便宜。為了達到最好的走時顯示效果,同時也為了提高自己運用單片機設計項目的能力,我決定選擇設計方案二進行制作。本文主要介紹了電子時鐘的功能和設計過程。重點數名硬件設計和軟件設計。三硬件設計1總體方案本設計以單片機STC89C52為控制核心,由實時時鐘模塊、按鍵調整時鐘輸出模塊、鬧鐘報警模塊和顯示模塊組成。可以實現時間顯示、鬧鐘設置、鬧鐘到時報警等功能。鬧鐘報警模塊由蜂鳴器和DS12C887組成。可實現鬧鐘控制和到時報警功能,調整輸入采用電平方式單個控制按鍵控制,時鐘芯片采用DS12C887來控制實時時鐘的運轉。此系統結構簡單,使用方便,具有精度高、體積小、功耗低和成本低等特點,使用于我們日常生活和工、農業生產中的時間顯示,還可應用于智能化電子產品中,具有廣泛的應用前景。總體電路結構框圖如下:時鐘顯示時鐘顯示DS12C887STC89C52主控制器鍵掃描電路1602液晶顯示屏鬧鐘報警2主控制器主控制器我們采用價格便宜、體積小、性能強大,而且能與DS12C887直接通信的單片機STC89C52作為主控制器。電子鐘對主控制器的要求并不高,51系列單片機完全可以勝任。考慮到下載程序方便和價格等因素,我選擇了STC公司的51單片機作為系統的控制芯片。STC的STC89C52RC兼容51單片機,價格便宜,抗干擾強;與其它51單片機相比它最大的特點是具有ISP下載功能,通過一片MAX232就可以很方便的實現程序的下載。電源+5V電源+5V單片機STC89C52RCLCD1602PC機通訊MAX232軟件程序C語言編寫數據傳輸原理圖其數據傳輸過程如下:MAX232的11腳T1in接單片機TXD端P3.1,TTL電平從單片機的TXD端發出,經過MAX232轉換為RS-232電平后從MAX232的14腳TIout發出,再連接到實驗板上串口座的3腳,再經過交叉串口線后,連接至PC機的串口座的第2腳,至此計算機接收到數據;PC機發送數據時從PC機串口座第3腳TXD發出數據,再逆向流向單片機的RXD端P3.0接收數據。2液晶顯示模塊本文使用的1602液晶為+5V電壓驅動,帶背光,背光亮度和顯示對比度可調,是一種功能較簡單、價格較便宜的液晶顯示器件。它由液晶顯示屏和驅動器兩部分組成,單片機聽你哥哥寫控制字的方式訪問驅動器來實現對顯示屏的控制,并有并行接口,無串行接口;采用液晶顯示界面清晰,操作方便,具有兩行顯示,每行16個字符,內置128個字符的ASCII字符集字庫,第一行顯示實時時鐘,第二行顯示鬧鐘,還具有鬧鐘功能和液晶亮度調節功能,并且可以對其方便的進行程序控制,完全能滿足設計的要求。(1)1602接口信號如下圖所示:字符型LCD通常有14條引腳線或16條引腳線的LCD,多出來的2條線是背光電源線VCC(15腳)和地線GND(16腳),其控制原理與14腳的LCD完全一樣。(2)1602的基本操作時序:讀狀態
輸入:RS=L,RW=H,E=H
輸出:DB0~DB7=狀態字
寫指令
輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼
輸出:無
讀數據
輸入:RS=H,RW=H,E=H
輸出:DB0~DB7=數據
寫數據
輸入:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數據
輸出:無(3)1602的地址映射圖l602的核心芯片是HD44780。HD44780內置了DDRAM、CGROM和CGRAM。DDRAM就是顯示數據RAM,用來寄存待顯示的字符代碼。共80個字節,其地址和屏幕的對應關系如下表:(4)指令說明初始化設置指令碼如表所示:初始化指令碼與功能對照表指令碼00111000設置顯示模式為16X200001DCBD:顯示開/關(1/0)
C:光標顯示/不顯示(1/0)
B:光標閃爍/不閃爍(1/0)數據控制液晶控制器內部設有數據地址指針,用戶通過它訪問80B的顯示RAM,關系如表所示:數據指針設置指令碼功能80H+地址碼(0~27,40~67H)設置數據地址指針初始化過程a延時15msb寫指令38H;設置顯示模式c延時5msd寫指令38H;設置顯示模式e延時5msf寫指令38H;設置顯示模式g寫指令06H;顯示光標移動設置h寫指令0CH;顯示開及光標設置i寫指令01H;顯示清屏j寫指令80H;定位數據指針到80H數據RAM讀寫a讀顯示RAM首先,寫指令碼(指令碼為目標RAM地址)。然后,從D0~D7口獲得數據。b寫顯示RAM首先,寫指令碼(指令碼為目標RAM地址)。然后,寫數據到D0-D7。例如讓LCD的第一行第二個位置(RAM地址0x81)顯示字符“1”(ASCII0x31)的實現過程如下:E=高脈沖,RS=L,RW=L,D0~D7=0x81E=高脈沖,RS=L,RW=L,D0~D7=0x311602與CPU連接圖如下圖所示:1602與CPU連接圖3實時時鐘芯片DS12887DS12887是DALLAS半導體公司新推出的實時時鐘芯片RTC(RealTimeClock),可直接取代DS1287,它功能豐富,應用廣泛。DS12887內部自帶晶體振蕩器及鋰電池,可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補償,斷電后能運行10年之久不丟失數據。可選用夏令時,具有24小時或12小時兩種制式。它在工業控制及智能儀器儀表中有廣泛用途,如PC機內的時鐘信號就是由DS12887提供的。DS12887的結構框圖(見圖1)DS12887的特點◆可作為個人計算機的時鐘和日歷;◆與MCl46818B和DS1287的管腳兼容◆在沒有外部電源的情況下可工作10年◆自帶晶體振蕩器及鋰電池◆可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補償◆有二進制碼或BCD碼代表日歷和鬧鐘信息◆有12和24小時兩種制式,12小時制時有AM和PM提示◆可選用夏令時模式◆可以應用于MOTOROLA和INTEL兩種總線◆數據/地址總線復用◆內建128字節RAM ◆14字節時鐘控制寄存器◆114字節通用RAM◆可編程方波輸出◆總線兼容中斷(/IRQ)◆三種可編程中斷◆時間性中斷,可產生每秒一次直到每天一次中斷◆周期性中斷122mS到500mS◆時鐘更新結束中斷DS12887的引腳排列(見圖2)DS12887的引腳功能介紹:GND、VCC:直流電源,其中VCC接+5V輸入,GND接地,當VCC輸入為+5V時,用戶可以訪問DS12C887內RAM中的數據,并可對其進行讀、寫操作;當VCC的輸入小于RAM進行讀、寫操作,此時用戶不能正確獲取芯片內的時間信+4.25V時,禁止用戶對內部息;當VCC的輸入小于+3V時,DS12C887會自動將電源發換到內部自帶的鋰電池上,以保證內部的電路能夠正常工作。MOT:模式選擇腳,DA12C887有兩種工作模式,即Motorola模式和Intel模式,當MOT接VCC時,選用的工作模式是Motorola模式,當MOT接GND時,選用的是Intel模式。本文主要討論Intel模式。SQW:方波輸出腳,當供電電壓VCC大于4.25V時,SQW腳可進行方波輸出,此時用戶可以通過對控制寄存器編程來得到13種方波信號的輸出。AD0~AD7:復用地址數據總線,該總線采用時分復用技術,在總線周期的前半部分,出現在AD0~AD7上的是地址信息,可用以選通DS12C887內的RAM,總線周期的后半部分出現在AD0~AD7上的數據信息。AS:地址選通輸入腳,在進行讀寫操作時,AS的上升沿將AD0~AD7上出現的地址信息鎖存到DS12C887上,而下一個下降沿清除AD0~AD7上的地址信息,不論是否有效,DS12C887都將執行該操作。DS/RD:數據選擇或讀輸入腳,該引腳有兩種工作模式,當MOT接VCC時,選用Motorola工作模式,在這種工作模式中,每個總線周期的后一部分的DS為高電平,被稱為數據選通。在讀操作中,DS的上升沿使DS12C887將內部數據送往總線AD0~AD7上,以供外部讀取。在寫操作中,DS的下降沿將使總線AD0~AD7上的數據鎖存在DS12C887中;當MOT接GND時,選用Intel工作模式,在該模式中,該引腳是讀允許輸入腳,即ReadEnable。R/W:讀/寫輸入端,該管腳也有2種工作模式,當MOT接VCC時,R/W工作在Motorola模式。此時,該引腳的作用是區分進行的是讀操作還是寫操作,當R/W為高電平時為讀操作,R/W為低電平時為寫操作;當MOT接GND時,該腳工作在Intle模式,此時該作為寫允許輸入,即WriteEnable。CS:片選輸入,低電平有效。IRQ:中斷請求輸入,低電平有效,該腳有效對DS12C887內的時鐘、日歷和RAM中的內容沒有任何影響,僅對內部的控制寄存器有影響,在典型的應用中,RESET可以直接接VCC,這樣可以保證DS12C887在掉電時,其內部控制寄存器不受影響。在DS12C887內有11字節RAM用來存儲時間信息,4字節用來存儲控制信息,其具體地址及取值如表1所列。由表1可以看出:DS12C887內部有控制寄存器的A-B等4個控制寄存器,用戶都可以在任何時候對其進行訪問以對DS12C887進行控制操作。DS12887上電時,當Vcc高于4.25V200mS后,芯片可以被外部程序操作。當Vcc低于4.25V時,芯片處于寫保護狀態(所有的輸入均無效),同時所有輸出呈高阻狀態。當Vcc低于3V時,芯片將自動把供電方式切換為由內部電池供電。DS12887有128個RAM單元。其中4個單元用作控制寄存器,10個單元用作存放時鐘字節,114字節為通用RAM。其主要寄存器如下:DS12887內部寄存器A:UIPDV2DV1DV0RS3RS2RS1RS0UIP=l:更新已到,不能讀/寫DSl2887;UIP=0:更新末到,能讀/寫DS12887。DV2,DV1,DV0應設置為010,表示打開晶振,允許計時。RS3,RS2,RS1,RS0為方波頻率選擇位,產生方波周期中斷。DS12887內部寄存器B:SETPIEAIEUIESQWEDM24/12DSESET=0:時間更新正常進行,每秒計數1次;SET=1:禁止更新,程序可初始化時間和日歷。PIE=l:允許周期中斷;PIE=0:禁止周期中斷。AIE=1:允許報警中斷;AIE=0:禁止報警中斷。UIE=1:允許更新結束中斷;UIE=0:禁止更新結束中斷。SQWE為方波允許位。SQWE=1:將RS3,RS2,RS1,RS0選定的方波輸出。DM=1:BCD碼;DM=0:二進制。該位不受復位信號影響24/12:1表示24[小]時制;0表示12[小]時制。DSE為夏時制允許位。DSE=l:采用夏時制;DSE=0:不采用夏時制。DS12887內部寄存器C:IRQFPFAFUF0000IRQF為中斷申請標志。PF為方波周期中斷標志。PF=1:方波周期結束,申請中斷。AF為鬧鈴中斷標志。AF=1:當前時間與鬧鈴時間匹配時即刻申請中斷。UF為更新周期結束中斷標志。UF二I:更新周期結束時申請中斷。DS12887內部寄存器D:VRT0000000VRT為內部鋰電池狀態。VRT=1:鋰電池正常;VRT=0:鋰電池耗盡。DS12887內部存儲器功能如附表所示:地址功能取值范圍(十進制數)取值范圍(二進制數)取值范圍(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世紀0~99NA19,20附表時序圖時序分析及軟件功能的實現DS12CR887有兩種接口總線時序工作方式,此系統中DSl2CR887工作在Intel總線時序方式,其寫命令時序如圖3所示,讀命令時序如圖4所示。從DS12CR887的時序圖可以看出,在一次讀或寫操作中,地址/數據復用總線上先出現地址,后出現數據。寫操作時,當片選信號CS有效時,地址鎖存信號AS的下降沿將AD0~AD7上的數據鎖存作為地址(AS高電平的寬度PWASH不小于45ns時,鎖存地址有效);隨后讀寫信號R/W為低電平(低電平寬度PWEH不小于90ns),在R/W的上升沿將AD0~AD7上的數據寫入DSl2CR887,在R/W的上升沿要求AD0~AD7的數據穩定時間不為小于70ns(即tdsw>70ns),通過上述時序,才完成一次寫操作。讀操作同樣首先將數據線(AD0~AD7)上的信號鎖存為DS12CR887需要的地址,然后DS12CR887才能在AD0~AD7上輸出有效數據。DS12C887與單片機連接電路圖如下圖所示:1602的外形尺寸:4鍵盤輸入按鍵調整是在輸入模塊,采用按鍵單個電平控制,工友4個按鍵。采用液晶顯示,分別調整實時時鐘的時、分和鬧鐘時、分,可實現時間調整,鬧鐘設置的功能。之間在其時鐘運轉的同時,在其上進行時間調節。P2.0P2.0P2.1P2.2P2.3GNDS1S2S3S4按鍵掃描電路圖5鬧鐘報警鬧鐘報警電路,采用的時有液晶顯示屏第二行所顯示鬧鐘的設定時間為基準,有DS12C887時鐘芯片來控制,判斷液晶顯示屏第一行所顯示實時時鐘是否與液晶屏第二行所顯示鬧鐘的設定時間一致,如果相同則蜂鳴器鳴響,如不同則繼續判斷。P3.2P3.2R=1KGNDBEEPVCC+5VQ1(PNP)鬧鐘報警電路圖如上所示。四程序設計1主程序流程圖開始開始結束初始化DS12C887LCD顯示時間和鬧鐘程序DS12C887開始振蕩判斷是否有按鍵按下判斷鬧鐘是否到時調整時間和鬧鐘蜂鳴器鬧鐘響YYNN主程序流程圖主程序因為使用了時鐘芯片DS12C887,程序只需要從DS12C887各個寄存器中讀出年、月、日、時、分、秒等數據,子啊處理即可。在首次對DS12C887進行操作前,必須對它初始化,然后從DS12C887中讀出數據,再經過處理后,送給顯示緩沖單元。控制按鍵有效,進入年調整程序等待按鍵程序控制按鍵有效,進入年調整程序等待按鍵程序+或-鍵有效年+或-1控制鍵有效,跳出時間調整程序進入主循環程序控制按鍵有效,進入月調整程序等待按鍵程序+或-鍵有效月+或-1控制按鍵有效,進入日調整程序等待按鍵程序+或-鍵有效日+或-1控制按鍵有效,進入星期調整程序等待按鍵程序+或-鍵有效星期+或-1控制按鍵有效,進入小時調整程序等待按鍵程序+或-鍵有效小時+或-1控制按鍵有效,進入分鐘調整程序等待按鍵程序+或-鍵有效分+或-12時間調整流程圖3C語言程序設計##include<reg52.h>#include"define.h"voiddelay(uintz)//延時zms函數{ uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}voiddi()//蜂鳴器報警聲音{beep=0;delay(100);beep=1;}//=======================================voidwrite_com(ucharcom)//寫液晶命令函數{ rs=0; P0=com; delay(1); lcden=1; delay(3); lcden=0; delay(1);}voidwrite_date(uchardate)//寫液晶數據函數{ rs=1; P0=date; delay(1); lcden=1; delay(3); lcden=0; delay(1);}//======================================================voidinit()//初始化函數{ ucharnum; EA=1;//打開總中斷 EX1=1;//打開外部中斷1 IT1=1;//設置負跳變沿觸發中斷 flag1=0;//變量初始化 flag=0; s1num=0; lcden=0; dsas=0;/*************************以下幾行在首次設置DS12C887時使用,** write_ds(0x0B,0xa6);//set=1,設置24h,數據二進制,鬧鐘中斷 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液晶刷新時分秒函數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);}//****液晶年月日函數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液晶刷新星期函數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();//消除報警標志 flag_ri=0; } } }//*****************檢測s1_menu if(s1==0)//檢測s1_menu { delay(5); if(s1==0) { while(!s1); di(); flag=1; s1num++;//記錄按下次數 if(flag1==1){if(s1num==4)s1num=1;}//鬧鈴調整 switch(s1num)//光標閃爍點定位 { 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)//只有當s1按下后,才檢測s2和s3 { if(s2==0)//檢測s2 { delay(5); if(s2==0) { di(); while(!s2); switch(s1num)//根據功能鍵次數調節相應數值 { 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)//根據功能鍵次數調節相應數值 { 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)//退出鬧鐘設置時保存數值 { write_com(0x80+0x40); write_date(''); write_date(''); } else//進入鬧鐘設置 { read_alarm();//讀取原始數據 write_com(0x80+0x40);write_date('R');//顯示標志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函數{ 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函數 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數據// 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(){//首次上電初始化時間函數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()//主函數{ delay(100); init();//調用初始化函數 while(1){ if(flag_ri==1)//當鬧鐘中斷時進入這里 { di(); delay(100); di(); delay(500);} keyscan();//按鍵掃描 if(flag==0&&flag1==0)//正常工作時進入這里{ keyscan();//按鍵掃描//**************讀取12C887數據 miao=read_ds(0); fen=read_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 配件采購合同范本 簡單
- JavaBean的意義與特點
- 委托礦山開采合同范本
- 賓館水電維修合同范本
- 布料買賣合同范本
- 中學教學管理規章制度
- 中學優生培養路徑解讀
- 景區合資運營合同范本
- 2025貨物租賃合同范文
- 2025年房屋租賃居間合同
- 干混砂漿購銷規定合同6篇
- 2025-2030中國金屬化陶瓷基板行業市場發展趨勢與前景展望戰略研究報告
- 2025年中國民營精神病醫院行業市場前景預測及投資價值評估分析報告
- Unit4StageandScreen詞匯課件12023學年高中英語
- 六年級總復習常見的量市公開課一等獎省賽課獲獎課件
- 餐飲商戶安全培訓
- 遠離背后“蛐蛐”-摒棄“蛐蛐”擁抱友善主題班會-2024-2025學年初中主題班會課件
- 視覺傳達考試試題及答案
- 2025-2030中國再生鋁行業需求潛力分析與發展行情走勢預判研究報告
- 《版式設計》課件-第三章 流動資產
- 《copd疾病知識》課件
評論
0/150
提交評論