




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、電子時(shí)鐘S 2011-05-09 HONKITTVS H10:30:07« Qi in 口W UJW > OlCMCO b ID9Z> > >(TO:山 DQQQQQQQ萬(wàn)年歷設(shè)計(jì)報(bào)告學(xué)院:班級(jí):組員:、設(shè)計(jì)要求與方案論證 31.1 設(shè)計(jì)要求:31.1.1 根本要求31.1.2 發(fā)揮局部31.2 系統(tǒng)根本方案選擇和論證 31.2.1 單片機(jī)芯片的選擇方案和論證:1.2.2 顯示模塊選擇方案和論證:41.2.3 時(shí)鐘芯片的選擇方案和論證:41.3 電路設(shè)計(jì)最終方案決定4二、理論分析與計(jì)算42.1 ,秒數(shù)的產(chǎn)生由定時(shí)器T0 產(chǎn)生: 4三 . 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)5
2、3.1 電路設(shè)計(jì)框圖:53.2 系統(tǒng)硬件概述:63.3 主要單元電路的設(shè)計(jì)63.3.1 單片機(jī)主控制模塊的設(shè)計(jì)63.3.2 顯示模塊的設(shè)計(jì)73.3.3 鬧鐘模塊的設(shè)計(jì)93.3.4 電源穩(wěn)壓模塊10四、系統(tǒng)的軟件設(shè)計(jì)104.1 程序流程框圖114.2 鬧鐘模塊流程圖:114.3 按鍵調(diào)整模塊流程圖:12五、測(cè)試方案與測(cè)試結(jié)果分析135.1 測(cè)試儀器1.35.2 軟件測(cè)試平臺(tái)Keil C51135.3 模塊測(cè)試135.3.1 顯示模塊測(cè)試135.4 測(cè)試結(jié)果分析與結(jié)論145.4.1 測(cè)試結(jié)果分析145.4.2 測(cè)試結(jié)論1.4六、作品總結(jié)14參考文獻(xiàn)14附錄一:系統(tǒng)電路圖15附錄三:系統(tǒng)C 程序 1
3、6、設(shè)計(jì)要求與方案論證1.1 設(shè)計(jì)要求:1.1.1 根本要求 1 準(zhǔn)確顯示:時(shí)、分、秒24 小時(shí)制 2顯示星期 3顯示公歷 4時(shí)間、日期、星期可調(diào)節(jié) 5斷電記憶功能1.1.2 發(fā)揮局部 1 鬧鐘功能 2顯示陰歷 3顯示24 節(jié)氣 4其他1.2 系統(tǒng)根本方案選擇和論證1.2.1 單片機(jī)芯片的選擇方案和論證:、 >:方案一 :采用89C51芯片作為硬件核心,采用 Flash ROM,內(nèi)部具有4KB ROM 存儲(chǔ)空間,能于3V的超低壓工作,而且與MCS-51 系列單片機(jī)完全兼容,但是運(yùn)用于電路設(shè)計(jì)中時(shí)由于不具備ISP在線編程技術(shù), 當(dāng)在對(duì)電路進(jìn)展調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰?/p>
4、燒入程序時(shí),對(duì)芯片的屢次拔插會(huì)對(duì)芯片造成一定的損壞。方案二 :采用AT89S52片內(nèi)ROM全都采用Flash ROM ;能以3V的超底壓工作;同時(shí)也與 MCS-51系列單片機(jī)完全該芯片內(nèi)部存儲(chǔ)器為8KB ROM 存儲(chǔ)空間,同樣具有89C51 的功能,且具有在線編程可擦除技術(shù),當(dāng)在對(duì)電路進(jìn)展調(diào)試時(shí),由于程序的錯(cuò)誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r(shí),不需要對(duì)芯片屢次拔插,所以不會(huì)對(duì)芯片造成損壞。所以選擇采用AT89S52 作為主控制系統(tǒng).1.2.2 顯示模塊選擇方案和論證:、4 ):方案一:采用點(diǎn)陣式數(shù)碼管顯示,點(diǎn)陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對(duì)于顯示文字比擬適合,如采用在顯示數(shù)字顯得
5、太浪費(fèi),且價(jià)格也相對(duì)較高,所以不用此種作為顯示.、 . 1->_» .方案二:采用 LED 數(shù)碼管動(dòng)態(tài)掃描,LED 數(shù)碼管價(jià)格適中,對(duì)于顯示數(shù)字最適宜,但無(wú)法顯示圖形文字,在顯示星期是也只能用數(shù)字表示,而且采用動(dòng)態(tài)掃描法與單片機(jī)連接時(shí),在編程時(shí)比擬復(fù)雜。所以也不采用了LED 數(shù)碼管作為顯示。方案三:采用 LCD 液晶顯示屏,液晶顯示屏的顯示功能強(qiáng)大,可顯示文字,圖形,顯示多樣,清晰可見,所以在此設(shè)計(jì)中采用LCD 液晶顯示屏.1.2.3 時(shí)鐘芯片的選擇方案和論證:方案一:采用DS1302時(shí)鐘芯片實(shí)現(xiàn)時(shí)鐘,DS1302芯片是一種高性能的時(shí)鐘芯片,可自動(dòng)對(duì)秒、分、時(shí)、日、周、月、年以
6、及閏年補(bǔ)償?shù)哪赀M(jìn)展計(jì)數(shù),而且精度高,位的RAM 做為數(shù)據(jù)暫存區(qū),工作電壓2.5V5.5VX圍內(nèi),2.5V時(shí)耗電小于300nA.但在,題目中明確規(guī)定不能選用不 可以使用任何專用的時(shí)鐘芯片和模塊,因此不采用此方案。、 . 1_4_» .方案二:直接采用單片機(jī)定時(shí)計(jì)數(shù)器提供秒信號(hào),使用程序?qū)崿F(xiàn)年、月、日、星期、時(shí)、分、秒計(jì)數(shù)。采用此種方案可以減少芯片的使用,也可以節(jié)約本錢。所以采用此方案。1.3 電路設(shè)計(jì)最終方案決定綜上各方案所述,對(duì)此次作品的方案選定: 采用 AT89S52 作為主控制系統(tǒng);采用單片機(jī)定時(shí)器提供時(shí)鐘; 液晶顯示屏作為顯示。二、理論分析與計(jì)算2.1, 秒數(shù)的產(chǎn)生由定時(shí)器T0
7、產(chǎn)生:T0 置 10ms 定時(shí)初值 dc00H(2A16=65536D,dc00H=56320D)定時(shí)時(shí)間=(65536-56320)*(1/11.0592)*12=10ms (單片機(jī)晶振f0=11.0592Mhz)用累加的方法讓定時(shí)時(shí)間累加一百次即可產(chǎn)生一秒時(shí)間:100*10ms=1000ms=1s2.2, 總天數(shù)的算法:首先用 if 語(yǔ)句判斷定義年到輸入年之間每一年是否為閏年,是閏年,該年的總天數(shù)為366,否那么,為355。然后判斷輸入的年是否為定義年,假設(shè)是,令總天數(shù)S=1,否那么,用累加法計(jì)算出定義年到輸入年之間的總天數(shù),再把輸入年的一月到要輸出的月份之間的天數(shù)累加起來(lái),假設(shè)該月是閏年
8、中的月份并且該月還大于二月,再使總天數(shù)加 1, 否那么, 不加, 既算出從定義年一月一日到輸出年的該月一日的總天數(shù)。2.3 輸使總天數(shù)除以7 取余加 2 得幾既為星期幾,假設(shè)是 7,那么為星期日。2.4. 算出輸出月份的完整日歷算法:算出輸出月份第一天為星期幾后,把該日期以前的位置用空格補(bǔ)上,并總該日起一次輸出天數(shù)直到月底,該月中的天數(shù)加上該月一日為星期幾的數(shù)字再除以7 得 0 換行,即可完整的輸出該月的日歷。5,計(jì)算某一天是星期幾的算法:蔡勒 Zeller公式 歷史上的某一天是星期幾?未來(lái)的某一天是星期幾?關(guān)于這個(gè)問(wèn)題,有很多計(jì)算公式兩個(gè)通用計(jì)算公式和一些分段計(jì)算公式,其中最著名的是蔡勒 Z
9、eller公式。 即:w=y+y/4+c/4-2c+26(m+1)/10+d-1公式中的符號(hào)含義如下,w:星期;c:世紀(jì)-1; y:年兩位數(shù);m:月m大于等于5,小于等于14,即在蔡勒公式中,某年的1、 2 月要看作上一年的13、 14 月來(lái)計(jì)算,比方 2003年1月1日要看作2002年的13月1日來(lái)計(jì)算;d:日;口代表取整,即只要整數(shù)局部。(C是世紀(jì)數(shù)減一,y 是年份后兩位,M 是月份,d 是日數(shù)。1 月和 2 月要按上一年的13 月和 14月來(lái)算,這時(shí)C 和 y 均按上一年取值。)算出來(lái)的W 除以7,余數(shù)是幾就是星期幾。如果余數(shù)是0,那么為星期日。以 2049年10月1日100周年國(guó)慶為例
10、,用蔡勒Z(yǔ)eller公式進(jìn)展計(jì)算,過(guò)程如下:蔡勒Z(yǔ)eller公式:w=y+y/4+c/4-2c+26(m+1)/10+d-1 =49+49/4+20/4- 2 X 20+26 X (10+1)/10+-1=49+12.25+5-40+28.6=49+12+5-40+28=54 (除以7余 5)即 2049年 10月 1 日 100周年國(guó)慶是星期5。三 .系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)3.1 電路設(shè)計(jì)框圖:液晶顯示模塊AT89S52主控制模塊鍵盤模塊鬧鐘模塊3.2 系統(tǒng)硬件概述:本電路是由AT89S52單片機(jī)為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作; 顯示部份LCD1602實(shí)現(xiàn),能夠同時(shí)顯
11、示 16x02即32個(gè)字符;鬧鐘局部由蜂鳴器構(gòu)成,蜂鳴 器是一種一體化構(gòu)造的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。3.3 主要單元電路的設(shè)計(jì)3.3.1 單片機(jī)主控制模塊的設(shè)計(jì)AT89S52單片機(jī)為40引腳雙列直插芯片,有四個(gè)I/O 口 P0,P1,P2,P3, MCS-51單片機(jī)共有4個(gè)8位白I/O 口P0、P1、P2、P3,每一條I/O線都能獨(dú)立地作輸出或輸入。單片機(jī)的最小系統(tǒng)如下列圖所示,18弓I腳和19引腳接時(shí)鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL
12、2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40弓|腳為電源端.如圖-1所示VKZC:XDpl圖-1主控制系統(tǒng)3.3.2 顯示模塊的設(shè)計(jì)LCD1602液晶顯示屏工業(yè)字符型液晶,能夠同時(shí)顯示16x02即32個(gè)字符。16列2行,有16個(gè)引腳,通過(guò) D0D7的8位數(shù)據(jù)端傳輸數(shù)據(jù)和指令,引腳圖如圖6-5。圖6-5 LCD1602引腳示意圖LCD1602液晶顯示屏引腳功能如表6-5所示:表6-5LCD1602引腳功能管腳1Vss一般接地管腳2Vdd接電源+5V管腳3V。液晶顯示器比照度調(diào)整端,接正電源時(shí)比
13、照度最弱,接地電源時(shí)比 照度最高管腳4RSRS為存放器選擇,高電平 1時(shí)選擇數(shù)據(jù)存放器、低電平 0時(shí)選擇 指令存放器管腳5R/WR/W 為讀寫信號(hào)線,高電平(1)時(shí)進(jìn)展讀操作,低電平(0)時(shí)進(jìn)展寫 操作。管腳6EE(或EN)端為使能(enable抽,下降沿使能。管腳7DBo底4位二態(tài)、 雙向數(shù)據(jù)總線 0位管腳8DB1底4位二態(tài)、 雙向數(shù)據(jù)總線 1位管腳9DB2底4位二態(tài)、雙向數(shù)據(jù)總線 2位管腳10DB3底4位二態(tài)、雙向數(shù)據(jù)總線 3位管腳11DB4Wj 4 位二態(tài)、雙向數(shù)據(jù)總線 4位管腳12DB5Wj 4 位二態(tài)、雙向數(shù)據(jù)總線 5位管腳13DB6Wj 4 位二態(tài)、雙向數(shù)據(jù)總線 6位管腳14DB7
14、Wj 4 位二態(tài)、雙向數(shù)據(jù)總線 7位管腳15BLA背光電源正極管腳16BLK背光電源負(fù)極1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表10-14所示:卜令RSR/WD7D6D5D4D3D2D1D01青顯示00000000012卜標(biāo)返回000000001*3卜輸入江00000001I/DS4顯示開/關(guān)控制0000001DCB5卜標(biāo)或字符移位000001S/CR/L*6卜功能00001DLNF*7卜字符發(fā)生存貯器地0001字符發(fā)生存貯器地址8收據(jù)存貯器地址001顯示數(shù)據(jù)存貯器地址9"忙標(biāo)志或地址01BF計(jì)數(shù)器地址10寫數(shù)到CGRAM或DDRAM10要寫的數(shù)據(jù)內(nèi)容11從 CGRAM
15、或 DDRAM讀數(shù)11讀出的數(shù)據(jù)內(nèi)容表10-14:控制命令表1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過(guò)指令編程來(lái)實(shí)現(xiàn)的。說(shuō)明:1為高電平、0為低電平 指令1:清顯示,指令碼 01H,光標(biāo)復(fù)位到地址 00H位置。指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。指令3:光標(biāo)和顯示模式設(shè)置 I/D :光標(biāo)移動(dòng)方向,高電平右移,低電平左移 S屏幕上所有 文字是否左移或者右移。高電平表示有效,低電平那么無(wú)效。指令4:顯示開關(guān)控制。D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無(wú)光標(biāo)B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。指令5:光
16、標(biāo)或顯示移位 S/C:高電平時(shí)移動(dòng)顯示的文字,低電平時(shí)移動(dòng)光標(biāo)。指令6:功能設(shè)置命令 DL:高電平時(shí)為4位總線,低電平時(shí)為 8位總線N:低電平時(shí)為單 行顯示,高電平時(shí)雙行顯示 F:低電平日顯示5x7的點(diǎn)陣字符,高電平時(shí)顯示5x10的點(diǎn)陣字 符。指令7:字符發(fā)生器RAM地址設(shè)置。指令8: DDRAM地址設(shè)置。指令9:讀忙信號(hào)和光標(biāo)地址BF:為忙標(biāo)志位,高電平表示忙,此時(shí)模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。指令10:寫數(shù)據(jù)。指令11:讀數(shù)據(jù)。將led的引腳與單片機(jī)連接,通過(guò)單片機(jī)實(shí)現(xiàn)對(duì)顯示的輸出,電路圖實(shí)現(xiàn)如下: '''''-.- r'-
17、'''| 2房山3.3.3 鬧鐘模塊的設(shè)計(jì) 鬧鐘模塊采用蜂鳴器實(shí)現(xiàn),蜂鳴器是一種一體化構(gòu)造的電子訊響器,采用直流電壓供電。 通過(guò)單片機(jī)的p3.7引腳輸出的電平變化來(lái)控制蜂鳴器的導(dǎo)通與否,設(shè)計(jì)如下:3.3.4電源穩(wěn)壓模塊方案一:LM7805穩(wěn)壓Figure 17:Fixed Output RegulatorL7BW四、系統(tǒng)的軟件設(shè)計(jì)初始化LCD、時(shí)間日期處理程序4.2鬧鐘模塊流程圖:五、測(cè)試方案與測(cè)試結(jié)果分析5.1 測(cè)試儀器序號(hào)名稱作用1KELL 51 軟件編寫調(diào)試C程序并生成可燒錄 hex文件2仿真軟件Proteus對(duì)電路進(jìn)展焊接前的仿真與測(cè)試3變壓器提供5伏輸出電源4
18、數(shù)子力用表測(cè)試工作電源檢測(cè)電路運(yùn)行狀況5.2 軟件測(cè)試平臺(tái)Keil C51Keil C51是美國(guó)Keil Sofware公司出品的51系列兼容單片機(jī) C語(yǔ)言軟件開發(fā)系統(tǒng),與匯編 相比,C語(yǔ)言在功能上、構(gòu)造性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用。用過(guò) 匯編語(yǔ)言后再使用 C來(lái)開發(fā),體會(huì)更加深刻。Keil C51軟件提供豐富的庫(kù)函數(shù)和功能強(qiáng)大的 集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到 Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語(yǔ)句生成的匯編代碼很緊湊, 容易理解。在開發(fā)大型軟件時(shí)更能表達(dá)高級(jí)語(yǔ)言的優(yōu)勢(shì)。下面詳細(xì)介紹Keil
19、C51開發(fā)系統(tǒng)各局部功能和使用。Keil C51工具包的整體構(gòu)造,其中uVision與Ishell分別是 C51 for Windows和for Dos的集成開發(fā)環(huán)境(IDE),可以完成編輯、編譯、連接、調(diào)試、仿真等整個(gè)開發(fā)流程。5.3 模塊測(cè)試5.3.1顯示模塊測(cè)試出現(xiàn)的問(wèn)題:LCD1602液晶顯示屏背景燈亮但不顯示內(nèi)容。解決問(wèn)題:初步假設(shè)電源已經(jīng)供電但單片機(jī)沒(méi)有工作。用萬(wàn)用表測(cè)試LCD使能端6引腳和寫命令選擇端 4弓|腳,均有電位變化,推出單片機(jī)已經(jīng)工作。再次假設(shè),LCD1602的顯示屏比照度沒(méi)調(diào)好。讓電路工作,慢慢旋轉(zhuǎn)變阻器,但仍無(wú)內(nèi)容顯示。三次假設(shè),LCD1602某些引腳短路,經(jīng)檢測(cè)各
20、引腳電平,發(fā)現(xiàn)6腳線路某地方與電源 VCC相連,導(dǎo)致數(shù)據(jù)命令無(wú)法寫入 LCD1602顯示器,導(dǎo)致內(nèi)容無(wú)法顯示,改正后,顯示正常,問(wèn)題解決。VCC1602MOXx01)/");5.4 測(cè)試結(jié)果分析與結(jié)論5.4.1 測(cè)試結(jié)果分析在測(cè)試過(guò)程中遇到lcd1602顯示不出來(lái),首先使用萬(wàn)用表對(duì)電路進(jìn)展測(cè)試,檢查 工作電壓是否正常并查找出電路沒(méi)正常工作的局部,再次檢查各引腳接線情況。5.4.2 測(cè)試結(jié)論經(jīng)過(guò)屢次的反復(fù)測(cè)試與分析,可以對(duì)電路的原理及功能更加熟悉,同時(shí)提高了設(shè)計(jì)能力與及對(duì)電路的分析能力.同時(shí)在軟件的編程方面得到更到的提高,對(duì)編程能力得到加強(qiáng).同時(shí)對(duì)所學(xué)的知識(shí)得到很大的提高與穩(wěn)固.六、作
21、品總結(jié)在整個(gè)設(shè)計(jì)過(guò)程中,發(fā)揮團(tuán)隊(duì)精神,分工合作,我吳余壯健負(fù)責(zé)電路設(shè)計(jì),軟件編程,設(shè)計(jì)報(bào)告的編寫,李培文負(fù)責(zé)網(wǎng)上查閱相關(guān)有用資料,王文龍負(fù)責(zé)電路的焊接,充分發(fā)揮人的主觀能動(dòng)性,自主學(xué)習(xí),學(xué)到了許多沒(méi)學(xué)到的知識(shí)。較好的完成了作品。到達(dá)了預(yù)期的目的,在最初的設(shè)計(jì)中,發(fā)揮“三個(gè)臭皮匠,頂個(gè)諸葛亮的作用。相互學(xué)習(xí)、相互討論、研究。完了最初的設(shè)想。在此次設(shè)計(jì)中,知道了做凡事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我們的耐心,做什么事都在有耐心。此次比賽中學(xué)到了很多很多東西,這是最重要的。總之,參加電子競(jìng)賽我們的能力得到了全方位的提高。參考文獻(xiàn)新概念 51 單片機(jī) C 語(yǔ)言教程郭天祥編電子工
22、業(yè)2009單片機(jī) C 語(yǔ)言應(yīng)用一百例王東鋒 王會(huì)良 董冠強(qiáng)編電子工業(yè)2009楊子文 編 單片機(jī)原理及應(yīng)用XX 電子科技大學(xué)2006附錄一:系統(tǒng)電路圖P.HPiUAlFEVAllF24J AJ 2P2,M陷抗小tH g QUT 0L-BiBJT Eh3 VlM附錄二:仿真效果圖FU 國(guó) AD I Ml IMrl 刖汕可 Ft WM】 RO M3I M3皿 MW3pj ifn Pt JiTQUCD1Mri&t-TI.-'IT:" !'. D'SET土R廣 PS R61 IT RETIRE ,J辿農(nóng)曰 “刑:rn XI_ GECIT1R11 iM-U1
23、9;'.,21 id漸TM IM&>| 修m;下。3FCJitfUJ,>如FM距:LST電W&TMJ, rarfiMuMLF陽(yáng)江31小rar &必* PiTtlS時(shí),IP3褸.雨4時(shí).XTHi2PJ.MCW,PJjrfTT“,rip(n<r二p,F(xiàn)ihi時(shí)新-Hl TT- TT u.-TEWr-.s 弱 ilnw? non<JTTYB 41日塔班露C 程序#include<reg52.h>#include<intrins.h>unsigned char code dis_week="SUN,MON,TUE
24、,WED,THU,FRI,SAT"unsigned char code para_month13=0,0,3,3,6,1,4,6,2,5,0,3,5/; 星期月參變數(shù)unsigned char data dis_buf116;/lcd 上排顯示緩沖區(qū)unsigned char data dis_buf216;/lcd 下排顯示緩沖區(qū)unsigned char data year,month,date,week/> 月、日、星期unsigned char data armhour,armmin,armsec鬧鐘時(shí)、 分、 秒unsigned char data hour,min,
25、sec,sec100;力、分、秒、百分之一秒unsigned char data flag,vkey,skey設(shè)置狀態(tài)計(jì)數(shù)標(biāo)志、按鍵先前值、按鍵當(dāng)前值bit alarm; / 標(biāo)識(shí)是否啟用鬧鐘,1-啟用,0-關(guān)閉sbit rs = P2A0;/LCD 數(shù)據(jù)/命令選擇端(H/L)sbit rw = P2A1;/LCD 讀/寫選擇端(H/L)sbit ep = P2A2;/LCD 使能控制sbit PRE = P1A6;/ 調(diào)整鍵(k3)sbit SET = P1A7;/ 調(diào)整鍵(k4)sbit SPK = P3A7;void delayms(unsigned char ms); 延時(shí)程序/bit
26、 lcd_busy(); / 測(cè)試 LCD 忙碌狀態(tài)程序void lcd_wcmd(char cmd); / 寫入指令到LCD 程序void lcd_wdat(char dat); / 寫入數(shù)據(jù)到LCD 程序void lcd_pos(char pos); /LCD 數(shù)據(jù)指針位置程序void lcd_init(); /LCD 初始化設(shè)定程序void pro_timedate(); / 時(shí)間日期處理程序void pro_display(); / 顯示處理程序void pro_key(); / 按鍵處理程序void time_alarm(); / 定時(shí)報(bào)警功能(鬧鐘)unsigned char sc
27、an_key();/ 按鍵掃描程序unsigned char week_proc(); / 星期自動(dòng)計(jì)算與顯示函數(shù)bit leap_year(); / 判斷是否為閏年void lcd_sef_chr(); /LCD 自定義字符程序void update_disbuf(unsigned char t1,unsigned char t2,unsigned chardis_h,unsigned char dis_m,unsigned char dis_s/)/; 更新顯示緩沖區(qū)函數(shù)/ 延時(shí)程序void delay(unsigned char ms) while(ms-) unsigned char
28、i;for(i = 0; i< 250; i+)_nop_();/執(zhí)行一條_nop_Qf旨令為一個(gè)機(jī)器周期_nop_();_nop_();_nop_();/ 測(cè)試 LCD 忙碌狀態(tài)bit lcd_busy()bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(P0&0x80); /LCD 的 D0-D7 中 ,D7=1 為忙碌 ,D7=0 為空閑 ep = 0;return result;/ 寫入指令到LCDvoid lcd_wcmd(char cmd)while(lcd_bu
29、sy(); /當(dāng) lcd_busy為 1 時(shí),再次檢測(cè) LCD 忙碌狀態(tài),lcd-busy為0 時(shí) ,開場(chǎng)寫指令rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;/ 寫入數(shù)據(jù)到LCDvoid lcd_wdat(char dat)while(lcd_busy(); /當(dāng) lcd_busy為 1 時(shí),再次檢測(cè) LCD 忙碌狀態(tài),lcd-busy為0 時(shí) ,開場(chǎng)寫數(shù)據(jù)rs = 1;rw = 0;ep =
30、0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;/LCD 數(shù)據(jù)指針位置程序void lcd_pos(char pos)lcd_wcmd(pos|0x80); /數(shù)據(jù)指針=80+地址碼(00H27H,40H67H)設(shè)定二個(gè)自定義字符,(注意:LCD1602中自定義字符的地址為0x00-0x07,即可定義8個(gè)字符)/這里我們?cè)O(shè)定把一個(gè)自定義字符放在0x00位置000,另一個(gè)放在0x01位子001void lcd_sef_chr() /第一個(gè)自定義字符lcd_wcmd(0
31、x40); /"01 000 000"第1行地址(D7D6為地址設(shè)定命令形式D5D4D3為字符存放位置(0-7), D2D1D0為字符行地址(0-7)lcd_wdat(0x1f); /"XXX 11111"第 1 行數(shù)據(jù)D7D6D5 為 XXX ,表示為任意數(shù)(一般用000,D4D3D2D1D0為字符行數(shù)據(jù)(1-點(diǎn)亮,0-熄滅lcd_wcmd(0x41); /"01 000 001"第 2 行地址lcd_wdat(0x11); /"XXX 10001"第 2 行數(shù)據(jù)lcd_wcmd(0x42); /"01
32、 000 010"第 3 行地址lcd_wdat(0x15); /"XXX 10101"第 3 行數(shù)據(jù)lcd_wcmd(0x43); /"01 000 011"第 4 行地址lcd_wdat(0x11); /"XXX 10001"第 4 行數(shù)據(jù)lcd_wcmd(0x44); /"01 000 100"第 5 行地址lcd_wdat(0x1f); /"XXX 11111"第 5 行數(shù)據(jù)lcd_wcmd(0x45); /"01 000 101"第 6 行地址lcd_wd
33、at(0x0a); /"XXX 01010"第 6 行數(shù)據(jù)lcd_wcmd(0x46); /"01 000 110" 第 7 行地址lcd_wdat(0x1f); /"XXX 11111" 第 7行數(shù)據(jù)lcd_wcmd(0x47); /"01 000 111" 第 8 行地址lcd_wdat(0x00); /"XXX 00000" 第 8行數(shù)據(jù)/ 第二個(gè)自定義字符lcd_wcmd(0x48); /"01 001 000" 第 1 行地址lcd_wdat(0x01); /&qu
34、ot;XXX 00001" 第 1 行數(shù)據(jù)lcd_wcmd(0x49); /"01 001 001" 第 2 行地址lcd_wdat(0x1b); /"XXX 11011" 第2行數(shù)據(jù)lcd_wcmd(0x4a); /"01 001 010" 第 3 行地址lcd_wdat(0x1d); /"XXX 11101" 第3行數(shù)據(jù)lcd_wcmd(0x4b); /"01 001 011" 第 4行地址lcd_wdat(0x19); /"XXX 11001" 第 4行數(shù)據(jù)l
35、cd_wcmd(0x4c); /"01 001 100" 第 5行地址lcd_wdat(0x1d); /"XXX 11101" 第5行數(shù)據(jù)lcd_wcmd(0x4d); /"01 001 101" 第 6 行地址lcd_wdat(0x1b); /"XXX 11011" 第6行數(shù)據(jù)lcd_wcmd(0x4e); /"01 001 110" 第 7 行地址lcd_wdat(0x01); /"XXX 00001" 第 7行數(shù)據(jù)lcd_wcmd(0x4f); /"01 00
36、1 111" 第 8行地址lcd_wdat(0x00); /"XXX 00000" 第 8行數(shù)據(jù)/LCD 初始化設(shè)定void lcd_init()lcd_wcmd(0x38); /設(shè)置LCD為16X2顯示,5X7點(diǎn)陣八位數(shù)據(jù)借口 delay(1);lcd_wcmd(0x0c); /LCD 開顯示及光標(biāo)設(shè)置(光標(biāo)不閃爍,不顯示"-")delay(1); lcd_wcmd(0x06); /LCD 顯示光標(biāo)移動(dòng)設(shè)置(光標(biāo)地址指針加1,整屏顯示不移動(dòng) )delay(1);lcd_wcmd(0x01); / 去除 LCD 的顯示內(nèi)容 delay(1);/
37、 閏年的計(jì)算bit leap_year()bit leap;if(year%4=0&&year%100!=0)|year%400=0)/ 閏年的條件leap=1;elseleap=0;return leap;/ 星期的自動(dòng)運(yùn)算和處理unsigned char week_proc() unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;/自 00年起至U year所經(jīng)歷的閏年數(shù)if( leap_year()&& month<=2 )/ 既是閏年且是1 月和 2 月c
38、=5;elsec=6;week=(year+para_monthmonth+date+num_leap+c)%7;/計(jì)算對(duì)應(yīng)的星期 return week;/ 更新顯示緩沖區(qū)void update_disbuf(unsigned char t1,unsigned char t2,unsigned char dis_h,unsigned char dis_m,unsigned char dis_s) dis_buf10=t1;/dis_buf11=0x20;/ 空格dis_buf12=50;/'2'dis_buf13=48;/'0'dis_buf14=year/1
39、0+48;dis_buf15=year%10+48;dis_buf16=0x2d;dis_buf17=month/10+48;dis_buf18=month%10+48;dis_buf19=0x2d;/'-'dis_buf110=date/10+48;dis_buf111=date%10+48;dis_buf112=0x20;dis_buf113=dis_week4*week;dis_buf114=dis_week4*week+1;dis_buf115=dis_week4*week+2;dis_buf20=t20;dis_buf21=t21;dis_buf22=t22;dis_
40、buf23=t23;dis_buf24=t24;dis_buf25=t25;dis_buf26=0x20; / 空格if (alarm)dis_buf27=0x01; /alarm=1 , 顯示鬧鐘啟用標(biāo)致第二個(gè)自定義字符elsedis_buf27=0x20; /alarm=0 ,不顯示鬧鐘啟用標(biāo)致dis_buf28=dis_h/10+48;dis_buf29=dis_h%10+48;dis_buf210=0x3a; /':'dis_buf211=dis_m/10+48;dis_buf212=dis_m%10+48;dis_buf213=0x3a;dis_buf214=dis_
41、s/10+48;dis_buf215=dis_s%10+48;/ 時(shí)間和日期處理程序void pro_timedate()sec+;if(sec > 59)sec = 0;min+;if(min>59)min=0;hour+;if(hour>23)hour=0;date+;if (month=1|month=3|month=5|month=7|month=8|month= 10|month=12)if (date>31) date=1;month+; / 大月 31 天if (month=4|month=6|month=9|month=11)if (date>30
42、) date=1;month+; /小月 30 天if (month=2)if( leap_year() / 閏年的條件if (date>29) date=1;month+; / 閏年 2 月為 29天 elseif (date>28) date=1;month+; / 平年 2 月為 28天if (month>12) month=1;year+;if (year>99) year=0;week_proc();if (sec=armsec && min=armmin && hour=armhour)if (alarm)TR1=1;/鬧鐘啟
43、用時(shí),報(bào)警時(shí)間到,啟動(dòng)TimeU/ 顯示處理程序void pro_display() unsigned char i;lcd_pos(0x00);for (i=0;i<=15;i+)lcd_wdat(dis_buf1i);lcd_pos(0x40);for (i=0;i<=15;i+)lcd_wdat(dis_buf2i);/Timer0 中斷處理程序,秒的產(chǎn)生void timer0() interrupt 1TH0=0xdc;/Timer0 置 10ms 定 時(shí) 初 值dc00H(2A16=65536D,dc00H=56320D)TL0=0x00;/ 定 時(shí) 時(shí) 間 =(6553
44、6-56320)*(1/11.0592)*12=10ms(f0=11.0592Mhz)sec100+;if(sec100 >= 100) /1 秒時(shí)間 (100*10ms=1000ms=1s)sec100 = 0;pro_timedate();/調(diào)用時(shí)間和日期處理程序if (sec&0x01)/ 一秒顯示 “hello", 一秒顯示 “ kitty"update_disbuf(0x00,"KITTY",hour,min,sec); /0x00 表示顯示00位置的自定義字符elseupdate_disbuf(0x00,"HELLO&
45、quot;,hour,min,sec);pro_display(); / 調(diào)用顯示處理函數(shù)/ 按鍵掃描程序unsigned char scan_key()skey=0x00;/給變量vkey置初值skey|=PRE;/讀取PRE鍵的狀態(tài)skey=skey<<1; /將PRE鍵的狀態(tài)存于skey的B1位skey|=SET;/讀取SET鍵的狀態(tài),并存于skey的B0位return skey; /返回skey的鍵值(即PRE,SET的狀態(tài))/ 外部中斷INT0 中斷處理程序void int0() interrupt 0TR0=0;/ 制止 Timer0IE=0;/ 制止中斷l(xiāng)cd_wcm
46、d(0x0e); / 顯示光標(biāo)"_",整個(gè)光標(biāo)不閃爍alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec/)/; 更新顯示數(shù)據(jù),0x50表示要顯示"P"pro_display(); / 調(diào)用顯示處理程序lcd_pos(0x47);/ 使光標(biāo)位于第一個(gè)調(diào)整項(xiàng)下flag=0;vkey=0x03;while(flagA0x0a)skey = scan_key(); / 掃描按鍵狀態(tài)if (skeyAvkey) 假設(shè)skey與vkey一樣,跳出循環(huán),相異執(zhí)行循環(huán)體 delay(10
47、); / 去按鍵抖動(dòng)skey = scan_key(); / 轉(zhuǎn)回掃描按鍵狀態(tài)if (skeyAvkey) 假設(shè)skey與vkey一樣,跳出循環(huán),相異執(zhí)行循環(huán)體 vkey=skey; / 將 skey 的值付給 vkeyif (skey=0x01) /PRE 鍵按下 flag+; / 調(diào)整標(biāo)志位加1switch (flag) /將光標(biāo)置于相應(yīng)調(diào)整位置case 1: lcd_pos(0x49);break;/ 光標(biāo)置小時(shí)報(bào)警設(shè)置位置case 2: lcd_pos(0x4c);break;/ 光標(biāo)置分鐘報(bào)警設(shè)置位置case 3: lcd_pos(0x4f);break;/ 光標(biāo)置秒時(shí)報(bào)警設(shè)置位置c
48、ase 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break; / 光標(biāo)置年調(diào)整位置case 5: lcd_pos(0x08);break;/ 光標(biāo)置月調(diào)整位置case 6: lcd_pos(0x0b);break;/ 光標(biāo)置日調(diào)整位置case 7: lcd_pos(0x49);break;/ 光標(biāo)置時(shí)調(diào)整位置case 8: lcd_pos(0x4c);break;/ 光標(biāo)置分調(diào)整位置case 9: lcd_pos(0x4f);break;/ 光標(biāo)置秒調(diào)整位置defaul
49、t:break;if (skey=0x02) /SET 鍵按下 pro_key(); / 轉(zhuǎn)設(shè)置按鍵處理程序lcd_wcmd(0x0c);/ 設(shè)置 LCD 開顯示及光標(biāo)不閃爍,不顯示"-"lcd_wcmd(0x01);/ 去除 LCD 的顯示內(nèi)容IE=0x8f;/CPU 開中斷 ,INT0,INT1, 開中斷TR0=1;/Timer0 啟動(dòng)/ 主程序,初始化及初值設(shè)定void main()lcd_init();/ 初始化 LCDlcd_sef_chr(); / 寫入自定義字符號(hào)hour=10;min=30;sec=0;/ 開機(jī)時(shí)的時(shí),分 ,秒顯示armhour=10;arm
50、min=29;armsec=0; / 開機(jī)時(shí)的時(shí),分 ,秒報(bào)警初值year=11; month=5;date=9; / 開機(jī)時(shí)的年,月 ,日 ,星期顯示week_proc();alarm=1; / 初始開機(jī),啟用鬧鐘IE = 0x8f; /CPU 開中斷 ,INT0,INT1,Timer0,Timer1 開中斷IP = 0x04;/ 設(shè)置 INT0 為中斷最高優(yōu)先級(jí)IT0=0;IT1=0;/ 外部 INT0,INT1 設(shè)置為電平觸發(fā)方式注意,觸發(fā)不要選邊沿方式,易誤動(dòng)TMOD = 0x11; /Timer0,Timer1 工作于模式1, 16位定時(shí)方式TH0 = 0xdc;TL0 = 0x00; /Timer。置 10ms定時(shí)初值TH1 = 0xff;TL1 = 0x00; /Timer1 置初值TR0 = 1; /Timer0 啟動(dòng)TR1 = 0;SPK=0;while(1);/ 設(shè)置按鍵處理程序void pro_key()switch (flag)case 0:alarm=!alarm; 啟用或關(guān)閉鬧鐘alarm=1 啟用,alarm=0關(guān)閉)update_disbuf(0x50,"alarm:",armh
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 細(xì)化目標(biāo)管理的作用計(jì)劃
- 關(guān)注行業(yè)動(dòng)態(tài)與市場(chǎng)變化的敏感度計(jì)劃
- 《實(shí)驗(yàn)設(shè)計(jì)與數(shù)據(jù)分析-(理論)模板2》課程教學(xué)大綱
- 《化工設(shè)計(jì)(材化)(理論)》課程教學(xué)大綱
- 提升供水效率的具體措施計(jì)劃
- 月團(tuán)隊(duì)協(xié)作與溝通技巧計(jì)劃
- 學(xué)校班主任的傳統(tǒng)文化教育指導(dǎo)方針計(jì)劃
- 今后工作的改進(jìn)與展望計(jì)劃
- 信息技術(shù)在小學(xué)課外活動(dòng)中的應(yīng)用
- 2024屆湖南省株洲市高三年級(jí)上冊(cè)一??荚嚉v史試題(解析版)
- 《新能源汽車動(dòng)力電池技術(shù)》課件
- 婦女健康 知識(shí)講座課件
- 2025東風(fēng)公司全球校園招聘筆試參考題庫(kù)附帶答案詳解
- 恒生電子江蘇總部項(xiàng)目報(bào)告表
- 2025年黑龍江農(nóng)業(yè)工程職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)匯編
- 簡(jiǎn)短戒煙服務(wù)培訓(xùn)課件
- 2025年鄂東高三語(yǔ)文2月調(diào)研聯(lián)考試卷附答案解析
- 湖南省2023年普通高等學(xué)校對(duì)口招生考試英語(yǔ)試卷
- 中國(guó)大米等糧食項(xiàng)目投資可行性研究報(bào)告
- 第11課《山地回憶》公開課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)
- 5.第五周 植此青綠共筑“雙碳”新未來(lái)
評(píng)論
0/150
提交評(píng)論