

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 題 目</b></p><p> 基于單片機的萬年歷設(shè)計</p><p><b> 學(xué)號:</b></p><p><b> 姓名: </b></p><p> 日期:2015.12.28</p><p>
2、<b> 摘 要</b></p><p> 單片機就是微控制器,是面向應(yīng)用對象設(shè)計、突出控制功能的芯片。單片機接上晶振、復(fù)位電路和相應(yīng)的接口電路,裝載軟件后就可以構(gòu)成單片機應(yīng)用系統(tǒng)。本設(shè)計就是應(yīng)用單片機強大的控制功能制作而成的電子萬年歷,該電子萬年歷包括三大功能:實時顯示年、月、日、星期、時、分、秒;</p><p> 計時芯片采用DALLAS公司的涓細充電
3、時鐘芯片DS1302,該芯片通過簡單的串行通信與單片機進行通信,時鐘/日歷電路能夠?qū)崟r提供年、月、日、時分、秒信息,采用雙電源供電,當(dāng)外部電源掉電時能夠利用后備電池準確計時。</p><p> 顯示器件采用通用型1602液晶,可顯示32個字符,如果使用數(shù)碼管來做顯示器件需消耗大量的系統(tǒng)資源,因此采用低功耗的1602液晶,該液晶顯示方便,功能強大,完全能滿足數(shù)字萬年歷的顯示要求。</p><p
4、> 通過此次設(shè)計能夠更加牢固的掌握單片機的應(yīng)用技術(shù),增強動手能力、硬件設(shè)計能力以及軟件設(shè)計能力。</p><p> 關(guān)鍵詞:AT89C51、1602液晶、DS1302、萬年歷</p><p><b> 目 錄</b></p><p><b> 第1章 緒論5</b></p><p>
5、 1.1選題的背景5</p><p> 1.2課題的研究目的與意義5</p><p> 第2 章 總體方案論證與設(shè)計6</p><p> 2.1液晶顯示模塊6</p><p> 2.2實時時間計算模塊6</p><p><b> 2.3設(shè)置模塊6</b></p>
6、<p> 第3章 系統(tǒng)硬件設(shè)計8</p><p> 3.1LCD顯示模塊設(shè)計8</p><p> 3.2時間計算模塊設(shè)計9</p><p> 3.3設(shè)置模塊12</p><p> 3.4硬件電路設(shè)計13</p><p> 第4章 系統(tǒng)軟件設(shè)計14</p><p&
7、gt; 4.1程序框圖如下:14</p><p> 第5章 系統(tǒng)硬件PROTEUS仿真原理圖15</p><p> 5.1顯示實時時間15</p><p> 5.2時間設(shè)置15</p><p> 5.3星期設(shè)置16</p><p> 5.4年月日設(shè)置16</p><p>
8、<b> 5.5原理圖17</b></p><p><b> 結(jié)論18</b></p><p><b> 參考文獻19</b></p><p><b> 附錄一20</b></p><p><b> 源程序20</b&g
9、t;</p><p><b> 第1章 緒論</b></p><p><b> 1.1選題的背景</b></p><p> 隨著科技的快速發(fā)展,時間的流逝,從觀太陽、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀錄。它可以對年、月、日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能,而且DS1302的使用壽命長,誤差小。對
10、于數(shù)字電子萬年歷采用直觀的數(shù)字顯示,可以同時顯示年、月、日、時、分、秒等信息,還具有時間校準等功能。該電路采用AT89C51單片機作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。 </p><p> 此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,符合電子儀器儀表的發(fā)展趨勢,具有廣闊的市場前景。 </p><p> 1.2課題的研究目的
11、與意義 </p><p> 二十一世紀是數(shù)字化技術(shù)高速發(fā)展的時代,而單片機在數(shù)字化高速發(fā)展的時代扮演著極為重要的角色。電子萬年歷的開發(fā)與研究在信息化時代的今天亦是當(dāng)務(wù)之急,因為它應(yīng)用在學(xué)校、機關(guān)、企業(yè)、部隊等單位禮堂、訓(xùn)練場地、教學(xué)室、公共場地等場合,可以說遍及人們生活的每一個角落。由于社會對信息交換不斷提高的要求及高新技術(shù)的逐步發(fā)展,促使電子萬年歷發(fā)展并且投入市場得到廣泛應(yīng)用。</p>&l
12、t;p> 第2 章 總體方案論證與設(shè)計</p><p> 本系統(tǒng)以AT89C51單片機為控制核心,通過與DS1302和DS18B20通信獲取實時時間和實時環(huán)境溫度,并將得到的數(shù)據(jù)通過1602液晶顯示出來,同時通過相應(yīng)的按鍵調(diào)整相應(yīng)的值。因此本設(shè)計可分為一下模塊:顯示模塊、實時時間計</p><p> 算模塊、設(shè)置模塊(時間設(shè)置模塊)下面對各個模塊逐一進行論證分析:</p&
13、gt;<p><b> 2.1液晶顯示模塊</b></p><p><b> 方案一:</b></p><p> 數(shù)碼管是利用發(fā)光二極管的特性組合而成數(shù)字顯示器件,通過控制相應(yīng)的二極管的狀態(tài)顯示相應(yīng)的數(shù)字。要使數(shù)碼管正常顯示就得有驅(qū)動電路驅(qū)動相應(yīng)的段碼,數(shù)碼管的現(xiàn)實方式可分為靜態(tài)顯示和動態(tài)顯示,靜態(tài)顯示方式只適合顯示單個的數(shù)字
14、,因此本設(shè)計應(yīng)采用動態(tài)顯示方式。由于動態(tài)顯示方式利用的是人眼視覺暫留的特性,掃描的時間應(yīng)不大于20毫秒,占用系統(tǒng)資源大,而且顯示的個數(shù)和字型有限,在本設(shè)計中不易采用。</p><p><b> 方案二:</b></p><p> 1602液晶也叫1602字符型液晶 它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊 它有若干個5X7或者5X11等點陣字符位組成
15、,每個點陣字符位都可以顯示一個字符。每位之間有一個點距的間隔,每行之間也有也有間隔,起到了字符間距和行間距的作用。1602的驅(qū)動電路帶有11條指令,可以很方便的控制液晶的現(xiàn)實效果如:清屏、左移右移、光標顯示。而且1602顯示的字符在下一條指令為到來之前不會改變,也就是能夠維持顯示的字符,1602液晶占用的系統(tǒng)資源也少。綜合比較上述兩種方案,應(yīng)采用1602液晶組成本設(shè)計的顯示模塊。</p><p> 2.2實時時
16、間計算模塊</p><p><b> 方案一:</b></p><p> AT89C51單片機內(nèi)部帶有定時/計數(shù)功能,此定時功能是通過對外部晶振的脈沖進行計數(shù),從而達到計時功能,只要使用11.0592的晶振就能實現(xiàn)零誤差的計時,因此可以利用此功能實現(xiàn)計時,但因為只有單一的計時功能要實現(xiàn)“萬年歷”的功能需要較復(fù)雜的程序,而且如果單片機掉電無法繼續(xù)進行計時,所以使用不
17、便。</p><p><b> 方案二:</b></p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達
18、2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。利用單片機強大的控制功能就可實現(xiàn)實時計時的功能,而且消耗的系統(tǒng)資源少,程序簡單。綜合上述兩種方案,宜采用方案(2)實現(xiàn)實時計時功能。</p><p><b> 2.3設(shè)置模塊</b></p><p> 因設(shè)置模塊只需編寫相應(yīng)的程序外加相應(yīng)的按鍵即可
19、實現(xiàn),實現(xiàn)方法較簡單,在此不再論述。</p><p><b> 總體方案組成框圖</b></p><p> 第3章 系統(tǒng)硬件設(shè)計</p><p> 3.1LCD顯示模塊設(shè)計</p><p> ?。?)、1602液晶功耗較小可直接與單片機接口相接,電源直接與電源電路相接,使用單片機的P0口和P1口與1602進行通信。
20、</p><p> ?。?)、1602相應(yīng)功能特性介紹</p><p> +5V電壓,對比度可調(diào)</p><p><b> 內(nèi)含復(fù)位電路</b></p><p> 提供各種控制命令,如:清屏、字符閃爍、光標閃爍、顯示移位等多種功能</p><p> 有80字節(jié)顯示數(shù)據(jù)存儲器DDRAM<
21、;/p><p> 內(nèi)建有160個5X7點陣的字型的字符發(fā)生器CGROM</p><p> 8個可由用戶自定義的5X7的字符發(fā)生器CGRAM</p><p> ?。?)、1602引腳介紹</p><p> (4)、1602液晶與單片機接口電路</p><p> 3.2時間計算模塊設(shè)計</p><p
22、> DS1302通過三根口線實現(xiàn)與單片機的通信,因DS1302功耗很小,即使電源掉電后通過3V的紐扣電池仍能維持DS1302精確走時。</p><p> ?。?)DS1302特性介紹</p><p> DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和R
23、AM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小與31天時可以自動調(diào)整,且具有閏年補償功能。工作電壓寬達2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。</p><p> ?。?)DS1302引腳介紹</p><p><b> 各引腳的功能為:</b></p><
24、p> 8 、Vcc1:備用電池端;</p><p> 1、Vcc2:5V電源。當(dāng)Vcc2>Vcc1+0.2V時,由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時,由Vcc1向DS1302供電。</p><p> 7、 SCLK:串行時鐘,輸入; </p><p> 6、I/O:數(shù)據(jù)輸入輸出口;</p><
25、;p> 5、CE/RST:復(fù)位腳</p><p> 2 3、X1、X2 是外接晶振腳 (32.768KHZ的晶振)</p><p><b> 4、地(GND)</b></p><p> ?。?)DS1302有關(guān)日歷、時間的寄存器 </p><p> 寄存器的說明如下:1、秒寄存器(81h、80h)的位
26、7定義為時鐘暫停標志(CH)。當(dāng)初始上電時該位置為1,</p><p> 時鐘振蕩器停止,DS1302處于低功耗狀態(tài);只有將秒寄存器的該位置改寫為0時,時鐘才能開</p><p> 始運行。2、小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式。當(dāng)為</p><p> 高時,選擇12小時模式。在12小時模式時,位5是
27、,當(dāng)為1時,表示PM。在24小時模式時,</p><p> 位5是第二個10小時位3、控制寄存器(8Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在對任何的時鐘和</p><p> RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時,寫保護位防止對任一寄存器的寫操作。</p><p> 也就是說在電路上電的初始態(tài)WP是1,這時是不能改寫上面任何一
28、個時間寄存器的,</p><p> 只有首先將WP改寫為0,才能進行其它寄存器的寫操作。 </p><p> ?。?)DS1302控制字介紹</p><p> 控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p> 位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);<
29、/p><p> 位5至位1(A4~A0):指示操作單元的地址;</p><p> 位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作。</p><p><b> 讀數(shù)據(jù):</b></p><p> 讀數(shù)據(jù)時在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),</p>
30、<p> 讀出的數(shù)據(jù)是從最低位到最高位。</p><p><b> 寫數(shù)據(jù):</b></p><p> 控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,</p><p> 數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入也是從最低位(0位)開始。</p><p> 位0(最低有效位)
31、:為1表示進行讀操作。 如為0,表示要進行寫操作,</p><p> 控制字后 SCLK 下降沿 讀數(shù)據(jù) SCLK上升沿寫數(shù)據(jù)。</p><p> ?。?)DS1302單字節(jié)讀寫時序介紹</p><p> DS1302的數(shù)據(jù)讀寫是通過I/O串行進行的。當(dāng)進行一次讀寫操作時最少得讀寫兩個字節(jié),第一個字節(jié)是控制字節(jié),就是一個命令,告訴DS1302是讀還是寫操作
32、,是對RAM還是對CLOK寄存器操作,以及操作的址。第二個字節(jié)就是要讀或?qū)懙臄?shù)據(jù)了。我們先看</p><p> 單字節(jié)寫:在進行操作之前先得將CE(也可說是RST)置高電平,然后單片機將控制字的位0放到I/O上,當(dāng)I/O的數(shù)據(jù)穩(wěn)定后,將SCLK置高電平,DS1302檢測到SCLK的上升沿后就將I/O上的數(shù)據(jù)讀取,然后單片機將SCLK置為低電平,再將控制字的位1放到I/O上,如此反復(fù),將一個字節(jié)控制字的8個位傳給
33、DS1302。接下來就是傳一個字節(jié)的數(shù)據(jù)給DS1302,當(dāng)傳完數(shù)據(jù)后,單片機將CE置為低電平,操作結(jié)束。</p><p> 單字節(jié)讀操作的一開始寫控制字的過程和上面的單字節(jié)寫操作是一樣,但是單字節(jié)讀操作在寫控制字的最后一個位,SCLK還在高電平時,DS1302就將數(shù)據(jù)放到I/O上,單片機將SCLK置為低電平后數(shù)據(jù)鎖存,單機機就可以讀取I/O上的數(shù)據(jù)。如此反復(fù),將一個字節(jié)的數(shù)據(jù)讀入單片機。讀與寫操作的不同就在于,
34、寫操作是在SCLK低電平時單片機將數(shù)據(jù)放到IO上,當(dāng)SCLK上升沿時,DS1302讀取。而讀操作是在SCLK高電平時DS1302放數(shù)據(jù)到IO上,將SCLK置為低電平后,單片機就可從IO上讀取數(shù)據(jù)。</p><p> ?。?)DS1302操作指令介紹</p><p><b> 操作說明:</b></p><p> 1 首先要通過8EH將寫保護
35、去掉,將日期,時間的初值寫時各個寄存器。2 然后就可以對80H、82H、84H、86H、88H、8AH、8CH進行初值的寫入。同時也通過秒寄存器將位7的CH值改成0,這樣DS1302就開始走時運了。3 將寫保護寄存器再寫為80H,防止誤改寫寄存器的值。4 不斷讀取80H-8CH的值,將它們格式化后顯示到1602LCD液晶上</p><p> (7)DS1302與單片機接口電路</p><
36、;p><b> 3.3設(shè)置模塊</b></p><p> 設(shè)置模塊采用四個按鍵與P1^4、P1^5、P1^6、P1^7</p><p> 相接組成獨立按鍵,接口電路如下;</p><p><b> 3.4硬件電路設(shè)計</b></p><p> 第4章 系統(tǒng)軟件設(shè)計</p>
37、<p> 軟件設(shè)計是本設(shè)計的關(guān)鍵,軟件程序編寫的好壞直接影響著系統(tǒng)運行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設(shè)計,C語言具有編寫靈活、移植方便、便于模塊化設(shè)計的特點,所以本系統(tǒng)的軟件采用C51編寫。</p><p> 4.1程序框圖如下:</p><p> 第5章 系統(tǒng)硬件PROTEUS仿真原理圖</p><p><b
38、> 5.1顯示實時時間</b></p><p><b> 5.2時間設(shè)置</b></p><p><b> 5.3星期設(shè)置</b></p><p><b> 5.4年月日設(shè)置</b></p><p><b> 5.5原理圖</b>
39、;</p><p><b> 結(jié)論</b></p><p> 本課題從理論到實際應(yīng)用,用AT89C51單片機和時鐘芯片ds1302成功的設(shè)計出了一個電子萬年歷。而且所設(shè)計的電子萬年歷設(shè)計也按當(dāng)初要求的能夠在PROTEUS中進行仿真,并且能夠很精確的顯示年歷。利用DS1802測溫元件進行溫度實時監(jiān)測??梢哉f該電子萬年歷具有很高的實用價值。 在軟件設(shè)計的過程中,利用
40、了Keil這個軟件在程序錄入和調(diào)試的時候的優(yōu)越性,讓我能夠在編寫軟件的時候很方便的發(fā)現(xiàn)軟件中的錯誤,現(xiàn)在已經(jīng)能夠使用Keil對所設(shè)計的程序進行調(diào)試。用keil生成hex文件燒錄到單片機中,從而進行電路設(shè)計仿真。本次設(shè)計的電子萬年歷也存在的不足的地方,有待于以后的改進。</p><p><b> 參考文獻</b></p><p> [1] 趙長德.微型計算機原理與接
41、口技術(shù)[M].北京:機械工業(yè)出版社,1999:98-350. </p><p> [2] 李曉林.單片機的原理與接口技術(shù)[M].北京:電子工業(yè)出版社,2015.1 </p><p> [3] 王忠民.微型計算機原理[M].西安:西安科技大學(xué)出版社,2003:15-55. </p><p> [4] 胡戴明.計算機組成原理[M].北京:經(jīng)濟科學(xué)出版社,2005:
42、43-56. </p><p><b> 附錄一</b></p><p><b> 源程序</b></p><p> #include<reg51.h></p><p> #include<intrins.h></p><p> #defi
43、ne uint unsigned int</p><p> #define uchar unsigned char</p><p> unsigned char code displaywelcome[]={" Welcome To My Lcd Timer"};//歡迎界面//</p><p> unsigned char code
44、displaywish[]={" Happy Every Day ^_^"}; //歡迎界面//</p><p> unsigned char code overtemperature[]={"OVERTEMPERATURE!"};</p><p> unsigned char code digit[]={"0123456789
45、"};</p><p> unsigned char </p><p> mode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours, </p><p> minutea,seconds,houra=12;</p><p> sbi
46、t SCLK=P1^0;</p><p> sbit DATE=P1^1;</p><p> sbit REST=P1^2;</p><p> sbit SET=P1^4;</p><p> sbit ADD=P1^5;</p><p> sbit RED=P1^6;</p><p>
47、 sbit CANL=P1^7;</p><p> void delay1ms(uint i)//1ms延時//</p><p><b> {</b></p><p><b> uint j,k;</b></p><p> while(i--)</p><p>
48、for(j=76;j>1;j--);</p><p> for(k=29;k>1;k--);</p><p><b> }</b></p><p> void delaynus(uchar n)//延時若干微妙//</p><p><b> {</b></p>&l
49、t;p><b> uchar i;</b></p><p> for(i=0;i<n;i++);</p><p><b> }</b></p><p><b> //蜂鳴器模塊//</b></p><p> sbit beep=P3^6; //位定義,定義
50、P.6位fmp//</p><p> void dely500(void)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=250;i>0;i--)</p><p><b> {
51、</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> }</b></p><p> void baojing(uchar n)</p><p><b>
52、 {</b></p><p> uchar x,i;</p><p> while(n--)</p><p><b> {</b></p><p> for(i=0;i<5;i++)</p><p><b> {</b></p>&
53、lt;p> for(x=0;x<200;x++)</p><p><b> {</b></p><p> beep=~beep;</p><p> dely500();</p><p><b> }</b></p><p><b> }<
54、;/b></p><p> for(i=0;i<3;i++)</p><p><b> {</b></p><p> for(x=0;x<200;x++)</p><p><b> {</b></p><p> beep=~beep;</p&
55、gt;<p> dely500();</p><p> dely500();</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b>
56、}</b></p><p> void Write1302(uchar date)//向1302寫數(shù)據(jù)//</p><p><b> {</b></p><p><b> uchar i;</b></p><p><b> SCLK=0;</b></p
57、><p> delaynus(2);</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> DATE=date&0x01;</p><p><b> SCLK=1;</b></p><
58、;p> delaynus(2);</p><p><b> SCLK=0;</b></p><p> delaynus(2);</p><p><b> date>>=1;</b></p><p><b> }</b></p><
59、p><b> }</b></p><p> void WriteSet1302(uchar cmd,uchar date)//根據(jù)相應(yīng)命令輸入相應(yīng)數(shù)據(jù)//</p><p><b> {</b></p><p><b> REST=0;</b></p><p>&l
60、t;b> SCLK=0;</b></p><p><b> REST=1;</b></p><p> Write1302(cmd);</p><p> delaynus(5);</p><p> Write1302(date);</p><p><b> S
61、CLK=1;</b></p><p><b> REST=0;</b></p><p><b> }</b></p><p> uchar Read1302(void)//讀取1302數(shù)據(jù)//</p><p><b> {</b></p>&l
62、t;p> uchar i,date;</p><p> delaynus(2);</p><p> for(i=0;i<8;i++)</p><p> {date>>=1;</p><p> if(DATE==1)</p><p> date|=0x80;</p>&l
63、t;p><b> SCLK=1;</b></p><p> delaynus(2);</p><p><b> SCLK=0;</b></p><p> delaynus(2);</p><p><b> }</b></p><p>
64、return date;</p><p><b> }</b></p><p> uchar ReadSet1302(uchar cmd)//根據(jù)命令讀取1302相應(yīng)的值//</p><p><b> {</b></p><p> uchar date;</p><p&g
65、t;<b> REST=0;</b></p><p><b> SCLK=0;</b></p><p><b> REST=1;</b></p><p> Write1302(cmd);</p><p> delaynus(2);</p><p&g
66、t; date=Read1302();</p><p><b> SCLK=1;</b></p><p><b> REST=0;</b></p><p> return date;</p><p><b> }</b></p><p> v
67、oid IntDS1302(void)//DS1302初始化//</p><p><b> {</b></p><p> uchar flag;</p><p> flag=ReadSet1302(0x81);</p><p> if(flag&0x80)//判斷時鐘芯片是否關(guān)閉//</p>
68、<p><b> {</b></p><p> WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令//</p><p> WriteSet1302(0x80,((0/10)<<4|(0%10)));//根據(jù)秒寄存器命令字,寫入秒的初始值;以下為分時日月//</p><p>
69、 WriteSet1302(0x82,((0/10)<<4|(0%10)));</p><p> WriteSet1302(0x84,((0/10)<<4|(0%10)));</p><p> WriteSet1302(0x86,((0/10)<<4|(0%10)));</p><p> WriteSet1302(0x88,
70、((0/10)<<4|(0%10)));</p><p> WriteSet1302(0x8c,((10/10)<<4|(0%10)));</p><p> WriteSet1302(0x90,0xa5);//打開充電功能 選擇2k電阻充電方式//</p><p> WriteSet1302(0x8E,0x80);//根據(jù)寫狀態(tài)寄存器命
71、令字,寫入保護指令//</p><p><b> }</b></p><p><b> }</b></p><p> sbit RS=P2^5;</p><p> sbit RW=P2^6;</p><p> sbit E=P2^7;</p><
72、p> sbit BF=P0^7;//液晶忙檢測//</p><p> bit BusyTest(void)</p><p><b> {</b></p><p> bit result;</p><p><b> RS=0;</b></p><p><b
73、> RW=1;</b></p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b><
74、;/p><p> result=BF;</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> E=0;<
75、/b></p><p> return result;</p><p><b> }//寫指令//</b></p><p> void Write_com(uchar command)</p><p><b> {</b></p><p> while(Bus
76、yTest()!=0);</p><p><b> RS=0;</b></p><p><b> RW=0;</b></p><p><b> E=0;</b></p><p><b> _nop_();</b></p><p&
77、gt;<b> _nop_();</b></p><p><b> _nop_();</b></p><p> P0=command;</p><p><b> _nop_();</b></p><p><b> _nop_();</b><
78、/p><p><b> _nop_();</b></p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b&g
79、t; _nop_();</b></p><p><b> E=0;</b></p><p><b> }//寫地址//</b></p><p> void Write_Address(uchar address)</p><p><b> {</b><
80、;/p><p> Write_com(address|0x80) ;</p><p> delay1ms(1) ;</p><p><b> }</b></p><p><b> //寫數(shù)據(jù)//</b></p><p> void Write_Date(uchar da
81、te)</p><p><b> {</b></p><p><b> RS=1;</b></p><p><b> RW=0;</b></p><p><b> E=0;</b></p><p><b> _n
82、op_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> P0=date;</b></p><p><b> _nop_();</b><
83、/p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> E=1;</b></p><p><b> _nop_();</b></p><p><b&g
84、t; _nop_();</b></p><p><b> _nop_();</b></p><p><b> E=0;</b></p><p> delay1ms(1);</p><p><b> }</b></p><p><
85、;b> //初始化//</b></p><p> void Lcd_Int(void)</p><p><b> {</b></p><p> Write_com(0x38);</p><p> delay1ms(1);</p><p> Write_com(0x38
86、);</p><p> delay1ms(1);</p><p> Write_com(0x06);</p><p> delay1ms(1);</p><p> Write_com(0x0c);</p><p> delay1ms(1);</p><p> Write_com(0x
87、01);</p><p><b> }</b></p><p> void displaymainpart(void)//顯示液晶主要部分(不變化部分)//</p><p><b> {</b></p><p> Write_Address(0x01);</p><p&g
88、t; delay1ms(1);</p><p> Write_Date('D');</p><p> Write_Date('A');</p><p> Write_Date('T');</p><p> Write_Date('E');</p><
89、p> Write_Date(':');</p><p> delay1ms(1);</p><p> Write_Address(0x0A);</p><p> delay1ms(1);</p><p> Write_Date('-');</p><p> Write_
90、Address(0x0D);</p><p> Write_Date('-');</p><p> Write_Address(0x42);</p><p> Write_Date('T');</p><p> Write_Date('I');</p><p>
91、 Write_Date('M');</p><p> Write_Date('E');</p><p> Write_Date(':');</p><p> Write_Address(0x4A);</p><p> Write_Date('-');</p>
92、<p> Write_Address(0x4D);</p><p> Write_Date('-');</p><p> Write_Address(0x06);</p><p> Write_Date('2');</p><p> Write_Date('0');<
93、/p><p><b> }</b></p><p> void display_Second(uchar second)//在液晶上顯示秒//</p><p><b> {</b></p><p> uchar i,j;</p><p> i=second/10;<
94、;/p><p> j=second%10;</p><p> Write_Address(0x4E);</p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p>&
95、lt;b> }</b></p><p> void display_Minute(uchar minute)//在液晶上顯示分//</p><p><b> {</b></p><p> uchar i,j;</p><p> i=minute/10;</p><p>
96、 j=minute%10;</p><p> Write_Address(0x4B);</p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p><b> }</b&
97、gt;</p><p> void display_Hour(uchar hour)//在液晶上顯示時//</p><p><b> {</b></p><p> uchar i,j;</p><p> i=hour/10;</p><p> j=hour%10;</p>
98、<p> Write_Address(0x48);</p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p><b> }</b></p><p>
99、void display_Day(uchar day)//在液晶上顯示日//</p><p><b> {</b></p><p> uchar i,j;</p><p><b> i=day/10;</b></p><p><b> j=day%10;</b><
100、/p><p> Write_Address(0x0E);</p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p><b> }</b></p><
101、;p> void display_Month(uchar month)//在液晶上顯示月//</p><p><b> {</b></p><p> uchar i,j;</p><p> i=month/10;</p><p> j=month%10;</p><p> Wri
102、te_Address(0x0B);</p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p><b> }</b></p><p> void display_Y
103、ear(uchar year)//在液晶上顯示年//</p><p><b> {</b></p><p> uchar i,j;</p><p> i=year/10;</p><p> j=year%10;</p><p> Write_Address(0x08);</p>
104、;<p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p> delay1ms(1);</p><p><b> }</b></p><p> void display_houra(uchar x) //鬧鐘小時部分顯示//
105、</p><p><b> { </b></p><p> uchar i,j;</p><p><b> i=x/10;</b></p><p><b> j=x%10;</b></p><p> Write_Address(0x44);&
106、lt;/p><p> Write_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p><b> }</b></p><p> void display_minutea(uchar x)//鬧鐘分鐘部分顯示//</p><p><b
107、> { </b></p><p> uchar i,j; </p><p><b> i=x/10; </b></p><p><b> j=x%10;</b></p><p> Write_Address(0x47);</p><p> Wri
108、te_Date(digit[i]);</p><p> Write_Date(digit[j]);</p><p><b> }</b></p><p> void display_Time(void)//顯示實時時間//</p><p><b> {</b></p><
109、p> uchar value,day, month,year;</p><p> Write_com(0x0c);</p><p> value=ReadSet1302(0x81);</p><p> seconds=(((value&0x70)>>4)*10+(value&0x0f));</p><p&
110、gt; display_Second(seconds);</p><p> value=ReadSet1302(0x83);</p><p> minutes=(((value&0x70)>>4)*10+(value&0x0f));</p><p> display_Minute(minutes);</p><
111、p> value=ReadSet1302(0x85);</p><p> hours=(((value&0x70)>>4)*10+(value&0x0f));</p><p> display_Hour(hours);</p><p> value=ReadSet1302(0x87);</p><p>
112、; day=(((value&0x70)>>4)*10+(value&0x0f));</p><p> display_Day(day);</p><p> value=ReadSet1302(0x89);</p><p> month=(((value&0x70)>>4)*10+(value&0x0f
113、));</p><p> display_Month(month);</p><p> value=ReadSet1302(0x8D);</p><p> year=(((value&0xf0)>>4)*10+(value&0x0f));</p><p> display_Year(year);</p
114、><p><b> }</b></p><p> void displaystar(void) //顯示歡迎界面//</p><p><b> { </b></p><p> uchar i,j;</p><p> Write_Address(0x0f);</p
115、><p> while(displaywelcome[i]!='\0') </p><p><b> {</b></p><p> Write_Date(displaywelcome[i]);</p><p><b> i++;</b></p><p>
116、 delay1ms(1);</p><p><b> }</b></p><p><b> i=0;</b></p><p> Write_Address(0x4f);</p><p> while(displaywish[i]!='\0')</p><p
117、><b> { </b></p><p> Write_Date(displaywish[i]);</p><p><b> i++;</b></p><p> delay1ms(1);</p><p><b> } </b></p><
118、p><b> j=40;</b></p><p> while(j--)</p><p><b> {</b></p><p> Write_com(0x18);//循環(huán)左移 //</p><p> delay1ms(700); </p><p><b&
119、gt; }</b></p><p> Write_com(0x01);</p><p> delay1ms(10);</p><p><b> } </b></p><p> void gbdisplay(uchar address)//時間調(diào)整時光標閃爍//</p><p>
120、;<b> {</b></p><p> Write_Address(address);</p><p> delay1ms(5);</p><p> Write_com(0x0f);</p><p> delay1ms(5);</p><p><b> }</b>
121、;</p><p> void displaymaxt(uchar x) //顯示最大溫度//</p><p><b> { </b></p><p> uchar i,j,k;</p><p> Write_com(0x0c);</p><p> delay1ms(2);</p
122、><p> Write_Address(0x44);</p><p><b> i=x/100;</b></p><p><b> j=x/10;</b></p><p><b> k=x%10;</b></p><p> Write_Date(d
123、igit[i]);</p><p> Write_Date(digit[j]);</p><p> Write_Date(digit[k]); </p><p><b> }</b></p><p> void hourset(void)//調(diào)時//</p><p><b>
124、{</b></p><p> uchar timevalue,hour;</p><p> delay1ms(500);//防止多次觸發(fā)//</p><p> WriteSet1302(0x8e,0x00);//將寫保護去掉,確保能正常將調(diào)整后的數(shù)值寫入ds1303//</p><p> timevalue=ReadSet
125、1302(0x85);//讀取此時的數(shù)值//</p><p> hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));</p><p><b> while(1)</b></p><p><b> {</b></p><p&g
126、t; if(ADD==0)</p><p><b> {</b></p><p> delay1ms(50);</p><p> if(ADD==0)</p><p><b> {hour++;</b></p><p> delay1ms(300);</p&
127、gt;<p> while(ADD==0);</p><p><b> }</b></p><p><b> }</b></p><p> if(RED==0)</p><p><b> {</b></p><p> delay
128、1ms(50);</p><p> if(RED==0)</p><p><b> {</b></p><p><b> hour--;</b></p><p> delay1ms(300);</p><p> if(hour==0) hour=23;</p&
129、gt;<p> while(RED==0);</p><p><b> }</b></p><p><b> }</b></p><p> timevalue=((hour/10)<<4|(hour%10));</p><p> WriteSet1302(0x84
130、,timevalue);</p><p> delay1ms(1);</p><p> display_Hour(hour);</p><p> Write_Address(0x49);</p><p> delay1ms(5);</p><p> if(hour>=24) hour=0;</p&
131、gt;<p> delay1ms(5);</p><p> if(CANL==0)</p><p><b> {</b></p><p><b> mode=0;</b></p><p> Write_com(0x0c);</p><p><b&
132、gt; break;</b></p><p><b> }</b></p><p> if(SET==0) break;</p><p><b> }</b></p><p> WriteSet1302(0x8e,0x80);</p><p><b
133、> }</b></p><p> void minuteset(void)//調(diào)分//</p><p><b> {</b></p><p> uchar timevalue,minute;</p><p> delay1ms(500);//防止多次觸發(fā)//</p><p&
134、gt; WriteSet1302(0x8e,0x00);//將寫保護去掉,確保能正常將調(diào)整后的數(shù)值寫入ds1303//</p><p> timevalue=ReadSet1302(0x83);//讀取此時的數(shù)值//</p><p> minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));</p>
135、<p><b> while(1)</b></p><p><b> {</b></p><p> if(ADD==0)</p><p><b> {</b></p><p> delay1ms(10);</p><p> if
136、(ADD==0)</p><p> {minute++;</p><p> if(minute>=60) timevalue=0;</p><p> while(ADD==0);</p><p><b> }</b></p><p><b> }</b><
137、;/p><p> if(RED==0)</p><p><b> {</b></p><p> delay1ms(10);</p><p> if(RED==0)</p><p><b> {</b></p><p><b> min
138、ute--;</b></p><p> delay1ms(300);</p><p> if(minute==0) minute=59;</p><p> while(RED==0);</p><p><b> }</b></p><p><b> }</b&
139、gt;</p><p> timevalue=((minute/10)<<4|(minute%10));</p><p> WriteSet1302(0x82,timevalue);</p><p> delay1ms(1);</p><p> display_Minute(minute);</p><
140、p> Write_Address(0x4c);</p><p> delay1ms(5);</p><p> if(minute>=60) minute=0;</p><p> delay1ms(5);</p><p> if(CANL==0)</p><p><b> {</b
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機的電子萬年歷
- 基于單片機的電子萬年歷
- 單片機的電子萬年歷設(shè)計
- 基于單片機的電子萬年歷的設(shè)計論文
- 基于單片機的電子萬年歷大學(xué)
- 基于51單片機的電子萬年歷設(shè)計
- 萬年歷畢業(yè)論文---基于at89s52單片機的電子萬年歷設(shè)計
- 基于單片機的電子萬年歷畢業(yè)論文
- 畢業(yè)論文(設(shè)計)基于單片機的電子萬年歷
- 單片機課程設(shè)計—電子萬年歷
- 基于51單片機的電子萬年歷的設(shè)計
- 單片機課程設(shè)計-電子萬年歷
- 單片機課程設(shè)計-- 電子萬年歷
- 單片機中文電子萬年歷
- 基于單片機的數(shù)字萬年歷設(shè)計
- 基于5152單片機的電子萬年歷設(shè)計經(jīng)典
- 外文翻譯-基于單片機的電子萬年歷
- 基于單片機的電子萬年歷畢業(yè)設(shè)計
- 基于51單片機的電子萬年歷畢業(yè)設(shè)計論文
- 基于51單片機電子萬年歷
評論
0/150
提交評論