版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 目 錄</b></p><p><b> 摘 要I</b></p><p><b> 1.0 緒論1</b></p><p> 1.1設計目的與意義……………………………………………………..3</p><p> 1.2.單元電路設計
2、4</p><p> 1.3時鐘震蕩電路設計3</p><p> 1.4復位電路設計5</p><p> 1.5DS1302時鐘電路5</p><p> 1.6 按鍵電路5</p><p> 2.1 程序流程8</p><p><b> 2.2軟件設計9<
3、/b></p><p> 2.3軟件調試10</p><p> 2.4結論與心得11</p><p> 2.5 參考文獻11</p><p><b> 參考文獻12</b></p><p> 附錄一元器件清單13</p><p> 附錄二 原理圖
4、14</p><p> 附錄三 仿真圖15</p><p> 附錄 四實物圖16</p><p><b> 主程序17</b></p><p><b> 設計題目:</b></p><p><b> 電子萬年歷</b></p>
5、;<p><b> 設計任務與要求:</b></p><p> 1、顯示年月日時分秒及星期信息</p><p> 2、具有可調整日期和時間功能</p><p> 3、增加閏年計算功能</p><p><b> 方案比較:</b></p><p> 方
6、案一:系統(tǒng)分為主控制器模塊、顯示模塊、按鍵開關模塊,主控制模塊采用AT89C52單片機為控制中心,顯示模塊采用普通的共陰LED數(shù)碼管,鍵輸入采用中斷實現(xiàn)功能調整,計時使用AT89C52單片機自帶的定時器功能,實現(xiàn)對時間、日期的操作,通過按鍵盤開關實現(xiàn)對時間、日期的調整。</p><p> 方案二:系統(tǒng)分為主控模塊、時鐘電路模塊、按鍵掃描模塊,LCD顯示模塊,電源電路、復位電路、晶振電路等模塊。主控模塊采用AT8
7、9C52單片機,按鍵模塊用四個按鍵,用于調整時間,顯示模塊采用LCD1602,時鐘電路模塊采用DS1302時鐘芯片實現(xiàn)對時間、日期的操作。</p><p> 兩個方案工作原理大致相同,只有顯示模塊和時鐘電路不同。LED數(shù)碼管價格適中,對于數(shù)字顯示效果較好,而且使用單片機的端口也較少; LCD1602液晶顯示屏,顯示功能強大,可以顯示大量文字、圖形,顯示多樣性,清晰可見,價格相對LED數(shù)碼管來說要昂貴些,但是基于
8、本設計顯示的東西較多,若采用LED數(shù)碼管的話,所需數(shù)碼管較多,而且不利于控制,因此選擇LCD1602作為顯示模塊。DS1302是一款高性能的實時時鐘芯片,以計時準確、接口簡單、使用方便、工作電壓范圍寬和低功耗等優(yōu)點,得到廣泛的應用,實時時鐘有秒、分、時、星期、日、月和年,月小于31天時可以自動調整,并具有閏年補償功能,而且在掉電時能夠在外部紐扣電池的供電下繼續(xù)工作。單片機有定時器的功能,但時間誤差較大,且需要編寫時鐘程序,因此采用DS1
9、302作為時鐘電路。</p><p> 對比以上方案,結合設計技術指標與要求我們選擇了方案二進行設計。</p><p><b> 邏輯總框圖:</b></p><p> 該電子萬年歷的總體設計框圖如圖(1)所示。</p><p><b> 單元電路設計:</b></p><
10、;p><b> 1、主控制系統(tǒng)</b></p><p> 單片機中央處理系統(tǒng)的方案設計,選用AT89C52單片機作為中央處理器,如圖(2)所示。該單片機除了擁有MCS-51系列單片機的所有優(yōu)點外,內部還具有8K的在系統(tǒng)可編程FLASH存儲器,低功耗的空閑和掉電模式,極大的降低了電路的功耗,還包含了定時器、程序存儲器、數(shù)據(jù)存儲器等硬件,其硬件能符合整個控制系統(tǒng)的要求,不需要外接其他存
11、儲器芯片和定時器件,方便地構成一個最小系統(tǒng)。整個系統(tǒng)結構緊湊,抗干擾能力強,性價比高。</p><p><b> 2、時鐘振蕩電路</b></p><p> 時鐘振蕩電路圖(3)所示,時鐘振蕩電路用于產生單片機正常工作時所需要的時鐘信號,電路由兩個30pF的瓷片電容和一個12MHz的晶振組成,并接入到單片機的XTAL1和XTAL2引腳處,使單片機工作于內部振蕩模式
12、。此電路在加電后延遲大約10ms振蕩器起振,在XTAL2引腳產生幅度為3V左右的正弦波時鐘信號,其振蕩頻率主要由石英晶振的頻率決定。電路中兩個電容C1、C2的作用使電路快速起振,提高電路的運行速度。</p><p> 圖(3) 時鐘振蕩電路圖 圖(4) 復位電路</p><p><b> 3、復位電路</b></p>
13、<p> 復位電路由電阻和極性電容組成,如圖(4)所示,通過高電平使單片機復位,在時鐘電路開始工作后,當高電平的時間超過大約2us時,即可實現(xiàn)復位。此復位電路為上電復位,較為簡單。若改進可以添加手動復位的功能,上電復位發(fā)生在開機加電時,由系統(tǒng)自動完成,手動復位通過一個按鍵來實現(xiàn),在程序運行時,若遇到死機,死循環(huán)或程序“跑飛”等情況,通過手動復位就可以實現(xiàn)重新啟動的操作。手動按鈕復位需要人為在復位輸入端RST上加入高電平。一般
14、采用的辦法是在RST端和正電源Vcc之間接一個按鈕和一個電阻。 </p><p> 4、DS1302時鐘電路</p><p> 時鐘電路主要由時鐘芯片DS1302、備用電池、晶振等幾部分組成,如圖(6)所示。DS1302采用3線串行接口,占用引腳少,內部集成了可編程日歷時鐘,用戶可以根據(jù)需要通過單片機的控制來自行設置,支持雙電源供電,可以使用外部主電源和備用電源,備份電元能夠使時鐘芯片
15、繼續(xù)工作。</p><p> 圖(6) DS1302時鐘電路</p><p> DS1302各引腳的功能為:</p><p> 圖(5) DS1302管腳圖 </p><p> 8: Vcc1:備用電池端;</p><p> 1: Vcc2:5V電源。當Vcc2>Vc
16、c1+0.2V時,由Vcc2向DS1302供電,當Vcc2< Vcc1時,由Vcc1向DS1302供電;</p><p> 7: SCLK:串行時鐘,輸入; </p><p> 6: I/O:數(shù)據(jù)輸入輸出口;</p><p> 5: CE/RST:復位腳;</p><p> 2、3: X1、X2 是外接晶振腳
17、(32.768KHZ的晶振);</p><p> 4: 地(GND)。</p><p> DS1302有關日歷、時間的寄存器:</p><p> 圖(7)DS1302有關日歷、時間的寄存器</p><p> 1、秒寄存器(81h、80h)的位7定義為時鐘暫停標志(CH)。當初始上電時該位置為1,時鐘振蕩器停止,DS1302處于低功耗
18、狀態(tài);只有將秒寄器的該位置改寫為0時,時鐘才能開始運行。</p><p> 2、小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當為高時,選擇12小時模式。在12小時模式時,位5是 ,當為1時,表示PM。在24小時模式時,位5是第二個10小時位</p><p> 3、控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在對
19、任何的時鐘和RAM的寫操作之前,WP位必須為0。當WP位為1時,寫保護位防止對任一寄存器的寫操作。也就是說在電路上電的初始態(tài)WP是1,這時是不能改寫上面任何一個時間寄存器的,只有首先將WP改寫為0,才能進行其它寄存器的寫操作。</p><p> DS1302讀寫時序 </p><p> DS1302是SPI總線驅動方式。它不僅要向寄存器寫入控制字,還需要讀取相應寄存器的數(shù)據(jù)。DS130
20、2的控制字如圖(8):</p><p> 圖(8)DS1302的控制字圖</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);</p><p> 位5至位1(A4~A0):指示操作單元的地址;<
21、/p><p> 位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p><b> 讀數(shù)據(jù):</b></p><p> 讀數(shù)據(jù)時在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的數(shù)據(jù)是從最低位到最高位。</p><p><b> 寫數(shù)據(jù):</
22、b></p><p> 控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入也是從最低位(0位)開始。</p><p><b> 5、按鍵電路</b></p><p> 按鍵電路由四個輕觸開關組成,如圖(9)所示。按鍵用來調整時間,其一端直接接到單片機的端口,另一端接地,當按
23、下按鍵時,相應的端口變?yōu)榈碗娖?,通過一個與門只要這四個按鍵有一個按下就會在P3.2檢測到一低電平就觸發(fā)外部中斷0進入按鍵調節(jié)程序中,通過與個各鍵相連的端口P3.4_P3.7可以判斷是哪個鍵按下,從而作相應的操作。</p><p> 圖(9) 按鍵電路</p><p><b> 6、顯示電路</b></p><p> 1602液晶也叫16
24、02字符型液晶 它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊 它有若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符。顯示電路采用LCD1602液晶顯示,如圖(10)所示,圖中只畫出了其相應的接口,3腳用于調節(jié)LCD1602的背光,4、5、6為LCD1602的控制口,用于控制其寫入或是讀出指令,7至14腳為LCD1602的數(shù)據(jù)口,將數(shù)傳送到LCD1602中。</p><p>
25、圖(10) LCD1602顯示電路</p><p> LCD1602的特性</p><p> +5V電壓,對比度可調;</p><p><b> 內含復位電路;</b></p><p> 提供各種控制命令,如:清屏、字符閃爍、光標閃爍、顯示移位等多種功能;</p><p> 有80字節(jié)
26、顯示數(shù)據(jù)存儲器DDRAM;</p><p> 內建有160個5X7點陣的字型的字符發(fā)生器CGROM,8個可由用戶自定義的5X7的字符發(fā)生器CGRAM;</p><p><b> 基本操作時序: </b></p><p> 讀狀態(tài):輸入:RS=L,RW=H,E=H;輸出:DB0~DB7=狀態(tài)字 ;</p><p>
27、 寫指令:輸入:RS=L,RW=L,E=下降沿脈沖,DB0~DB7=指令碼 ;輸出:無。</p><p> 讀數(shù)據(jù):輸入:RS=H,RW=H,E=H;輸出:DB0~DB7=數(shù)據(jù) ;</p><p> 寫數(shù)據(jù):輸入:RS=H,RW=L,E=下降沿脈沖,DB0~DB7=數(shù)據(jù) ;輸出:無。</p><p> LCD1602的各種指令不再一一說明。</p>
28、<p><b> 流程圖與軟件設計:</b></p><p><b> 1、程序流程圖</b></p><p> 主程序首先初始化定時器、LCD1602及DS1302,然后就開始查詢按鍵,有鍵按下則開始調整時間和日期,若沒有按下,則執(zhí)行下面的時間、日期的顯示,最后依次循環(huán)這些相同的操作,相應流程圖如圖(11)所示:</p
29、><p> 圖(12)程序流程圖</p><p> 按鍵的檢測是通過中斷的辦法來實現(xiàn),利用按鍵進行間調整。 K1按下則開始設置時間及日期,同時在第一行最右端顯示被選擇的對象,第一次按下K1時,設置年份,若按下K3,則是減1操作,按下K2是加1操作,設置好年后,第二次按下K1時,則是設置月份,按K3減,按K2則加1,依次循環(huán)下去,則可以將時間和日期設置完畢,K4是確定鍵,設置好按下即可保存設
30、置了。</p><p><b> 2、軟件設計</b></p><p> 軟件總設計:主程序首先對系統(tǒng)環(huán)境初始化,設置定時器T0工作模式為16位定時/計數(shù)器模式,置位總中斷允許位EA,并對鍵盤端口置位,再對LCD1602初始化,DS1302初始化。接著掃描鍵盤,在鍵盤程序里面是對時間、日期及鬧鐘的調整,最下面是時間的顯示。</p><p>
31、 軟件程序編寫:軟件程序編寫的好壞直接影響著系統(tǒng)運行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設計,C語言具有編寫靈活、移植方便、便于模塊化設計的特點,所以本系統(tǒng)的軟件采用C51編寫。</p><p> 具體程序見附件一:程序</p><p><b> 3、軟件調試</b></p><p> 在軟件調試過程中,當調節(jié)時
32、間和日期后,單片機上電后更新的是PC的時間,后來查找資料發(fā)現(xiàn),是設置ds1302的問題, </p><p> 對于開發(fā)板上的液晶一般RW都接的地,故不需要讀液晶狀態(tài),也不需要讀忙,但在仿真中還是加上了這一部分。</p><p> 還有一個問題,在按鍵操作時有時會出現(xiàn)功能不穩(wěn)定,這是由于按鍵存在抖動,所以后來加個去抖動的延時后在判斷,基本就可以解決問題,</p><p
33、><b> 結論與心得:</b></p><p> 在這學期的課程序設計中,收獲知識的同時,還收獲了閱歷,收獲了成熟,通過查找大量資料,請教老師,以及不懈的努力,不僅培養(yǎng)了獨立思考、 動手制作的能力,在各種其它能力上也都有了提高。更重要的是,在課程序設計里,我們學會了很多學習的方法,知道了理論和實踐的巨大差別。而這是以后最實用的,真的是受益匪淺。要面 對社會的挑戰(zhàn),只有不斷的學習、
34、實踐,再學習、再實踐。同時在與老師和同學的交流過程中,互動學習,將知識融會貫通。通過自己的努力,做出了一個萬年歷,對以后的學習是一個莫大的鼓舞,激起了我的學習興趣和開發(fā)創(chuàng)新思維。</p><p><b> 參考文獻</b></p><p> 圖書類:[1] 張毅坤 陳善久, 單片微型計算機原理及應用 西安電子科技大學出版社</p><p>
35、 [2] 張毅剛,,彭喜元,單片機原理與應用設計 電子工業(yè)出版社</p><p> [3] 趙建領 薛園園 ,零基礎學單片機C語言程序設計 機械工業(yè)出版社</p><p> [4] 周向紅 51單片機課程設計 華中科技大學出版社, </p><p> [5] 郭天祥 51單片機C語言教程-入門,提高,開發(fā),拓展全攻略, 電子工業(yè)出版社</p>
36、<p> [6] 趙亮 侯國銳. 單片機C語言編程與實例 人民郵電出版社</p><p><b> 三 附頁</b></p><p><b> 需要器件</b></p><p><b> 裝配圖</b></p><p><b> 仿真測試圖
37、</b></p><p><b> 實物圖</b></p><p><b> 實驗主程序:</b></p><p> #include <reg51.h></p><p> #include <intrins.h></p><p>
38、 #include <string.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> sbit IO= P1^0; //DS1302數(shù)據(jù)線</p><p> sbit SCLK = P1^1;
39、 //DS130時鐘線</p><p> sbit RST = P1^2; //DS1302復位線</p><p> sbit RS = P2^0; //LCD數(shù)據(jù)/命令選擇端</p><p> sbit RW = P2^1; //LCD讀/寫控制</p><p> sbit EN = P2^2; //LCD使能端&l
40、t;/p><p> sbit K1=P2^4;//選擇</p><p> sbit K2=P2^5;//加</p><p> sbit K3=P2^6;//減</p><p> sbit K4=P2^7; //確定</p><p> uchar tCount=0;</p><
41、;p> uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};</p><p> uchar *WEEK[]={"SUN","MON","TUS","WEN","THU","FRI","SAT"};<
42、;/p><p> uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "}; //顯示格式</p><p> uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};</p><p> uchar DateTime[7]; //所讀取的日期時間</p
43、><p> char Adjust_Index=-1; //當前調節(jié)的時間對象:,,分,是,日,月,年(1,2,3,4,6)</p><p> uchar Change_Flag[]= "-MHDM-Y"; //(分,時,日,月,年)(不調節(jié)秒與周)</p><p> /*---------延時程序------------------*/&
44、lt;/p><p> void DelayMS(uint ms)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> while(ms--){for(i=0;i<120;i++);}</p><p><b
45、> }</b></p><p> //-----------向DS1302寫入一字節(jié)------------------//</p><p> void Write_A_Byte_TO_DS1302(uchar x)</p><p> {uchar i;</p><p> for(i=0;i<8;i++){
46、</p><p> IO=x&0x01; //每一位與1與存入IO中</p><p> SCLK=1;SCLK=0;//一個高脈沖將數(shù)據(jù)送入液晶控制器</p><p> x>>=1; // 右移</p><p><b> }</b></p><p>&
47、lt;b> }</b></p><p> //-----------從DS1302讀取一字節(jié)------------------//</p><p> uchar Get_A_Byte_FROM_DS1302()</p><p> {uchar i,b=0x00;</p><p> for(i=0;i<8;
48、i++){</p><p> b |= _crol_((uchar)IO,i);</p><p> SCLK=1;SCLK=0; //每一個高脈沖讀取一位數(shù)據(jù)</p><p><b> }</b></p><p> return b/16*10+b%16; //返回BCD碼</p><p
49、><b> }</b></p><p> //-----------從DS1302指定位置讀數(shù)據(jù)------------------//</p><p> uchar Read_Data(uchar addr)</p><p><b> {</b></p><p> uchar da
50、t;</p><p> RST = 0;SCLK=0;RST=1; //RST高電平時讀/寫</p><p> Write_A_Byte_TO_DS1302(addr); //先寫入地址</p><p> dat = Get_A_Byte_FROM_DS1302();</p><p> SCLK=1;RST=0;</p&
51、gt;<p> return dat;</p><p><b> }</b></p><p> //---------向DS1302某地址寫入數(shù)據(jù)--------------------//</p><p> void Write_DS1302(uchar addr,uchar dat)</p><p&
52、gt; {SCLK=0;RST=1;</p><p> Write_A_Byte_TO_DS1302(addr);</p><p> Write_A_Byte_TO_DS1302(dat);</p><p> SCLK=0;RST=0; //高脈沖寫入數(shù)據(jù)</p><p><b> }</b></p
53、><p> //--------------設置時間----------------//</p><p> void SET_DS1302()</p><p> {uchar i;</p><p> //寫控制字,取消寫保護</p><p> Write_DS1302(0x8E,0x00);</p>
54、<p> //分時日月年依次寫入</p><p> for(i=1;i<7;i++)</p><p> { //分的起始地址10000010(0x82),后面依次是時,日,月,周,年,寫入地址每次遞增2</p><p> Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[
55、i]%10));</p><p><b> } </b></p><p> Write_DS1302(0x8E,0x80); //加保護</p><p><b> }</b></p><p> //----------讀取當前日期時間------------//</p>&l
56、t;p> void GetTime()</p><p><b> {uchar i;</b></p><p> for(i=0;i<7;i++){DateTime[i]=Read_Data(0X81+2*i);}</p><p><b> }</b></p><p> //-
57、----------讀LCD狀態(tài)------------------//</p><p> uchar Read_LCD_State()</p><p> {uchar state;</p><p> RS=0;RW=1;EN=1; //輸出:D0~D7=狀態(tài)字</p><p> DelayMS(1);</p>&l
58、t;p> state=P0; //從P0口讀LCD狀態(tài)</p><p> EN = 0;DelayMS(1);</p><p> return state;</p><p><b> }</b></p><p> //-----------忙等待------------------//</p&
59、gt;<p> void LCD_Busy_Wait()</p><p><b> {</b></p><p> while((Read_LCD_State()&0x80)==0x80);</p><p> DelayMS(5);</p><p><b> }</b>
60、;</p><p> //-----------向LCD寫數(shù)據(jù)------------------//</p><p> void Write_LCD_Data(uchar dat)</p><p><b> {</b></p><p> LCD_Busy_Wait();</p><p>
61、 RS=1;EN=0;RW=0; //寫數(shù)據(jù),EN為高脈沖,</p><p> P0=dat;EN=1;DelayMS(1);EN=0;</p><p><b> }</b></p><p> //-------------寫LCD指令-------------------//</p><p> void
62、 Write_LCD_Command(uchar cmd)</p><p><b> {</b></p><p> LCD_Busy_Wait();</p><p> RS=0;EN=0;RW=0; //寫指令,EN高脈沖,輸出:D0~D7=數(shù)據(jù)</p><p> P0=cmd;EN=1;DelayMS(1);
63、EN=0;</p><p><b> }</b></p><p> //-------------LCD初始化-------------------//</p><p> void Init_LCD()</p><p><b> {</b></p><p> Wr
64、ite_LCD_Command(0x38); //設置16*2顯示,5*7點陣,8位數(shù)據(jù)接口</p><p> DelayMS(1);</p><p> Write_LCD_Command(0x01); //顯示清零,數(shù)據(jù)指針清零</p><p> DelayMS(1);</p><p> Write_LCD_Command(
65、0x06); //寫一個字符后地址指針自動加1</p><p> DelayMS(1);</p><p> Write_LCD_Command(0x0c); //設置開顯示,不顯示光標</p><p> DelayMS(1);</p><p><b> }</b></p><p>
66、; //------------------------------------------</p><p> //設置液晶顯示位置</p><p> //------------------------------------------</p><p> void Set_LCD_POS(uchar p){</p><p> W
67、rite_LCD_Command(p|0x80);//相當于在0x80基礎上加入位置量</p><p><b> }</b></p><p> //----在LCD上顯示字符串---------//</p><p> void Display_LCD_String(uchar p,uchar *s)</p><p&g
68、t; {uchar i;</p><p> Set_LCD_POS(p);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> Write_LCD_Data(s[i]); //在固定位置顯示時間日期</p><p>
69、 DelayMS(1);</p><p><b> }</b></p><p><b> }</b></p><p> //---------日期與時間值轉換為數(shù)字字符----------------//</p><p> void Format_DateTime(uchar d,uchar
70、 *a)</p><p><b> {</b></p><p> a[0]=d/10+'0';</p><p> a[1]=d%10+'0';</p><p><b> }</b></p><p><b> //判斷是否為閏
71、年</b></p><p> uchar isLeapYear(uint y)</p><p> {return (y%4==0&&y%100!=0)||(y%400==0);}</p><p> //求自2000.1.1開始的任何一天是星期幾</p><p> //函數(shù)沒有通過,求出總天數(shù)后再求星期幾&
72、lt;/p><p> //因為求總天數(shù)可能會超出uint的范圍</p><p> void RefreshWeekDay()</p><p> {uint i,d,w=5; //已知1999.12.31是周五</p><p> for(i=2000;i<2000+DateTime[6];i++)</p><p
73、><b> {</b></p><p> d=isLeapYear(i)?366:365;</p><p> w=(w+d)%7;</p><p><b> }</b></p><p><b> d=0;</b></p><p> fo
74、r(i=1;i<DateTime[4];i++)</p><p> {d+=MonthsDays[i];}</p><p> d+=DateTime[3];</p><p> //保存星期,0~6表示星期日,星期一,二,...,六,為了與DS1302的星期格式匹配,返回值需要加1</p><p> DateTime[5]=(
75、w+d)%7+1;</p><p><b> }</b></p><p> //*****年月日時分++/--********//</p><p> void DateTime_Adjust(char x)</p><p> {switch(Adjust_Index)</p><p>
76、<b> {</b></p><p> case 6: //年00-99</p><p> if(x==1&&DateTime[6]<99) DateTime[6]++;</p><p> if(x==-1&&DateTime[6]>0) DateTime[6]--;</p>
77、<p><b> //獲取2月天數(shù)</b></p><p> MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;</p><p> //如果年份變化后當前月份的天數(shù)大于上限則設為上限</p><p> if(DateTime[3]>MonthsDays[DateTime[
78、4]])</p><p> {DateTime[3]=MonthsDays[DateTime[4]];}</p><p> RefreshWeekDay(); //刷新星期</p><p><b> break;</b></p><p> case 4: //月01-12</p><p&
79、gt; if(x==1&&DateTime[4]<12) DateTime[4]++;</p><p> if(x==-1&&DateTime[4]>1) DateTime[4]--;</p><p> MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;</p><p>
80、; if(DateTime[3]>MonthsDays[DateTime[4]])</p><p> {DateTime[3]=MonthsDays[DateTime[4]];}</p><p> RefreshWeekDay();</p><p><b> break;</b></p><p> ca
81、se 3: //日00-28、29、30、31,調節(jié)之前首先根據(jù)年份得出該年中斷二月 天數(shù)</p><p> MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;</p><p> //根據(jù)當前月份決定調節(jié)日期的上限</p><p> if(x==1&&DateTime[3]<Months
82、Days[DateTime[4]]) DateTime[3]++;</p><p> if(x==-1&&DateTime[3]>0) DateTime[3]--;</p><p> RefreshWeekDay();</p><p><b> break;</b></p><p> cas
83、e 2: //時</p><p> if(x==1&&DateTime[2]<23) DateTime[2]++;</p><p> if(x==-1&&DateTime[2]>0) DateTime[2]--;</p><p><b> break;</b></p><
84、;p> case 1://分</p><p> if(x==1&&DateTime[1]<59) DateTime[1]++;</p><p> if(x==-1&&DateTime[1]>0) DateTime[1]--;</p><p><b> break;</b></p
85、><p><b> }</b></p><p><b> }</b></p><p> //---定時器0每秒刷新LCD顯示----//</p><p> void T0_INT() interrupt 1</p><p><b> {</b>&l
86、t;/p><p> TH0=-50000/256;</p><p> TL0=-50000%256;</p><p> if(++tCount !=2)return;</p><p><b> tCount=0;</b></p><p> //按指定格式生成待顯示的日期時間串</p&
87、gt;<p> Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);</p><p> Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);</p><p> Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);</p><
88、p><b> //星期</b></p><p> strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]-1]);</p><p><b> //時分秒</b></p><p> Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);<
89、;/p><p> Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);</p><p> Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);</p><p> //顯示年月日,星期,時分秒</p><p> Display_LCD_String(0x0
90、0,LCD_DSY_BUFFER1);</p><p> Display_LCD_String(0x40,LCD_DSY_BUFFER2);</p><p><b> }</b></p><p> //----------鍵盤中斷(INT0)-------------//</p><p> void EX_INT
91、0() interrupt 0</p><p><b> {</b></p><p> if(K1==0) //選擇調整對象(Y M D H M)</p><p><b> {</b></p><p> DelayMS(10);</p><p> if(K1=
92、=0){ </p><p> //while(K1==0);</p><p> if(Adjust_Index==-1||Adjust_Index==1)</p><p><b> {</b></p><p> Adjust_Index=7;</p><p><b> }
93、</b></p><p> Adjust_Index--;</p><p> if(Adjust_Index==5) Adjust_Index=4;</p><p> LCD_DSY_BUFFER2[13]='[';</p><p> LCD_DSY_BUFFER2[14]=Change_Flag[Adju
94、st_Index]; //顯示調節(jié)對象</p><p> LCD_DSY_BUFFER2[15]=']';</p><p><b> }</b></p><p><b> }</b></p><p> else if(K2==0) //加</p><
95、;p> {//while(K2==0);</p><p> DelayMS(10);</p><p><b> if(K2==0)</b></p><p> DateTime_Adjust(1);</p><p><b> }</b></p><p> e
96、lse if(K3==0) //減</p><p><b> {</b></p><p> DelayMS(10);//while(K3==0);</p><p><b> if(K3==0)</b></p><p> DateTime_Adjust(-1);</p>&
97、lt;p><b> }</b></p><p> else if(K4==0) //確定</p><p><b> {</b></p><p> //while(K4==0);</p><p> DelayMS(10);</p><p> if(K
98、4==0){</p><p> SET_DS1302(); //將調整后的時間寫入DS1302</p><p> LCD_DSY_BUFFER2[13]=' ';</p><p> LCD_DSY_BUFFER2[14]=' ';</p><p> LCD_DSY_BUFFER2[15]='
99、; ';</p><p> Adjust_Index=-1;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void main()</p>
100、<p> {Init_LCD();//液晶初始化</p><p> IE=0x83; //允許INT0,T0中斷,EA=1,,ET0=1,EX0=1</p><p> IP=0x01; //設置外部中斷0為高級中斷</p><p> IT0=0x01; //外部中斷0為電平觸發(fā),低電平有效</p><
101、p> TMOD=0x01; //設置定時器T0工作方式為方式1,</p><p> TH0=-50000/256;//裝入初始值,定時1秒</p><p> TL0=-50000%256;</p><p> TR0=1; //啟動定時器</p><p><b> while(1)</b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論