




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
電子設(shè)計競賽作品設(shè)計報告作品題目序號A8作品題目名稱學(xué)校學(xué)生生活時間提示系統(tǒng)參賽隊伍序號參賽隊伍名稱參賽隊員姓名作品完成情況□作品完整□作品局部完成□作品未制作目錄TOC\o"1-2"\h\z\u1.方案設(shè)計與論證21.1、設(shè)計任務(wù)與要求21.2、方案設(shè)計與論證22.系統(tǒng)硬件設(shè)計32.1系統(tǒng)框圖32.2各模塊電路設(shè)計32.3電路原理圖及電路介紹63.軟件總體流程圖64.結(jié)語74.1電路調(diào)試及測試結(jié)果74.2結(jié)論與心得85.參考文獻(xiàn)8附表8摘要:本設(shè)計給出了以單片機ST89C52為核心的學(xué)校學(xué)生生活時間提示系統(tǒng)的根本原理和實現(xiàn)方案。該系統(tǒng)用LCD1602作為液晶顯示器,用時鐘芯片DS1302在斷電后仍可顯示正確時間,配合按鍵可實現(xiàn)手動設(shè)置時間,同時實現(xiàn)鬧鐘提示等各種功能。電壓轉(zhuǎn)換通過7805實現(xiàn)9V轉(zhuǎn)換成5V供電路使用。通過程序的編寫與調(diào)試及電路的焊接等工作,最終本設(shè)計能夠?qū)崿F(xiàn)顯示顯示時間并可人為調(diào)整時間及實現(xiàn)鬧鐘提示等功能的學(xué)校學(xué)生生活時間提示系統(tǒng)。關(guān)鍵詞:學(xué)校學(xué)生生活時間提示系統(tǒng)單片機液晶顯示器1、方案設(shè)計與論證1.1、設(shè)計任務(wù)與要求〔一〕、設(shè)計任務(wù):以單片機為主控制器,設(shè)計并制作一套學(xué)校學(xué)生生活時間提示系統(tǒng)。〔二〕、要求:1.根本要求:〔1〕計時和顯示功能〔24小時制〕,包括時、分、秒的顯示。〔2〕通過按鍵設(shè)置當(dāng)前時間〔時、分〕。〔3〕實現(xiàn)根本學(xué)生生活時間提示,規(guī)定如下:06:00起床:聲音提示5秒、停2秒、再提示5秒。22:30熄燈:聲音提示5秒、停2秒、再提示5秒。2.發(fā)揮局部:〔1〕增加整點報時功能,整點時聲音提示10秒,有控制啟動和關(guān)閉功能。〔2〕增加起床、熄燈時間調(diào)整時的聲音提示功能。〔3〕增設(shè)上午4節(jié)課的上下課聲音提示功能,規(guī)定如下:7:50上課,8:35下課;8:45上課,9:30下課;9:50上課,10:35下課;10:45上課,11:30下課;每次聲音提示5秒。1.2、方案設(shè)計與論證1.2.1單片機的選擇方案一:采用STC89C52作為微控制器,單片機算術(shù)運算功能強,軟件編程靈活、自由度大,可用軟件編程實現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術(shù)成熟和本錢低等優(yōu)點,使其在各個領(lǐng)域應(yīng)用廣泛。方案二:ATMEL公司生產(chǎn)的AT89CXX系列單片機,其中有8位的單片機,也有16位的單片機。STC89C52為8位的單片機,它是一種低損耗、高性能的CMOS微處理器,并且可以在線進(jìn)行重復(fù)編程、快速擦除、快速寫入程序,能重復(fù)擦除/寫入1000次左右,數(shù)據(jù)保存時間為十年。綜上所述,在本設(shè)計中,由于本系統(tǒng)對CPU運算速度要求不高,不需要執(zhí)行很復(fù)雜的運算,加上本錢上和隊員各自的技術(shù)特點考慮,考慮到本人對單片機的運用熟練度和單片機的功能領(lǐng)域,綜合起來選STC89C52單片機作為本設(shè)計的微控制器較適合本系統(tǒng)的要求。1.2.2LCD液晶顯示模塊的方案比照選擇方案一:顯示的方法有很多種,其中LED數(shù)碼管是常用的一種顯示方法。在這個設(shè)計中,可以用LED數(shù)碼管來顯示相應(yīng)數(shù)字,該設(shè)計中,數(shù)碼管使用數(shù)量較多,焊接較麻煩。另外在PCB布線過程中很困難,給設(shè)計帶來很不方便的使用。方案二:LCD1602液晶顯示器是一塊價廉物美的器件,其體積小,控制簡單,使用方便。它能顯示2行16列的數(shù)字或英文信息,另外連接它的線很少,只要8根數(shù)據(jù)線和3根控制線,這樣給使用帶來很大的方便,節(jié)約單片機I/O口,價格比數(shù)碼管廉價。綜上所述,在LCD液晶顯示模塊上,選擇方案二中的LCD1602液晶顯示器作為本設(shè)計的顯示模塊,顯示時間年、月、日、時、分、秒。時鐘電路的選擇方案一:DS1302是一種高性能、低功耗、帶RAM的實時時鐘芯片它可以對年、月、日、日、時、分、秒進(jìn)行計時且具有閏年補償功能工作電壓寬達(dá)2.5-5.5V。采用三線接口與單片機進(jìn)行同步通信并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM存放器。DS1302是DS1202的升級產(chǎn)品與DS1202兼容但增加了主電源和后背電源雙電源引腳同時提供了對后背電源進(jìn)行涓細(xì)電流充電的能力。方案二:STC89C52有3個內(nèi)部定時器中斷因此我們可以直接采用單片機內(nèi)部定時器來實現(xiàn)年月日時分秒的計時的功能綜合考慮以上兩種方案由于DS1302的高性能低功耗且內(nèi)部自帶RAM可以對年、月、日、時、分、秒進(jìn)行計時且具有閏年補償功能工作電壓寬編程簡單有后備電源。所以我們選用DS1302作為時鐘芯片。2、系統(tǒng)硬件設(shè)計2.1、系統(tǒng)框圖P0PP0PSTC89C52RSTP2.0-P2.2/〔P2.4-P2.7〕P3.0-3.4XTAL2XTAL1排阻上電復(fù)位手動按鍵鬧鐘工作指示燈LCD液晶顯示內(nèi)部時鐘讀寫及使能信號/〔時鐘芯片〕單片機模塊:STC89C52俗稱單片機,是一種帶8K字節(jié)閃爍可編程可檫除只讀存儲器〔FPEROM-FlashProgramableandErasableReadOnlyMemory〕的低電壓,高性能COMOS8的微處理器,使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改良,是的芯片具有傳統(tǒng)51單片機不具備的功能。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。具有以下標(biāo)準(zhǔn)功能:8K字節(jié)Flash,512字節(jié)RAM,32位I/O口線,看門狗定時器,內(nèi)置4KBEEPROM,MAX810復(fù)位電路,三個16位定時器/計數(shù)器,一個7向量4級中斷結(jié)構(gòu)(兼容傳統(tǒng)51的5向量2級中斷結(jié)構(gòu)),全雙工串行口。STC89C52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35Mhz,6T/12T可選。STC89C52內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,引腳RXD和TXD分別是此放大器的輸入端和輸出端。時鐘可以由內(nèi)部方式產(chǎn)生或外部方式產(chǎn)生。電源模塊:由于整個系統(tǒng)采用的電源電壓只需+5V的電壓,所以采用不可調(diào)的3端穩(wěn)壓器件,用常用的7805就可以滿足系統(tǒng)電源的要求。其中1接整流器輸出的+電壓,2為公共地(也就是負(fù)極),3就是我們需要的正5V輸出電壓。7805三端集成穩(wěn)壓電源內(nèi)部由基準(zhǔn)電壓回路、恒流源、過流保護(hù)、過壓保護(hù)、和短路保護(hù)回路等8局部組成,具有低功耗,高效率,紋波系數(shù)小,輸出電壓穩(wěn)定等優(yōu)點。時間顯示模塊:液晶顯示器是一種功耗極低的被動式顯示器件,引腳腳介紹:D0—D7數(shù)據(jù)傳送引腳,VSS為接地線,VDD為電源線,VEE為LCD驅(qū)動電壓調(diào)節(jié),由此可以調(diào)節(jié)顯示亮度。RS為存放器選擇信號,高電平選擇數(shù)據(jù)存放器,RW高電平讀,低電平寫。EN使能信號,讀狀態(tài)下高電平有效,寫狀態(tài)下下降沿有效。RS連接P2.0,存放器選擇信號RW連接P2.1,讀寫控制信號線EN連接P2.2,〔4〕鍵盤控制模塊:五個按鍵分別是設(shè)置、增加、減少、鬧鐘開關(guān)鍵、確認(rèn),通過與程序結(jié)合可以實現(xiàn)通行狀態(tài)的改變,通過手動控制開關(guān)實現(xiàn)時間設(shè)定及鬧鐘功能,即當(dāng)按鍵按下時有低電平輸入端口。如果想設(shè)置時間那么先按下設(shè)置鍵,再按加或減最后按下確認(rèn)鍵,如此便實現(xiàn)了可以手動設(shè)置時間的功能,當(dāng)按下鬧鐘開關(guān)時可實現(xiàn)鬧鐘的開關(guān)。蜂鳴器模塊:蜂鳴器驅(qū)動電路一般都包含以下幾個局部:一個三極管、一個蜂鳴器、一個電阻。1.蜂鳴器發(fā)聲元件,在其兩端施加直流電壓〔有源蜂鳴器〕或者方波〔無源蜂鳴器〕就可以發(fā)聲,其主要參數(shù)是外形尺寸、發(fā)聲方向、工作電壓、工作頻率、工作電流、驅(qū)動方式等。2.三極管三極管Q1起開關(guān)作用,其基極的高電平使三極管飽和導(dǎo)通,使蜂鳴器發(fā)聲;而基極低電平那么使三極管關(guān)閉,蜂鳴器停止發(fā)聲。2.3電路原理圖及電路介紹利用proteus畫好相應(yīng)的硬件電路圖,并把程序燒入軟件仿真,看是否能顯示功能。見附件完整電路圖。電路主要由單片機STC89C52,LCD1602,7805,時鐘芯片DS1302,蜂鳴器等組成一個簡易的學(xué)校學(xué)生生活時間提示系統(tǒng)。該電路具有計時、顯示及定時功能,還可以通過按鍵手動設(shè)置設(shè)定鬧鐘提示時間,音提示5秒、停2秒、再提示5秒。時間顯示LCD602輸出端分別和單片機的P0.0-0.7口連接,讀寫及使能信號分別和單片機的P2.0,P2.1,P2.2口連接。排阻RESPACK-8接在51單片機的P0口,因為P0口內(nèi)部沒有上拉電阻,不能輸出高電平,所以要接上拉電阻。是有一個實時時鐘/31字節(jié)靜態(tài)通過簡單的串行接口與單片機進(jìn)行通信實時時鐘/日歷電路提供年、月、日、時、分、秒的信息可自動調(diào)整時鐘操作。接P2.5,實時時鐘時鐘線引腳;DS1302_IO接P2.6,實時時鐘數(shù)據(jù)線引腳;接P2.7,實時時鐘復(fù)位線引腳,VCC1接備用電源。蜂鳴器及其驅(qū)動電路單片機的和單片機的P2.4口連接,單片機驅(qū)動蜂鳴器時,三極管工作在開關(guān)狀態(tài),就像用單片機控制開關(guān),再由開關(guān)去控制蜂鳴器一樣,只是將開關(guān)換成了三極管。電路中設(shè)有五個開關(guān),分別是確認(rèn)、設(shè)置、加、減、鬧鐘開關(guān),分別和單片機的P3.2、P3.3、P3.5、P3.6、P3.7端口連接,通過手動控制開關(guān)實現(xiàn)時間設(shè)定及鬧鐘功能,P3.2、P3.3分別是單片機外部中斷0和外部中斷1的端口,設(shè)置它低電平有效,即當(dāng)按鍵按下時有低電平輸入端口。如果想改變狀態(tài)那么先按下狀態(tài)鍵,再按加或減最后按下確認(rèn)鍵。如果想改變時間那么先按下時間鍵然后按加或減最后按確認(rèn)鍵。設(shè)定鬧鐘時間,通過蜂鳴器發(fā)出提示音。3、系統(tǒng)軟件設(shè)計3.1、軟件總體流程圖開始開始Lcd初始化時間初始化1302初始化判斷是否有按鍵按下Yes修改修改時間修改鬧時修改日期調(diào)用時間修改時間函數(shù)NO調(diào)用時間修改函數(shù)調(diào)用日期修改函數(shù)調(diào)用功能函數(shù)鬧鐘,作息提示整點報時再按控制鍵結(jié)束4、結(jié)語4.1、電路調(diào)試及測試結(jié)果利用Proteus繪制出相應(yīng)硬件電路后進(jìn)行仿真,出現(xiàn)液晶顯示無法正常顯示的問題。經(jīng)過思考和查閱的資料發(fā)現(xiàn)STC89C52的P0在進(jìn)高電平時沒有接上拉電阻導(dǎo)致LCD1602無法正常顯示時間。修改電路后〔P0口接上拉電阻〕燒入程序后,程序正常運行,LCD1602準(zhǔn)確的顯示。用Proteus仿真能夠正確的現(xiàn)實時間,但燒入學(xué)習(xí)板出現(xiàn)亂碼現(xiàn)實不能正常工作。經(jīng)過反復(fù)檢查及思考發(fā)現(xiàn)仿真軟件上的硬件電路與學(xué)習(xí)板上的硬件電路不一致無法對應(yīng)起來。電路焊好后,將程序載入單片機,然后在實驗箱上調(diào)+9V的電源,由正負(fù)極分別引出一根線,正的與7805的輸入端相連,負(fù)的與電路板引出的地線連接。經(jīng)過屢次修改程序和調(diào)試電路,最終測試結(jié)果和預(yù)期的一致。最后根據(jù)學(xué)習(xí)板的硬件電路修改相應(yīng)程序及仿真軟件上的硬件電路,最終現(xiàn)實了功能。4.2、結(jié)論與心得通過這次電子設(shè)計大賽,在設(shè)計過程中我們先后利用keil軟件進(jìn)行編程、Proteus進(jìn)行仿真,最后再利用學(xué)習(xí)板進(jìn)行檢查看程序是否能顯示其功能。在過程中讓我進(jìn)一步深刻的學(xué)習(xí)各種軟件的利用以及各種軟件給我們帶來的便利。特別是proteus在沒有實物的情況下進(jìn)行仿真進(jìn)行程序的檢查看是否能現(xiàn)實功能。該設(shè)計通過單片機STC89C52做CPU進(jìn)行總的控制,基于時鐘芯片DS1302產(chǎn)生時間,利用LCD1602進(jìn)行液晶顯示的一個簡易的數(shù)字鐘。LCD1602能夠?qū)δ辍⒃隆⑷铡r、分、秒進(jìn)行計時及顯示。通過設(shè)計后能夠熟練的掌握時鐘芯片DS1302、LCD1620、STC89C52的的各個引腳及功能,并能夠掌握和運用這幾個芯片。在設(shè)計開始,問題就接踵而至,雖然做過些課程設(shè)計,參加過實踐,這次電子設(shè)計大賽使我懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會效勞,從而提高自己的實際動手能力和獨立思考的能力。許多電路不管簡單還是復(fù)雜,第一次搭建,調(diào)試,單片機編程序的時候總是讓人頭疼,但是有過一次經(jīng)驗就好了,以后再碰到類似的電路就熟練得多。多動手也很重要,不要只對著圖紙或者資料看,好多電路都要親自調(diào)試才懂。正所謂時間出真知,怕麻煩是不可取的,多動手多時間,理論與實踐相結(jié)合,做得多經(jīng)驗就多了。5.參考文獻(xiàn)[1]樓然苗、李光飛:《單片機課程設(shè)計指導(dǎo)》,北京航空航天大學(xué)出版社[2]李珍、付植桐:《單片機原理與應(yīng)用技術(shù)》,清華大學(xué)出版社[3]李廣弟等.單片機根底[M].北京航空航天出版社,2001.[4]王東峰等.單片機C語言應(yīng)用100例[M].電子工業(yè)出版社,2023.[5]陳海宴.51單片機原理及應(yīng)用[M].北京航空航天大學(xué)出版社,2023.[6]許珉、毛小波:《單片機原理及應(yīng)用》,中國電力出版社附表:〔1〕完整電路圖:〔2〕元器件清單列表:名稱規(guī)格數(shù)量〔個〕萬用板9*15cm17805〔穩(wěn)壓〕L78051芯片底座40腳1LCD1602黃綠屏〔5V〕1排阻(A09-103)10K1LED燈5mm3蜂鳴器1.5V無源1按鍵6DS1302帶電池CR2032(帶晶振32.768MHz〕1電池9V1三極管S8050NPN4STC89C521〔3〕源程序清單:#include<reg52.h>#include<stdio.h>#include<intrins.h>typedefunsignedcharBYTE;typedefbitBOOL;unsignedcharri_con=0,hour_con=1; // ri_con鬧鐘開關(guān)開啟1關(guān)閉0unsignedcharyear=13,month=6,day=15,hour=12,minute=30,second=30;unsignedcharri_hour=10,ri_minute=0,ri_second=0,state=0;//鬧鐘時間現(xiàn)在狀態(tài)unsignedchardate[]="date13-06-15";unsignedchartime[]="time12:30:30";/********************使用引腳定義**************************/sbitbeep=P1^0; //蜂鳴器引腳sbitwork_led=P1^1; //工作指示燈sbitring_led=P1^2; //鬧鐘開關(guān)指示燈sbithour_led=P1^3; //整點報時開關(guān)指示燈sbitbutton_CON=P3^0;sbitbutton_ADD=P3^1;sbitbutton_DEC=P3^2;sbitbutton_COLCK=P3^3;sbitok=P3^4;sbitSCLK=P2^6;//位定義1302芯片的接口,時鐘輸出端口定義在P2.6引腳sbitDATA=P2^7;//位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P2.7引腳sbitRST=P2^5;//位定義1302芯片的接口,復(fù)位端口定義在P2.5引腳/****************************lcd引腳定義************************/sbitLCD_RS=P2^0;sbitLCD_RW=P2^1;sbitLCD_EP=P2^2;voiddelay(intms){//延時子程序inti;while(ms--){for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}/***************LCD************************//*****************測試LCD忙碌狀態(tài)************************/BOOLlcd_bz(){BOOLresult;LCD_RS=0;LCD_RW=1;LCD_EP=1;_nop_();_nop_();_nop_();_nop_();result=(BOOL)(P0&0x80);LCD_EP=0;returnresult;}/*********************寫入指令數(shù)據(jù)到LCD*********************************/voidlcd_wcmd(BYTEcmd){while(lcd_bz());LCD_RS=0;LCD_RW=0;LCD_EP=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP=1;_nop_();_nop_();_nop_();_nop_();LCD_EP=0;}/********************設(shè)定顯示位置*******************************/voidlcd_pos(BYTEpos){lcd_wcmd(pos|0x80);}/***********************寫入字符顯示數(shù)據(jù)到LCD********************************/voidlcd_wdat(BYTEdat){while(lcd_bz());LCD_RS=1;LCD_RW=0;LCD_EP=0;P0=dat;_nop_();_nop_();_nop_();_nop_();LCD_EP=1;_nop_();_nop_();_nop_();_nop_();LCD_EP=0;}/*************************LCD初始化設(shè)定**********************************/voidlcd_init(){lcd_wcmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)delay(1);lcd_wcmd(0x0c);//顯示開,關(guān)光標(biāo)delay(1);lcd_wcmd(0x06);//移動光標(biāo)delay(1);lcd_wcmd(0x01);//去除LCD的顯示內(nèi)容delay(1);}/*******************顯示函數(shù)************************/voidstr_display(BYTEmeg[],BYTEpostion,BYTEdel){ BYTEi=0;lcd_pos(postion); while(meg[i]!='\0'){lcd_wdat(meg[i]);i++; if(del!=0)delay(del);}}/*****************lcd初始化結(jié)束**************************//*******************DS1302*****************************//**********************************延時假設(shè)干數(shù)據(jù)*********************************/voiddelaynus(unsignedcharn){unsignedchari;for(i=0;i<n;i++);}/***************************向1302寫一個字節(jié)數(shù)據(jù)***************************************/voidWrite1302(unsignedchardat){unsignedchari;SCLK=0;//拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備delaynus(2);//稍微等待,使硬件做好準(zhǔn)備for(i=0;i<8;i++)//連續(xù)寫8個二進(jìn)制位數(shù)據(jù){ DATA=dat&0x01;//取出dat的第0位數(shù)據(jù)寫入1302低位在前,高位在后 delaynus(2);//稍微等待,使硬件做好準(zhǔn)備 SCLK=1;//上升沿寫入數(shù)據(jù) delaynus(2);//稍微等待,使硬件做好準(zhǔn)備 SCLK=0;//重新拉低SCLK,形成脈沖 dat>>=1;//將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個數(shù)據(jù)位 }}/*******************根據(jù)命令字,向1302寫一個字節(jié)數(shù)******************************/voidWriteSet1302(unsignedcharCmd,unsignedchardat){ RST=0;//禁止數(shù)據(jù)傳遞SCLK=0;//確保寫數(shù)居前SCLK被拉低 RST=1;//啟動數(shù)據(jù)傳輸 delaynus(2);//稍微等待,使硬件做好準(zhǔn)備 Write1302(Cmd);//寫入命令字 Write1302(dat);//寫數(shù)據(jù) SCLK=1;//將時鐘電平置于高電平狀態(tài) RST=0;//禁止數(shù)據(jù)傳遞}/*******************************從1302讀一個字節(jié)數(shù)據(jù)***********************************/unsignedcharRead1302(void){unsignedchari,dat; delaynus(2);//稍微等待,使硬件做好準(zhǔn)備 for(i=0;i<8;i++)//連續(xù)讀8個二進(jìn)制位數(shù)據(jù) { dat>>=1; if(DATA==1)//如果讀出的數(shù)據(jù)是1 dat|=0x80;//將1取出,寫在dat的最高位 SCLK=1;//將SCLK置于高電平,為下降沿讀出 delaynus(2);//稍微等待 SCLK=0;//拉低SCLK,形成脈沖下降沿 delaynus(2);//稍微等待 } returndat;//將讀出的數(shù)據(jù)返回}/*********************根據(jù)命令字,從1302讀取一個字節(jié)數(shù)據(jù)*******************************/unsignedcharReadSet1302(unsignedcharCmd){unsignedchardat;RST=0;//拉低RSTSCLK=0;//確保寫數(shù)居前SCLK被拉低RST=1;//啟動數(shù)據(jù)傳輸Write1302(Cmd);//寫入命令字dat=Read1302();//讀出數(shù)據(jù)SCLK=1;//將時鐘電平置于狀態(tài)RST=0;//禁止數(shù)據(jù)傳遞returndat;//將讀出的數(shù)據(jù)返回}/*********************1302進(jìn)行初始化設(shè)置*************************************/voidInit_DS1302(void){ unsignedcharflag;flag=ReadSet1302(0x81); if(flag&0x80) {//判斷時鐘芯片是否關(guān)閉WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)存放器命令字,寫入不保護(hù)指令 WriteSet1302(0x80,((55/10)<<4|(55%10)));//根據(jù)寫秒存放器命令字,寫入秒的初始值 WriteSet1302(0x82,((59/10)<<4|(59%10)));//根據(jù)寫分存放器命令字,寫入分的初始值 WriteSet1302(0x84,((23/10)<<4|(23%10)));//根據(jù)寫小時存放器命令字,寫入小時的初始值 WriteSet1302(0x86,((18/10)<<4|(18%10)));//根據(jù)寫日存放器命令字,寫入日的初始值 WriteSet1302(0x88,((6/10)<<4|(6%10)));//根據(jù)寫月存放器命令字,寫入月的初始值 WriteSet1302(0x8c,((9/10)<<4|(9%10)));//根據(jù)寫年存放器命令字,寫入年的初始值 WriteSet1302(0x90,0xa5);//翻開充電功能選擇2K電阻充電方式 WriteSet1302(0x8E,0x80); //根據(jù)寫狀態(tài)存放器命令字,寫入保護(hù)指令}}/********************1302調(diào)用函數(shù)***************************************************/ voidget_date_time(void){ unsignedchartemp=0; unsignedcharReadValue=0;ReadValue=ReadSet1302(0x81);//從秒存放器讀數(shù)據(jù) temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<60||temp>0)second=temp; ReadValue=ReadSet1302(0x83);//從分存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<60||temp>0)minute=temp;ReadValue=ReadSet1302(0x85);//從小時存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<=24||temp>0)hour=temp;ReadValue=ReadSet1302(0x87);//從天存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<31||temp>0)day=temp; ReadValue=ReadSet1302(0x89);//從月存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<31||temp>0)month=temp; ReadValue=ReadSet1302(0x8d);//從年存放器讀temp=((ReadValue&0xf0)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化 if(temp<20||temp>12)year=temp; //將日期變成字符型并加到數(shù)組上去date[12]="date13-6-15";time[13]="time12:30:30"; date[5]=year/10+'0'; date[6]=year%10+'0'; date[8]=month/10+'0'; date[9]=month%10+'0'; date[11]=day/10+'0'; date[12]=day%10+'0'; time[5]=hour/10+'0'; time[6]=hour%10+'0'; time[8]=minute/10+'0'; time[9]=minute%10+'0'; time[11]=second/10+'0'; time[12]=second%10+'0'; }/************************DS1302END**********************************//****************按鍵處理程序*********************/BYTEpush_button(void){BYTEi=0;button_CON=1;button_ADD=1;button_DEC=1;button_COLCK=1;ok=1;if(button_CON==0||button_ADD==0||button_DEC==0||button_COLCK==0||ok==0){delay(10);if(button_CON==0){while(button_CON==0){button_CON=1;delay(10);i++;}//等待按鍵松開if(i>=30)return6;elsereturn1; } //長按鍵,進(jìn)入時鐘修改模式elseif(button_ADD==0){while(button_ADD==0){button_ADD=1;_nop_();}//等待按鍵松開return2; }elseif(button_DEC==0){while(button_DEC==0){button_DEC=1;_nop_();}//等待按鍵松開return3; }elseif(button_COLCK==0){while(button_COLCK==0){button_COLCK=1;delay(10);i++;}//等待按鍵松開if(i>=30)return7;elsereturn4; } //長按鍵,進(jìn)入鬧鐘修改模式elseif(ok==0){while(ok==0){ok=1;_nop_();}//等待按鍵松開return5; }elsereturn0;}return0;}/*******************時間設(shè)置****************************/ /********************************************** 鍵值1修改時間2+3- 4鬧鐘開關(guān)5ok6日期修改7鬧鐘時間修改 **********************************************/voidmodify(BYTEcon){ BYTEok=0,count=0,KEY=0; lcd_wcmd(0x01); //去除lcd的內(nèi)容 /************修改時間*****************/ if(con==1) {str_display("changetime",0,0); str_display(time,0x40,0);//顯示while(1){ KEY=push_button(); switch(KEY){case1:count++;break;//小時分鐘秒轉(zhuǎn)換 case2:if(count==0){hour++;if(hour>=24)hour=0;}elseif(count==1){minute++;if(minute>=60)minute=0;}elseif(count==2){second++;if(second>=60)second=0;}break; case3:if(count==0){hour--;if(hour>=24)hour=23;}elseif(count==1){minute--;if(minute>=60)minute=59;}elseif(count==2){second--;if(second>=60)second=59;}break; case4:break; case5: ok=1;default:if(count==3)count=0;break; }//寫入時鐘芯片if(KEY==2||KEY==3){WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)存放器命令字,寫入不保護(hù)指令WriteSet1302(0x80,((second/10)<<4|(second%10)));//根據(jù)寫秒存放器命令字,寫入秒的初始值 WriteSet1302(0x82,((minute/10)<<4|(minute%10)));//根據(jù)寫分存放器命令字,寫入分的初始值 WriteSet1302(0x84,((hour/10)<<4|(hour%10)));//根據(jù)寫小時存放器命令字,寫入小時的初始值 WriteSet1302(0x8E,0x80); //根據(jù)寫狀態(tài)存放器命令字,寫入保護(hù)指令 get_date_time();str_display(time,0x40,10);//顯示 }if(ok==1)break; } } /************修改日期*******************/ elseif(con==6){ str_display("changedata",0,0); str_display(date,0x40,0);//顯示while(1){ KEY=push_button(); switch(KEY){case1:count++;break;//年月日 case2:if(count==0){year++;if(year>=100)year=0;}elseif(count==1){month++;if(month>12)month=0;}elseif(count==2){day++;if(day>31)day=0;}break; case3:if(count==0){year--;if(hour>=100)year=99;}elseif(count==1){month--;if(month>12)month=12;}elseif(count==2){day--;if(day>31)day=31;}break; case4:break; case5: ok=1;default:if(count==3)count=0;break; }//寫入時鐘芯片if(KEY==2||KEY==3){ WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)存放器命令字,寫入不保護(hù)指令 WriteSet1302(0x86,((day/10)<<4|(day%10)));//根據(jù)寫日存放器命令字,寫入日的初始值 WriteSet1302(0x88,((month/10)<<4|(month%10)));//根據(jù)寫月存放器命令字,寫入月的初始值 WriteSet1302(0x8c,((year/10)<<4|(year%10)));//根據(jù)寫年存放器命令字,寫入年的初始值 WriteSet1302(0x8E,0x80); //根據(jù)寫狀態(tài)存放器命令字,寫入保護(hù)指令 get_date_time();str_display(date,0x40,10);//顯示 }if(ok==1)break; } } /************修改鬧鐘*******************/ elseif(con==7){ str_display("changeri_time",0,0); str_display("06:00",0x43,0);//顯示while(1){ KEY=push_button(); switch(KEY){case1:count++;break;//小時分鐘秒轉(zhuǎn)換 case2:if(count==0){ri_hour++;if(ri_hour>=24)ri_hour=0;}elseif(count==1){ri_minute++;if(ri_minute>=60)ri_minute=0;}break; case3:if(count==0){ri_hour--;if(ri_hour>=24)ri_hour=23;}elseif(count==1){ri_minute--;if(ri_minute>=60)ri_minute=59;}break; case4:break; case5: ok=1;default:if(count==2)count=0;break; }//顯示lcd_pos(0x43);lcd_wdat(ri_hour/10+'0'); lcd_pos(0x44);lcd_wdat(ri_hour%10+'0'); lcd_pos(0x46); lcd_wdat(ri_minute/10+'0'); lcd_pos(0x47);lcd_wdat(ri_minute%10+'0');if(ok==1)break; } }lcd_wcmd(0x01); //去除lcd的內(nèi)容}/**********************按鍵處理程序****************************/ // state0空閑 1在執(zhí)行鬧鈴2在執(zhí)行整點報時/*****************鬧鐘整點報時處理程序**************************/voidring(void){ if(ri_con==1){ //鬧鐘 if(ri_hour==hour&&ri_minute==minute&&state==0&&second==0){ ri_second=second; state=1; beep=1; }if(ri_hour==hour&&ri_minute==minute&&state==1){ if(second==ri_second+5)beep=0; elseif(second==ri_second+7)beep=1; elseif(second>=ri_second+12){beep=0;state=0;} } if(((22==hour&&30==minute)||(6==hour&&0==minute))&&state==0&&second==0){ //早晚提示 ri_second=second; state=4; beep=1; } if(state==4){ if(second==ri_second+5)bee
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 移動閱讀應(yīng)用的內(nèi)容策劃與推廣考核試卷
- 糧油產(chǎn)品故事營銷與消費者情感共鳴考核試卷
- 肉制品加工業(yè)的市場戰(zhàn)略規(guī)劃考核試卷
- 海水養(yǎng)殖病害生物控制技術(shù)研究考核試卷
- 紡織鞋材的耐磨損性能評估考核試卷
- 聚苯乙烯纖維的化學(xué)性質(zhì)和應(yīng)用考核試卷
- 綠色供應(yīng)鏈企業(yè)環(huán)保實踐考核試卷
- 熱電聯(lián)產(chǎn)項目風(fēng)險評估考核試卷
- 糖果與巧克力品牌故事與企業(yè)文化塑造考核試卷
- 球類生產(chǎn)環(huán)境保護(hù)與可持續(xù)發(fā)展考核試卷
- 定額〔2025〕1號文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價格水平調(diào)整的通知
- 【MOOC】機械原理-西北工業(yè)大學(xué) 中國大學(xué)慕課MOOC答案
- 一種基于STM32的智能門鎖系統(tǒng)的設(shè)計-畢業(yè)論文
- 分紅險、萬能險銷售資質(zhì)考試真題模擬匯編(共763題)
- 魚臺工程運河杯匯報材料
- GB/T 16895.25-2022低壓電氣裝置第7-711部分:特殊裝置或場所的要求展覽、展示及展區(qū)
- 《運營管理》案例庫
- 煤礦安全監(jiān)控系統(tǒng)設(shè)備管理報廢制度
- 機關(guān)事業(yè)單位退休人員養(yǎng)老金領(lǐng)取資格確認(rèn)表
- 第五屆“國藥工程杯”全國大學(xué)生制藥工程設(shè)計競賽
- 柔性主動防護(hù)網(wǎng)分項工程質(zhì)量檢驗評定表
評論
0/150
提交評論