版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計論文</b></p><p> 題 目:電子鐘</p><p> 院 (系):電子信息工程與自動化學院</p><p> 專 業(yè):自動化</p><p><b> 學生姓名: </b></p><p><b>
2、; 學 號: </b></p><p><b> 指導教師:</b></p><p> 2011 年 1 月 20 日</p><p> 1 .課程設計題目4</p><p> 2 .系統(tǒng)方案設計4</p><p> 2.1 系統(tǒng)總體方案設計4</p>
3、;<p> 2.2 主要模塊方案選擇和論證5</p><p> 2.2.1 單片機的選擇5</p><p> 2.2.2 時間生成模塊的選擇5</p><p> 2.2.3 顯示模塊的選擇5</p><p> 2.2.4 定時時間到指示5</p><p> 2.2.5 按鍵的設計5
4、</p><p> 3 .硬件電路設計6</p><p> 3.1.1 單片機系統(tǒng)電路的設計:6</p><p> 3.1.2 時鐘芯片和按鍵電路設計6</p><p> 3.1.3 LCM1602模塊和蜂鳴器電路的設計6</p><p> 3.1.4 系統(tǒng)硬件總電路圖:7</p>
5、<p> 3.1.5 總系統(tǒng)電路的PCB圖7</p><p><b> 4 .軟件設計8</b></p><p> 4.1 系統(tǒng)軟件設計8</p><p> 4.1.1 主程序的事件順序驅動機制8</p><p> 4.1.2 網(wǎng)狀多級狀態(tài)結構的按鍵處理8</p><p&
6、gt; 4.1.3 秒表的定時中斷9</p><p> 4.1.4 系統(tǒng)主程序的流程圖10</p><p> 4.2 模塊軟件設計11</p><p> 4.2.1 LCM1602的驅動程序11</p><p> 4.2.2 DS1302的驅動程序11</p><p> 4.2.3 鬧鐘蜂鳴的驅動
7、程序12</p><p> 4.2.4 掉電狀態(tài)保存設計12</p><p> 5 .操作說明和最終實現(xiàn)12</p><p> 5.1 整體總裝圖:12</p><p> 5.2 操作說明13</p><p> 5.2.1 時間,日期,鬧鐘的設置13</p><p>
8、5.2.2 鬧鐘開/關的設置13</p><p> 5.2.3 在鬧鐘蜂鳴時停止鬧鐘13</p><p> 5.2.4 秒表的操作14</p><p><b> 6 .討論14</b></p><p><b> 7 .總結15</b></p><p> 主
9、要元器件清單:15</p><p> 2010年上學期單片機課程設計論文</p><p><b> 電子鐘</b></p><p><b> 摘 要</b></p><p> 本文敘述了電子鐘的整個設計過程,包括硬件設計和軟件設計,并重點討論了模塊軟件設計和編程思想,并在本文末尾進行了討
10、論和總結,提出了改進的方面和改進的方法。完成的電子鐘具有走時準確;掉電長時間后時間不需重新設置;鬧鐘時間和開關狀態(tài)掉電保存;秒表功能計時準確;功耗低,操作界面友好,操作簡便;最大的特點是具有人性化的設計。</p><p> 關鍵詞:電子鐘 硬件設計 軟件設計 編程思想 掉電保存 人性化 </p><p><b> Abstract:</b></
11、p><p> This article narrated electron clock's entire design process, including the hardware design and the software design, and discussed the module software design and the programming thought with emphasi
12、s, and has carried on the discussion and the summary end of this article, proposed the improvement aspect and the improvement method. Completes the electron clock has is in luck accurately; After power failure the long t
13、ime, the time cannot the reset; Alarm clock time and on-off state power failure pr</p><p> Keyword: Electron clock Hardware design Software design </p><p> Programming
14、 thought Power failure preservation User-friendly </p><p><b> .課程設計題目</b></p><p> 電子鐘:要求:1.顯示和設置時間;2.實現(xiàn)秒表功能;3.實現(xiàn)定時功能</p><p><b> .系統(tǒng)方案設計</b>&l
15、t;/p><p><b> 系統(tǒng)總體方案設計</b></p><p> 本課設題目要求為:1.顯示和設置時間;2.實現(xiàn)秒表功能;3.實現(xiàn)定時功能。顯示采用LCM1602液晶顯示模塊,設置時間按鍵采用簡單的單個I/O口鍵盤,時間生成采用DS1302時鐘芯片,秒表功能采用定時中斷實現(xiàn),蜂鳴器發(fā)聲。系統(tǒng)整體方案圖如下:</p><p> 主要模塊方
16、案選擇和論證</p><p><b> 單片機的選擇</b></p><p> 單片機有多種方案的選擇,如飛思卡爾XS128,凌陽SPCE061A語音單片機,AVR等,但51單片機價格便宜,使用方便,操作簡單,針對題目的要求,89S52八位單片機已足夠勝任,故本設計采用89S52做處理器控制模塊。</p><p><b> 時間
17、生成模塊的選擇</b></p><p> 時間生成可采用52單片的定時中斷實現(xiàn),它的優(yōu)點:軟硬件簡單,操作簡便,缺點:精確度低,掉電不保存。于是選擇常用的時鐘芯片DS1302來實現(xiàn)時間的生成。DS1302是低功耗實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與MCU進行同步通信,可提供秒,分,時,日,星期,月,年,采用雙電源供電(主電源和備用電源),工作電壓寬(2.5V~5.5V),不僅時
18、間精確,還可以掉電保存時間日期,靜態(tài)RAM可用來保存鬧鐘定時時間和重要數(shù)據(jù)、標記。</p><p><b> 顯示模塊的選擇</b></p><p> 顯示模塊是顯示時間等信息和人機交流的設備,好的人機操作界面應該是友好的,顯示的信息足夠豐富。顯示模塊可用8位數(shù)碼管顯示,但是數(shù)碼管顯示信息量少,顯示不友好,硬件相對復雜,在軟件設計中不斷掃描顯示,占用CPU時間,效
19、率低。因此本方案選用LCM1602液晶顯示模塊。LCM1602液晶顯示模塊可顯示16x2個字符,顯示信息豐富,界面友好,硬件接口簡單,驅動程序簡單,是理想的顯示器件。</p><p><b> 定時時間到指示</b></p><p> 定時時間到可用發(fā)光二極管指示,但效果不太人性化,而選用了蜂鳴器,定時時間到則蜂鳴以示定時時間到。</p><p
20、><b> 按鍵的設計</b></p><p> 由于電子鐘功能的設置簡單,只需5個按鈕,故不采用矩陣鍵盤,而是采用簡單的單個I/O口鍵盤,每個按鈕占用一個I/O口,程序簡單,硬件連接也很簡單。</p><p><b> .硬件電路設計</b></p><p> 單片機系統(tǒng)電路的設計:</p>
21、<p> 圖中為單片機最小系統(tǒng)電路圖,最小系統(tǒng)設計了手動復位按鈕和上電復位電路,ISP下載口,晶振為12Mhz。端口分配:</p><p> P0:經(jīng)上拉電阻后作為液晶模塊的數(shù)據(jù)輸入端。</p><p> P2.5作為LCM的RS端</p><p> P2.6作為LCM的RW端</p><p> P2.7作為DS1302的
22、EN端</p><p> P1.5作為DS1302的CLK端</p><p> P1.6作為DS1302的IO端</p><p> P1.7作為DS1302的RST端</p><p> P3.0經(jīng)上拉電阻后作為設置鍵</p><p> P3.1經(jīng)上拉電阻后作為上調鍵</p><p>
23、 P3.2經(jīng)上拉電阻后作為下調鍵</p><p> P3.3經(jīng)上拉電阻后作為退出鍵</p><p> P3.4經(jīng)上拉電阻后作為秒表鍵</p><p> 時鐘芯片和按鍵電路設計</p><p> DS1302實時時鐘芯片的晶振采用32.768khz,第8引腳經(jīng)30歐姆電阻與備用紐扣電池連接,作為主電源掉電后給DS1302提供電源,以保證
24、時間的正常運行。接按鍵的單片機端口接上10k歐姆的上拉電阻,以保證在無按鍵按下時端口是高電平,而按鍵按下時對應的I/O口為低電平。</p><p> LCM1602模塊和蜂鳴器電路的設計</p><p> LCM的數(shù)據(jù)總線與單片機的P0口相接,控制線分別與P2.7,P2.6,P2.5相接。LCM的第3個引腳接上了10K歐姆的可調電阻,用于調節(jié)液晶屏的對比度,而第15,16個引腳用100
25、歐姆電阻與電源串聯(lián),做為液晶屏的背光電源。P1.0做為蜂鳴器發(fā)聲的控制引腳,高低電平經(jīng)P1.0輸出,并經(jīng)過8050,9015兩個三極管組成的復合管驅動蜂鳴器的通與斷電,引起蜂鳴器中薄膜的震動從而發(fā)出聲音,高低電平的頻率即為發(fā)聲的頻率。</p><p><b> 系統(tǒng)硬件總電路圖:</b></p><p> 總系統(tǒng)電路的PCB圖</p><p&g
26、t;<b> .軟件設計</b></p><p><b> 系統(tǒng)軟件設計</b></p><p> 整個軟件系統(tǒng)采用模塊化思想,把1602,DS1302的驅動程序做成頭文件,在功能程序中調用。采用這種方法不僅使程序模塊化,使程序結構層次分明,便于管理和維護,同時可方便以后開發(fā)的調用,只要包含頭文件,功能程序模塊中再調用接口函數(shù)就可以了,而不
27、必關心底層驅動是如何實現(xiàn)的,這樣縮短了開發(fā)周期,開發(fā)效率大大提高。在主程序中采用事件順序驅動機制的編程方法,按鍵處理中采用采用網(wǎng)狀多級狀態(tài)結構的編程方法,而秒表功能采用定時中斷實現(xiàn),精確到1ms。</p><p> 主程序的事件順序驅動機制</p><p> 主程序采用事件驅動機制,事件為某個按鍵按下,則主程序響應這個按鍵,并進入相應的功能程序,其編程思想如下;</p>
28、<p> 其中改變設置標記的狀態(tài)為“設置”鍵:當?shù)谝淮伟聪隆霸O置”鍵時,改變設置標記為1,表示主程序應該響應設置事件,進入設置狀態(tài)。當退出設置狀態(tài)時,置設置標志為0,表示主程序響應顯示時間事件,進入顯示時間狀態(tài)。</p><p> 網(wǎng)狀多級狀態(tài)結構的按鍵處理</p><p> 按鍵處理中采用了基于狀態(tài)機的程序調度機制,當某個按鍵按下時,改變其狀態(tài),再根據(jù)狀態(tài)散轉去執(zhí)行相應的
29、程序,達到了一鍵多義的效果。</p><p> 設置鍵的狀態(tài)機處理過程為:每按一下“設置”鍵,則其狀態(tài)改變一次(標記狀態(tài)從1改變到8),如圖:</p><p> 各個鍵態(tài)的轉移網(wǎng)絡圖:</p><p><b> 秒表的定時中斷</b></p><p> 因為DS1302讀出的最小時間是1秒,而秒表功能要求要精確到
30、1毫秒,所以必須采用定時中斷來實現(xiàn)。每隔1毫秒中斷一次,精確到了1毫秒,達到了設計要求。其初始化如下:</p><p> 初始化:void time_init(void)</p><p> {IE=0x82;</p><p> TCON=0x00;</p><p><b> EA=1;</b></p>
31、;<p> TMOD=0X01; </p><p> TH0=(56636-1200)/256;</p><p> TL0=(56636-1200)%256;</p><p><b> TR0=0;</b></p><p><b> }</b></p><
32、p> 中斷程序:void clok(void) interrupt 1</p><p><b> 系統(tǒng)主程序的流程圖</b></p><p><b> 模塊軟件設計</b></p><p> LCM1602的驅動程序</p><p> #ifndef LCD_1602</p&g
33、t;<p> #define LCD_1602</p><p> #include <intrins.h></p><p> //引腳定義**********************************************************</p><p> sbit LcdRs= P2^5;</p>
34、<p> sbit LcdRw= P2^6;</p><p> sbit LcdEn = P2^7;</p><p> sfr DBPort = 0x80;//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數(shù)據(jù)端口</p><p> //------------------------接口函數(shù)----------
35、------------</p><p> 初始化:void LCD_Initial(void)</p><p> 設定坐標:void GotoXY(unsigned char x, unsigned char y)</p><p> 顯示字符串: void Print(unsigned char *str)</p><p> 顯示字
36、符:LCD_Write(LCD_DATA,*str)</p><p> 清屏:LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN)</p><p> DS1302的驅動程序</p><p> #ifndef _TIMER_DS1302</p><p> #define _TIMER_DS1302<
37、/p><p> sbit DS1302_CLK = P1^5; //實時時鐘時鐘線引腳 </p><p> sbit DS1302_IO = P1^6; //實時時鐘數(shù)據(jù)線引腳 </p><p> sbit DS1302_RST = P1^7; //實時時鐘復位線引腳</p
38、><p> //-----------------------接口函數(shù)-------------------</p><p> 初始化:void Initial_DS1302(void) //時鐘芯片初始化</p><p> 寫入數(shù)據(jù):void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucA
39、ddr: DS1302寫的地址, ucData: 要寫的數(shù)據(jù)</p><p> 讀取數(shù)據(jù):unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p> 取時間:void DS1302_GetTime(SYSTEMTIME *Time) //獲取時鐘芯片的時鐘數(shù)據(jù)到自定義的結構型數(shù)組</p>
40、<p> 轉化為顯示數(shù)據(jù):void DateToStr(SYSTEMTIME *Time) //將時間年,月,日,星期數(shù)據(jù)轉換成液晶顯示字符串,放到數(shù)組里DateString[]</p><p> 轉化為顯示數(shù)據(jù):void TimeToStr(SYSTEMTIME *Time) //將時,分,秒數(shù)據(jù)轉換成液晶顯示字符放到數(shù)組 TimeString[];</p><p>
41、; 寫RAM函數(shù):void WriteRAM(unsigned char address,unsigned char *dat,unsigned char n)</p><p> 讀RAM函數(shù):void ReadRAM(unsigned char address,unsigned char *dat,unsigned char n)</p><p><b> 鬧鐘蜂鳴的驅
42、動程序</b></p><p> void bz(int co,int h,int l) //co:蜂鳴節(jié)拍,h,l:蜂鳴音調</p><p><b> { int i;</b></p><p> for(i=1;i<=co;i++)</p><p><b> {b=1;<
43、/b></p><p> mdelay(h);</p><p><b> b=0;</b></p><p> mdelay(l);</p><p><b> }</b></p><p><b> }</b></p><
44、p> 調用:bz(100,1,1);//蜂鳴節(jié)拍為100,音調為1khz。</p><p><b> 掉電狀態(tài)保存設計</b></p><p><b> 寫數(shù)據(jù)入RAM:</b></p><p> Write1302(0x8e,0x00); //寫入允許 </p><p>
45、WriteRAM(0,stralarm,9);</p><p> Write1302(0x8e,0x80); //禁止寫入*/</p><p><b> 讀取RAM數(shù)據(jù):</b></p><p> ReadRAM(0,stralarm,9);</p><p> ReadRAM(12,alarm_flag_sto
46、,1);</p><p> alarm_on=alarm_flag_sto[0];</p><p> .操作說明和顯示界面設計</p><p><b> 整體總裝圖:</b></p><p><b> 操作說明</b></p><p> 時間,日期,鬧鐘的設置&l
47、t;/p><p> 在時間顯示界面下,每按一下“設置”鍵,依次對應的秒,分,時,星期,日,月,年會閃動,表示對應的屬性正在設置,此時按下“上調”鍵,則數(shù)值增加1,按下“下調”鍵,則對應的數(shù)值減1,按下“退出”鍵,則退出設置狀態(tài),回到時間顯示界面。當設置到年份時,再按一下“設置”鍵則進入鬧鐘時間的設置狀態(tài),此時數(shù)字不閃動,但有“Alarm”提示正在進行鬧鐘時間設置,此時按下“設置”鍵為時加1,按下“上調”鍵為分加1,
48、按下“下調”鍵則秒加1,按下“退出”鍵,則退出并保存設置狀態(tài),回到時間顯示界面。</p><p><b> 時間,日期設置:</b></p><p><b> 鬧鐘的設置:</b></p><p><b> 鬧鐘開/關的設置</b></p><p> 在時間顯示界面下,
49、每按一下“下調”,就會打開或關閉鬧鐘功能,對應地,當時間界面出現(xiàn)“alarm”時表示鬧鐘“開”,界面不出現(xiàn)“alarm”時表示鬧鐘“關”。鬧鐘的時間和開/關狀態(tài)具有掉電保存功能,即只需設置一次,掉電后無需再重新設置,上電后自動調出原先的設置。</p><p> 在鬧鐘蜂鳴時停止鬧鐘</p><p> 在時間顯示界面下,當鬧鐘時間到時,蜂鳴器會有大約20秒的蜂鳴,液晶顯示屏顯示鬧鐘設置時
50、間和提示“Alarm”,此時按下“退出”鍵則回到時間顯示界面,并且蜂鳴器停止蜂鳴。</p><p> 鬧鐘時間到時的顯示界面:</p><p><b> 秒表的操作</b></p><p> 在時間顯示界面下,按下“秒表”鍵,則進入秒表功能,按下“設置”鍵則開始計時,按下“上調”鍵則停止計時,按下“下調”鍵則清零計時,按下“退出”鍵則退出
51、并回到時間顯示界面。</p><p><b> 秒表功能界面:</b></p><p> 注:液晶顯示模塊默認顯示的是時間界面:</p><p><b> .討論</b></p><p> 在本次課程設計過程中,雖然非常順利地完成了軟件和硬件的設計和仿真,并最終實現(xiàn)了題目所要求實現(xiàn)的功能。但
52、還有可深入研究和可改進之處。在調試過程中,最讓人頭痛的是DS1302的驅動,除了注意時序以外,引腳的連接和抗干擾很重要,特別是使用了備份電池,當備份電池直接接在芯片第8腳時,芯片的發(fā)熱量很大,溫度上升達到了100度左右,經(jīng)過查看數(shù)據(jù)手冊,我認為是電池容量超過了芯片涓細充電電流所容許的容量,于是在第8腳和備用電池之間串聯(lián)了30歐姆的電阻,減小充電電流,消除了DS1302的發(fā)熱問題但不影響備用電池的功能。需要改進的地方是按鍵和鬧鐘時間的設置
53、。在實際的操作中,按鍵的反應很慢,原因是為了防抖而在程序中加入只有按鍵彈起才執(zhí)行的程序,雖然防抖了,但按鍵反應遲鈍,帶來了操作上的不便。另一個是在鬧鐘時間的設計上沒有“減一”功能,也給設置鬧鐘時帶來了不便(好在鬧鐘不經(jīng)常設置),這是出于存儲空間的節(jié)省需要而設計的。如果再增加“減一”功能,代碼的長度將會超出89S52的存儲空間,解決辦法是進一步優(yōu)化程序,減小代碼。以上兩方面在以后是需要進一步改進的。</p><p>
54、;<b> .總結</b></p><p> 從最終的作品來看,本電子鐘具有如下優(yōu)點:走時準確;掉電長時間(可達一年)后時間不需要重新設置;鬧鐘時間和開關狀態(tài)具有掉電保存功能(掉電后無需重新設置);秒表功能計時準確,精確到1毫秒;功耗低,操作界面友好,操作簡便;最大的特點是人性化的設計(如鬧鐘可以使用“快捷鍵”隨時關閉開啟,鬧鈴聲音柔和而不刺耳,各種狀態(tài)均顯示提示語)。</p>
55、;<p> 本課程設計從軟件設計到仿真到硬件制作和調試,我收獲不小。特別是在仿真編程和硬件調試方面。在編程過程中一直灌輸給自己“編程是一種思想”,一定要用編程的思想去編程,如模塊化思想,文件管理思想,頭文件和接口函數(shù)的思想,設計程序時要考慮到程序的可擴充性,兼容性,可維護性以及重用性,并歸納和總結各種功能算法,各種調度和事件驅動機制等等。在編程方面有了一定的進步。在使用仿真軟件時得到了一些啟示:仿真只是提供一個實現(xiàn)的大概
56、參考,真正的功能實現(xiàn)仍需在實際硬件調試中完善。</p><p><b> 參考文獻</b></p><p> 周興華.手把手教你學單片機C語言程序設計[M].北京:北京航空航天大學出版社,2007年</p><p> 張?。橙耸钟?一個單片機工作者的實踐與思考[M].北京:北京航空航天大學出版社,2008年</p><
57、;p> 張義和.例說51單片機[M].北京:人民郵電出版社,2010年</p><p><b> 附錄</b></p><p><b> 主要元器件清單:</b></p><p><b> 89S52單片機 </b></p><p> DS1302實時時鐘芯片&
58、lt;/p><p> LCM1602液晶顯示模塊</p><p><b> 蜂鳴器</b></p><p> 三極管9015,8050</p><p> CR2032紐扣電池(3V)</p><p><b> 輕觸開關</b></p><p>
59、 #include <REG52.H></p><p> #include <intrins.h></p><p> #include "LCD1602.h"</p><p> #include "DS1302.h"</p><p> #include "str
60、ing.h"</p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit Set = P3^0; //模式切換鍵</p><p> sbit Up= P3^1; //加法按鈕</p&
61、gt;<p> sbit Down = P3^2; //減法按鈕</p><p> sbit out = P3^3; //立刻跳出調整模式按鈕</p><p> sbit stop_watch=P3^4;</p><p> sbit b=P1^0;</p><p> char done,count
62、,temp,flag,up_flag,down_flag;</p><p> char settime_flag,stopwatch_flag,stopwatch_count=0;</p><p> uchar alarm_on=0;</p><p> uchar week_value[2];</p><p> uchar stop_
63、watch_value[]={' ','0','0',':','0','0',':','0','0',':','0','0','\0'};</p><p> uchar stralarm[]={'0
64、','0',':','0','0',':','0','0','\0',0x00};</p><p> uchar DateStr[3]={'0','0','\0'};</p><p> uchar ala
65、rm_flag[2]={'.','\0'};</p><p> ucharalarm_flag_sto[1]={0x0};</p><p> SYSTEMTIME CurrentTime;</p><p> uchar minite=0;</p><p> uchar second=0;</p&
66、gt;<p> uchar count_stop=0;</p><p> uchar iii;</p><p> void show_time(); //液晶顯示程序</p><p> void disp_alarm(void);</p><p> void gettime(void);</p>&l
67、t;p> void trasfer(void)</p><p> {stop_watch_value[4]=minite/10+0x30;</p><p> stop_watch_value[5]=minite%10+0x30;</p><p> stop_watch_value[7]=second/10+0x30;</p><p
68、> stop_watch_value[8]=second%10+0x30;</p><p> stop_watch_value[10]=count_stop/10+0x30;</p><p> stop_watch_value[11]=count_stop%10+0x30;</p><p><b> }</b></p>
69、<p> void Delay1ms(unsigned int count)</p><p><b> {</b></p><p> unsigned int i,j;</p><p> for(i=0;i<count;i++)</p><p> for(j=0;j<120;j++);
70、</p><p><b> }</b></p><p><b> /*延時子程序*/</b></p><p> void mdelay(uint delay)</p><p><b> {uint i;</b></p><p> for(;d
71、elay>0;delay--)</p><p> {for(i=0;i<62;i++) //1ms延時.</p><p><b> {;}</b></p><p><b> }</b></p><p><b> }</b></p><p&
72、gt; void bz(int co,int h,int l)</p><p><b> { int i;</b></p><p> for(i=1;i<=co;i++)</p><p><b> {b=1;</b></p><p> mdelay(h);</p>
73、<p><b> b=0;</b></p><p> mdelay(l);</p><p><b> }</b></p><p><b> }</b></p><p> void disp_alarm(void)</p><p>&l
74、t;b> {</b></p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> GotoXY(0, 0);</p><p> Print(alarm_flag);</p><p> GotoXY(4, 0);</p><
75、;p> Print(stralarm);</p><p> GotoXY(0, 1);</p><p> Print("-----Alarm-----");</p><p> Delay1ms(400);</p><p><b> }</b></p><p>
76、 void fz(void)</p><p><b> {int i;</b></p><p> if(alarm_on==1)</p><p><b> {</b></p><p> if(strncmp(CurrentTime.TimeString,stralarm,7)==0)<
77、;/p><p><b> {</b></p><p> for(i=0;i<20;i++)</p><p> {bz(100,1,1);</p><p> mdelay(200);</p><p> bz(100,1,1);</p><p> mdela
78、y(200);</p><p> mdelay(1000);</p><p> LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> GotoXY(0, 0);</p><p> Print("..Alarm.........");</p>
79、<p> GotoXY(0, 1);</p><p> Print(stralarm);</p><p> stopwatch_flag=1;</p><p> if(out==0)</p><p> {while(out==0);</p><p> alarm_on=0;</p>
80、<p><b> break;</b></p><p><b> }</b></p><p> gettime();</p><p><b> }</b></p><p><b> }</b></p><p>
81、<b> }</b></p><p> if((CurrentTime.TimeString[6]=='5')&&(CurrentTime.TimeString[7]=='9'))</p><p> alarm_on=alarm_flag_sto[0];</p><p><b>
82、 }</b></p><p> void disp_strstowatch(void)</p><p> { LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> GotoXY(0, 0);</p><p> Print("---Stopwatch-
83、---");</p><p> GotoXY(1, 1);</p><p> Print(stop_watch_value);</p><p> stopwatch_flag=1;</p><p> Delay1ms(200);</p><p><b> }</b></p
84、><p> void outkey() //跳出調整模式,返回默認顯示</p><p> { uchar Second;</p><p> if(out==0) </p><p> { mdelay(8); </p><p><b> count=0
85、;</b></p><p> hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_month=0,hide_year=0;</p><p> Second=Read1302(DS1302_SECOND);</p><p> Write1302(0x8e,0x00); //寫入允
86、許</p><p> Write1302(0x80,Second&0x7f);</p><p> Write1302(0x8E,0x80); //禁止寫入</p><p> done=0; </p><p> while(out==0);</p><p> set
87、time_flag=0;</p><p><b> }</b></p><p><b> }</b></p><p> ///////////////////////////////////////////////////////////////////////////////////////////////////
88、/////////</p><p> void Upkey()//升序按鍵</p><p><b> { </b></p><p><b> Up=1;</b></p><p><b> if(Up==0)</b></p><p><
89、b> {</b></p><p> mdelay(8);</p><p> switch(count)</p><p><b> {case 1:</b></p><p> temp=Read1302(DS1302_SECOND); //讀取秒數(shù)</p><p>
90、temp=temp+1; //秒數(shù)加1</p><p> up_flag=1; //數(shù)據(jù)調整后更新標志</p><p> if((temp&0x7f)>0x59) //超過59秒,清零</p><p> temp=0; </p><p><b> break;</b>&
91、lt;/p><p><b> case 2:</b></p><p> temp=Read1302(DS1302_MINUTE); //讀取分數(shù)</p><p> temp=temp+1; //分數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x
92、59) //超過59分,清零</p><p><b> temp=0;</b></p><p><b> break;</b></p><p><b> case 3:</b></p><p> temp=Read1302(DS1302_HOUR);
93、 //讀取小時數(shù)</p><p> temp=temp+1; //小時數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x23) //超過23小時,清零</p><p><b> temp=0;</b></p><p><b> b
94、reak;</b></p><p><b> case 4:</b></p><p> temp=Read1302(DS1302_WEEK); //讀取星期數(shù)</p><p> temp=temp+1; //星期數(shù)加1</p><p> up_flag=1;</p><p>
95、; if(temp>0x7) </p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302(DS1302_DAY); //讀
96、取日數(shù)</p><p> temp=temp+1; //日數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x31)</p><p><b> temp=1;</b></p><p><b> break;</b></
97、p><p><b> case 6:</b></p><p> temp=Read1302(DS1302_MONTH); //讀取月數(shù)</p><p> temp=temp+1; //月數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x12)&l
98、t;/p><p><b> temp=1;</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p&
99、gt; temp=temp+1; //年數(shù)加1</p><p> up_flag=1;</p><p> if(temp>0x85)</p><p><b> temp=0;</b></p><p><b> break;</b></p><p> def
100、ault:break;</p><p><b> }</b></p><p> while(Up==0);</p><p><b> }</b></p><p><b> }</b></p><p> /////////////////////
101、///////////////////////////////////////////////////////////////////////////////////////</p><p> void Downkey()//降序按鍵</p><p><b> { </b></p><p><b> Down=1;<
102、;/b></p><p> if(Down==0)</p><p><b> {</b></p><p> mdelay(8);</p><p> switch(count)</p><p><b> {case 1:</b></p><p
103、> temp=Read1302(DS1302_SECOND); //讀取秒數(shù)</p><p> temp=temp-1; //秒數(shù)減1</p><p> down_flag=1; //數(shù)據(jù)調整后更新標志</p><p> if(temp==0x7f) //小于0秒,返回59秒</p><p&g
104、t; temp=0x59;</p><p><b> break;</b></p><p><b> case 2:</b></p><p> temp=Read1302(DS1302_MINUTE); //讀取分數(shù)</p><p> temp=temp-1; //分數(shù)減1</p
105、><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x59; //小于0秒,返回59秒</p><p><b> break;</b></p><p><b> case 3:</b></p&g
106、t;<p> temp=Read1302(DS1302_HOUR); //讀取小時數(shù)</p><p> temp=temp-1; //小時數(shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x23;</p><p>&
107、lt;b> break;</b></p><p><b> case 4:</b></p><p> temp=Read1302(DS1302_WEEK); //讀取星期數(shù)</p><p> temp=temp-1; //星期數(shù)減1</p><p> down_flag=1;</p&
108、gt;<p> if(temp==0)</p><p> temp=0x7;;</p><p><b> break;</b></p><p><b> case 5:</b></p><p> temp=Read1302(DS1302_DAY); //讀取日數(shù)</p
109、><p> temp=temp-1; //日數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><p><b> temp=31;</b></p><p><b> break;</b></p><
110、p><b> case 6:</b></p><p> temp=Read1302(DS1302_MONTH); //讀取月數(shù)</p><p> temp=temp-1; //月數(shù)減1</p><p> down_flag=1;</p><p> if(temp==0)</p><
111、p><b> temp=12;</b></p><p><b> break;</b></p><p><b> case 7:</b></p><p> temp=Read1302(DS1302_YEAR); //讀取年數(shù)</p><p> temp=tem
112、p-1; //年數(shù)減1</p><p> down_flag=1;</p><p> if(temp==-1)</p><p> temp=0x85;</p><p><b> break;</b></p><p> default:break;</p><p>
113、;<b> }</b></p><p> while(Down==0);</p><p><b> }</b></p><p><b> }</b></p><p> void Setkey()//模式選擇按鍵</p><p><b>
114、; {</b></p><p><b> Set=1;</b></p><p><b> out=1;</b></p><p> stop_watch=1;</p><p> if(Set==0)</p><p><b> {</b&g
115、t;</p><p> mdelay(2);</p><p> count=count+1; //Setkey按一次,count就加1</p><p> done=1; //進入調整模式</p><p> while(Set==0);</p><p><b> }</b><
116、/p><p> if(stop_watch==0)</p><p><b> {</b></p><p> mdelay(8);</p><p><b> done=1;</b></p><p> stopwatch_flag=1;</p><p&g
117、t; while(stop_watch==0);</p><p> while(stopwatch_flag){</p><p> if(Set==0)</p><p> {while(Set==0);</p><p><b> TR0=1;</b></p><p><b&g
118、t; }</b></p><p> if(Up==0){</p><p> while(Up==0);</p><p><b> TR0=0;}</b></p><p> if(Down==0)</p><p> { while(Down==0);</p>
119、<p><b> minite=0;</b></p><p><b> second=0;</b></p><p> count_stop=0;</p><p> trasfer();</p><p><b> }</b></p><p&
120、gt; if(out==0)</p><p> { while(out==0);</p><p> stopwatch_flag=0;</p><p><b> done=0;</b></p><p><b> goto kip;</b></p><p><
121、b> }</b></p><p> trasfer();</p><p> disp_strstowatch();</p><p><b> }</b></p><p><b> }</b></p><p> kip: LCD_Write(LC
122、D_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p><b> }</b></p><p> void alarm(void)</p><p> {uchar alarm_tmph,alarm_tmpm,alarm_tmps;</p><p> while(1){<
123、/p><p> if(Set==0)</p><p> {while(Set==0);</p><p> alarm_tmph++;</p><p> if(alarm_tmph>=24)</p><p> alarm_tmph=0;</p><p> stralarm[0]=a
124、larm_tmph/10+0x30;</p><p> stralarm[1]=alarm_tmph%10+0x30;</p><p><b> }</b></p><p> if(Up==0){</p><p> while(Up==0);</p><p> alarm_tmpm++;
125、</p><p> if(alarm_tmpm>=60)</p><p> alarm_tmpm=0;</p><p> stralarm[3]=alarm_tmpm/10+0x30;</p><p> stralarm[4]=alarm_tmpm%10+0x30;</p><p><b>
126、}</b></p><p> if(Down==0)</p><p> { while(Down==0);</p><p> alarm_tmps++;</p><p> if(alarm_tmps>=60)</p><p> alarm_tmps=0;</p><p&
127、gt; stralarm[6]=alarm_tmps/10+0x30;</p><p> stralarm[7]=alarm_tmps%10+0x30;</p><p><b> }</b></p><p> if(out==0)</p><p> { while(out==0);</p>&l
128、t;p> stopwatch_flag=0;</p><p><b> done=0;</b></p><p> stop_watch=1;</p><p> goto kip2;</p><p><b> }</b></p><p> disp_alarm
129、();</p><p><b> }</b></p><p> kip2: LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏</p><p> stralarm[2]=':';</p><p> stralarm[5]=':';<
130、;/p><p> Write1302(0x8e,0x00); //寫入允許 </p><p> WriteRAM(0,stralarm,9);</p><p> Write1302(0x8e,0x80); //禁止寫入*/</p><p><b> }</b></p><p> vo
131、id keydone()//按鍵功能執(zhí)行</p><p> { uchar Second;</p><p> if(flag==0) //關閉時鐘,停止計時</p><p> { Write1302(0x8e,0x00); //寫入允許</p><p> temp=Read1302(0x80);</p>
132、<p> Write1302(0x80,temp|0x80);</p><p> Write1302(0x8e,0x80); //禁止寫入</p><p><b> flag=1;</b></p><p><b> }</b></p><p> Setkey();
133、 //掃描模式切換按鍵</p><p> switch(count)</p><p> {case 1:do //count=1,調整秒</p><p><b> {</b></p><p> outkey(); //掃描跳出按鈕</p><
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ds1302電子時鐘制作畢業(yè)設計
- 基于ds1302顯示時鐘硬件技術綜合課程設計
- 電子綜合課程設計——多功能數(shù)字電子時鐘
- 單片機課程設計--多功能電子時鐘
- 單片機課程設計---多功能電子時鐘設計
- 電子技術課程設計----多功能電子時鐘的設計
- 多功能電子時鐘設計
- ds1302
- 時鐘芯片ds1302中文資料
- ds1302教程
- 多功能電子時鐘課程項目設計方案
- 電子時鐘課程設計
- 電子時鐘 課程設計
- 電子時鐘課程設計
- 電子時鐘課程設計
- 課程設計--電子時鐘
- 實時時鐘模ds1302程序列子
- 電子畢業(yè)設計---多功能電子時鐘
- 電子時鐘課程設計--proteus環(huán)境下的電子時鐘設計
- 基于ds1302時鐘芯片數(shù)字鐘報告
評論
0/150
提交評論