版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
電子設計競賽作品設計報告作品題目序號A8作品題目名稱學校學生生活時間提示系統(tǒng)參賽隊伍序號參賽隊伍名稱參賽隊員姓名作品完成情況□作品完整□作品局部完成□作品未制作目錄TOC\o"1-2"\h\z\u1.方案設計與論證21.1、設計任務與要求21.2、方案設計與論證22.系統(tǒng)硬件設計32.1系統(tǒng)框圖32.2各模塊電路設計32.3電路原理圖及電路介紹63.軟件總體流程圖64.結語74.1電路調試及測試結果74.2結論與心得85.參考文獻8附表8摘要:本設計給出了以單片機ST89C52為核心的學校學生生活時間提示系統(tǒng)的根本原理和實現(xiàn)方案。該系統(tǒng)用LCD1602作為液晶顯示器,用時鐘芯片DS1302在斷電后仍可顯示正確時間,配合按鍵可實現(xiàn)手動設置時間,同時實現(xiàn)鬧鐘提示等各種功能。電壓轉換通過7805實現(xiàn)9V轉換成5V供電路使用。通過程序的編寫與調試及電路的焊接等工作,最終本設計能夠實現(xiàn)顯示顯示時間并可人為調整時間及實現(xiàn)鬧鐘提示等功能的學校學生生活時間提示系統(tǒng)。關鍵詞:學校學生生活時間提示系統(tǒng)單片機液晶顯示器1、方案設計與論證1.1、設計任務與要求〔一〕、設計任務:以單片機為主控制器,設計并制作一套學校學生生活時間提示系統(tǒng)。〔二〕、要求:1.根本要求:〔1〕計時和顯示功能〔24小時制〕,包括時、分、秒的顯示?!?〕通過按鍵設置當前時間〔時、分〕?!?〕實現(xiàn)根本學生生活時間提示,規(guī)定如下:06:00起床:聲音提示5秒、停2秒、再提示5秒。22:30熄燈:聲音提示5秒、停2秒、再提示5秒。2.發(fā)揮局部:〔1〕增加整點報時功能,整點時聲音提示10秒,有控制啟動和關閉功能。〔2〕增加起床、熄燈時間調整時的聲音提示功能?!?〕增設上午4節(jié)課的上下課聲音提示功能,規(guī)定如下:7:50上課,8:35下課;8:45上課,9:30下課;9:50上課,10:35下課;10:45上課,11:30下課;每次聲音提示5秒。1.2、方案設計與論證1.2.1單片機的選擇方案一:采用STC89C52作為微控制器,單片機算術運算功能強,軟件編程靈活、自由度大,可用軟件編程實現(xiàn)各種算法和邏輯控制,并且由于其功耗低、體積小、技術成熟和本錢低等優(yōu)點,使其在各個領域應用廣泛。方案二:ATMEL公司生產的AT89CXX系列單片機,其中有8位的單片機,也有16位的單片機。STC89C52為8位的單片機,它是一種低損耗、高性能的CMOS微處理器,并且可以在線進行重復編程、快速擦除、快速寫入程序,能重復擦除/寫入1000次左右,數(shù)據(jù)保存時間為十年。綜上所述,在本設計中,由于本系統(tǒng)對CPU運算速度要求不高,不需要執(zhí)行很復雜的運算,加上本錢上和隊員各自的技術特點考慮,考慮到本人對單片機的運用熟練度和單片機的功能領域,綜合起來選STC89C52單片機作為本設計的微控制器較適合本系統(tǒng)的要求。1.2.2LCD液晶顯示模塊的方案比照選擇方案一:顯示的方法有很多種,其中LED數(shù)碼管是常用的一種顯示方法。在這個設計中,可以用LED數(shù)碼管來顯示相應數(shù)字,該設計中,數(shù)碼管使用數(shù)量較多,焊接較麻煩。另外在PCB布線過程中很困難,給設計帶來很不方便的使用。方案二:LCD1602液晶顯示器是一塊價廉物美的器件,其體積小,控制簡單,使用方便。它能顯示2行16列的數(shù)字或英文信息,另外連接它的線很少,只要8根數(shù)據(jù)線和3根控制線,這樣給使用帶來很大的方便,節(jié)約單片機I/O口,價格比數(shù)碼管廉價。綜上所述,在LCD液晶顯示模塊上,選擇方案二中的LCD1602液晶顯示器作為本設計的顯示模塊,顯示時間年、月、日、時、分、秒。時鐘電路的選擇方案一:DS1302是一種高性能、低功耗、帶RAM的實時時鐘芯片它可以對年、月、日、日、時、分、秒進行計時且具有閏年補償功能工作電壓寬達2.5-5.5V。采用三線接口與單片機進行同步通信并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM存放器。DS1302是DS1202的升級產品與DS1202兼容但增加了主電源和后背電源雙電源引腳同時提供了對后背電源進行涓細電流充電的能力。方案二:STC89C52有3個內部定時器中斷因此我們可以直接采用單片機內部定時器來實現(xiàn)年月日時分秒的計時的功能綜合考慮以上兩種方案由于DS1302的高性能低功耗且內部自帶RAM可以對年、月、日、時、分、秒進行計時且具有閏年補償功能工作電壓寬編程簡單有后備電源。所以我們選用DS1302作為時鐘芯片。2、系統(tǒng)硬件設計2.1、系統(tǒng)框圖P0PP0PSTC89C52RSTP2.0-P2.2/〔P2.4-P2.7〕P3.0-3.4XTAL2XTAL1排阻上電復位手動按鍵鬧鐘工作指示燈LCD液晶顯示內部時鐘讀寫及使能信號/〔時鐘芯片〕單片機模塊:STC89C52俗稱單片機,是一種帶8K字節(jié)閃爍可編程可檫除只讀存儲器〔FPEROM-FlashProgramableandErasableReadOnlyMemory〕的低電壓,高性能COMOS8的微處理器,使用經典的MCS-51內核,但做了很多的改良,是的芯片具有傳統(tǒng)51單片機不具備的功能。在單芯片上,擁有靈巧的8位CPU和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應用系統(tǒng)提供高靈活、超有效的解決方案。具有以下標準功能:8K字節(jié)Flash,512字節(jié)RAM,32位I/O口線,看門狗定時器,內置4KBEEPROM,MAX810復位電路,三個16位定時器/計數(shù)器,一個7向量4級中斷結構(兼容傳統(tǒng)51的5向量2級中斷結構),全雙工串行口。STC89C52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。最高運作頻率35Mhz,6T/12T可選。STC89C52內部有一個用于構成振蕩器的高增益反相放大器,引腳RXD和TXD分別是此放大器的輸入端和輸出端。時鐘可以由內部方式產生或外部方式產生。電源模塊:由于整個系統(tǒng)采用的電源電壓只需+5V的電壓,所以采用不可調的3端穩(wěn)壓器件,用常用的7805就可以滿足系統(tǒng)電源的要求。其中1接整流器輸出的+電壓,2為公共地(也就是負極),3就是我們需要的正5V輸出電壓。7805三端集成穩(wěn)壓電源內部由基準電壓回路、恒流源、過流保護、過壓保護、和短路保護回路等8局部組成,具有低功耗,高效率,紋波系數(shù)小,輸出電壓穩(wěn)定等優(yōu)點。時間顯示模塊:液晶顯示器是一種功耗極低的被動式顯示器件,引腳腳介紹:D0—D7數(shù)據(jù)傳送引腳,VSS為接地線,VDD為電源線,VEE為LCD驅動電壓調節(jié),由此可以調節(jié)顯示亮度。RS為存放器選擇信號,高電平選擇數(shù)據(jù)存放器,RW高電平讀,低電平寫。EN使能信號,讀狀態(tài)下高電平有效,寫狀態(tài)下下降沿有效。RS連接P2.0,存放器選擇信號RW連接P2.1,讀寫控制信號線EN連接P2.2,〔4〕鍵盤控制模塊:五個按鍵分別是設置、增加、減少、鬧鐘開關鍵、確認,通過與程序結合可以實現(xiàn)通行狀態(tài)的改變,通過手動控制開關實現(xiàn)時間設定及鬧鐘功能,即當按鍵按下時有低電平輸入端口。如果想設置時間那么先按下設置鍵,再按加或減最后按下確認鍵,如此便實現(xiàn)了可以手動設置時間的功能,當按下鬧鐘開關時可實現(xiàn)鬧鐘的開關。蜂鳴器模塊:蜂鳴器驅動電路一般都包含以下幾個局部:一個三極管、一個蜂鳴器、一個電阻。1.蜂鳴器發(fā)聲元件,在其兩端施加直流電壓〔有源蜂鳴器〕或者方波〔無源蜂鳴器〕就可以發(fā)聲,其主要參數(shù)是外形尺寸、發(fā)聲方向、工作電壓、工作頻率、工作電流、驅動方式等。2.三極管三極管Q1起開關作用,其基極的高電平使三極管飽和導通,使蜂鳴器發(fā)聲;而基極低電平那么使三極管關閉,蜂鳴器停止發(fā)聲。2.3電路原理圖及電路介紹利用proteus畫好相應的硬件電路圖,并把程序燒入軟件仿真,看是否能顯示功能。見附件完整電路圖。電路主要由單片機STC89C52,LCD1602,7805,時鐘芯片DS1302,蜂鳴器等組成一個簡易的學校學生生活時間提示系統(tǒng)。該電路具有計時、顯示及定時功能,還可以通過按鍵手動設置設定鬧鐘提示時間,音提示5秒、停2秒、再提示5秒。時間顯示LCD602輸出端分別和單片機的P0.0-0.7口連接,讀寫及使能信號分別和單片機的P2.0,P2.1,P2.2口連接。排阻RESPACK-8接在51單片機的P0口,因為P0口內部沒有上拉電阻,不能輸出高電平,所以要接上拉電阻。是有一個實時時鐘/31字節(jié)靜態(tài)通過簡單的串行接口與單片機進行通信實時時鐘/日歷電路提供年、月、日、時、分、秒的信息可自動調整時鐘操作。接P2.5,實時時鐘時鐘線引腳;DS1302_IO接P2.6,實時時鐘數(shù)據(jù)線引腳;接P2.7,實時時鐘復位線引腳,VCC1接備用電源。蜂鳴器及其驅動電路單片機的和單片機的P2.4口連接,單片機驅動蜂鳴器時,三極管工作在開關狀態(tài),就像用單片機控制開關,再由開關去控制蜂鳴器一樣,只是將開關換成了三極管。電路中設有五個開關,分別是確認、設置、加、減、鬧鐘開關,分別和單片機的P3.2、P3.3、P3.5、P3.6、P3.7端口連接,通過手動控制開關實現(xiàn)時間設定及鬧鐘功能,P3.2、P3.3分別是單片機外部中斷0和外部中斷1的端口,設置它低電平有效,即當按鍵按下時有低電平輸入端口。如果想改變狀態(tài)那么先按下狀態(tài)鍵,再按加或減最后按下確認鍵。如果想改變時間那么先按下時間鍵然后按加或減最后按確認鍵。設定鬧鐘時間,通過蜂鳴器發(fā)出提示音。3、系統(tǒng)軟件設計3.1、軟件總體流程圖開始開始Lcd初始化時間初始化1302初始化判斷是否有按鍵按下Yes修改修改時間修改鬧時修改日期調用時間修改時間函數(shù)NO調用時間修改函數(shù)調用日期修改函數(shù)調用功能函數(shù)鬧鐘,作息提示整點報時再按控制鍵結束4、結語4.1、電路調試及測試結果利用Proteus繪制出相應硬件電路后進行仿真,出現(xiàn)液晶顯示無法正常顯示的問題。經過思考和查閱的資料發(fā)現(xiàn)STC89C52的P0在進高電平時沒有接上拉電阻導致LCD1602無法正常顯示時間。修改電路后〔P0口接上拉電阻〕燒入程序后,程序正常運行,LCD1602準確的顯示。用Proteus仿真能夠正確的現(xiàn)實時間,但燒入學習板出現(xiàn)亂碼現(xiàn)實不能正常工作。經過反復檢查及思考發(fā)現(xiàn)仿真軟件上的硬件電路與學習板上的硬件電路不一致無法對應起來。電路焊好后,將程序載入單片機,然后在實驗箱上調+9V的電源,由正負極分別引出一根線,正的與7805的輸入端相連,負的與電路板引出的地線連接。經過屢次修改程序和調試電路,最終測試結果和預期的一致。最后根據(jù)學習板的硬件電路修改相應程序及仿真軟件上的硬件電路,最終現(xiàn)實了功能。4.2、結論與心得通過這次電子設計大賽,在設計過程中我們先后利用keil軟件進行編程、Proteus進行仿真,最后再利用學習板進行檢查看程序是否能顯示其功能。在過程中讓我進一步深刻的學習各種軟件的利用以及各種軟件給我們帶來的便利。特別是proteus在沒有實物的情況下進行仿真進行程序的檢查看是否能現(xiàn)實功能。該設計通過單片機STC89C52做CPU進行總的控制,基于時鐘芯片DS1302產生時間,利用LCD1602進行液晶顯示的一個簡易的數(shù)字鐘。LCD1602能夠對年、月、日、時、分、秒進行計時及顯示。通過設計后能夠熟練的掌握時鐘芯片DS1302、LCD1620、STC89C52的的各個引腳及功能,并能夠掌握和運用這幾個芯片。在設計開始,問題就接踵而至,雖然做過些課程設計,參加過實踐,這次電子設計大賽使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會效勞,從而提高自己的實際動手能力和獨立思考的能力。許多電路不管簡單還是復雜,第一次搭建,調試,單片機編程序的時候總是讓人頭疼,但是有過一次經驗就好了,以后再碰到類似的電路就熟練得多。多動手也很重要,不要只對著圖紙或者資料看,好多電路都要親自調試才懂。正所謂時間出真知,怕麻煩是不可取的,多動手多時間,理論與實踐相結合,做得多經驗就多了。5.參考文獻[1]樓然苗、李光飛:《單片機課程設計指導》,北京航空航天大學出版社[2]李珍、付植桐:《單片機原理與應用技術》,清華大學出版社[3]李廣弟等.單片機根底[M].北京航空航天出版社,2001.[4]王東峰等.單片機C語言應用100例[M].電子工業(yè)出版社,2023.[5]陳海宴.51單片機原理及應用[M].北京航空航天大學出版社,2023.[6]許珉、毛小波:《單片機原理及應用》,中國電力出版社附表:〔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鬧鐘開關開啟1關閉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; //鬧鐘開關指示燈sbithour_led=P1^3; //整點報時開關指示燈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芯片的接口,復位端口定義在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;}/********************設定顯示位置*******************************/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初始化設定**********************************/voidlcd_init(){lcd_wcmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)delay(1);lcd_wcmd(0x0c);//顯示開,關光標delay(1);lcd_wcmd(0x06);//移動光標delay(1);lcd_wcmd(0x01);//去除LCD的顯示內容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初始化結束**************************//*******************DS1302*****************************//**********************************延時假設干數(shù)據(jù)*********************************/voiddelaynus(unsignedcharn){unsignedchari;for(i=0;i<n;i++);}/***************************向1302寫一個字節(jié)數(shù)據(jù)***************************************/voidWrite1302(unsignedchardat){unsignedchari;SCLK=0;//拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備delaynus(2);//稍微等待,使硬件做好準備for(i=0;i<8;i++)//連續(xù)寫8個二進制位數(shù)據(jù){ DATA=dat&0x01;//取出dat的第0位數(shù)據(jù)寫入1302低位在前,高位在后 delaynus(2);//稍微等待,使硬件做好準備 SCLK=1;//上升沿寫入數(shù)據(jù) delaynus(2);//稍微等待,使硬件做好準備 SCLK=0;//重新拉低SCLK,形成脈沖 dat>>=1;//將dat的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位 }}/*******************根據(jù)命令字,向1302寫一個字節(jié)數(shù)******************************/voidWriteSet1302(unsignedcharCmd,unsignedchardat){ RST=0;//禁止數(shù)據(jù)傳遞SCLK=0;//確保寫數(shù)居前SCLK被拉低 RST=1;//啟動數(shù)據(jù)傳輸 delaynus(2);//稍微等待,使硬件做好準備 Write1302(Cmd);//寫入命令字 Write1302(dat);//寫數(shù)據(jù) SCLK=1;//將時鐘電平置于高電平狀態(tài) RST=0;//禁止數(shù)據(jù)傳遞}/*******************************從1302讀一個字節(jié)數(shù)據(jù)***********************************/unsignedcharRead1302(void){unsignedchari,dat; delaynus(2);//稍微等待,使硬件做好準備 for(i=0;i<8;i++)//連續(xù)讀8個二進制位數(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進行初始化設置*************************************/voidInit_DS1302(void){ unsignedcharflag;flag=ReadSet1302(0x81); if(flag&0x80) {//判斷時鐘芯片是否關閉WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)存放器命令字,寫入不保護指令 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)存放器命令字,寫入保護指令}}/********************1302調用函數(shù)***************************************************/ voidget_date_time(void){ unsignedchartemp=0; unsignedcharReadValue=0;ReadValue=ReadSet1302(0x81);//從秒存放器讀數(shù)據(jù) temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 if(temp<60||temp>0)second=temp; ReadValue=ReadSet1302(0x83);//從分存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 if(temp<60||temp>0)minute=temp;ReadValue=ReadSet1302(0x85);//從小時存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 if(temp<=24||temp>0)hour=temp;ReadValue=ReadSet1302(0x87);//從天存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 if(temp<31||temp>0)day=temp; ReadValue=ReadSet1302(0x89);//從月存放器讀temp=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 if(temp<31||temp>0)month=temp; ReadValue=ReadSet1302(0x8d);//從年存放器讀temp=((ReadValue&0xf0)>>4)*10+(ReadValue&0x0F);//將讀出數(shù)據(jù)轉化 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; } //長按鍵,進入時鐘修改模式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; } //長按鍵,進入鬧鐘修改模式elseif(ok==0){while(ok==0){ok=1;_nop_();}//等待按鍵松開return5; }elsereturn0;}return0;}/*******************時間設置****************************/ /********************************************** 鍵值1修改時間2+3- 4鬧鐘開關5ok6日期修改7鬧鐘時間修改 **********************************************/voidmodify(BYTEcon){ BYTEok=0,count=0,KEY=0; lcd_wcmd(0x01); //去除lcd的內容 /************修改時間*****************/ if(con==1) {str_display("changetime",0,0); str_display(time,0x40,0);//顯示while(1){ KEY=push_button(); switch(KEY){case1:count++;break;//小時分鐘秒轉換 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)存放器命令字,寫入不保護指令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)存放器命令字,寫入保護指令 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)存放器命令字,寫入不保護指令 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)存放器命令字,寫入保護指令 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;//小時分鐘秒轉換 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的內容}/**********************按鍵處理程序****************************/ // 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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公益崗位用工合作協(xié)議3篇
- 2025年度電商平臺會員消費返利協(xié)議3篇
- 2025年度廢塑料瓶回收與環(huán)保瓶蓋生產合同樣板3篇
- 二零二五年度農機智能化作業(yè)合同書3篇
- 二零二五年度電子信息產品開發(fā)合作協(xié)議書2篇
- 二零二五年度消防安全風險評估與整改方案協(xié)議3篇
- 農村土地經營權抵押貸款擔保合同
- 2025年度醫(yī)藥研發(fā)人員競業(yè)禁止勞動合同書3篇
- 2025年度餐飲業(yè)食品安全責任書3篇
- 二零二五年度歷史文化名城拆遷房產分割與文物保護合同3篇
- 公路工程利用鋰渣技術規(guī)范 第一部分:路基工程-編制說明
- 裝飾裝修設備表
- 基于老舊小區(qū)加裝電梯特殊安全及風險控制的研究
- 甘肅省蘭州市(2024年-2025年小學三年級語文)人教版綜合練習(上學期)試卷(含答案)
- 2024年人教版小學四年級信息技術(上冊)期末試卷及答案
- 譯林版小學英語二年級上全冊教案
- DL∕T 821-2017 金屬熔化焊對接接頭射線檢測技術和質量分級
- DL∕ T 1195-2012 火電廠高壓變頻器運行與維護規(guī)范
- 小學五年級英語語法練習
- NB-T32004-2018光伏并網逆變器技術規(guī)范
- 領導與班子廉潔談話記錄(4篇)
評論
0/150
提交評論