基于單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)制作論文_第1頁(yè)
已閱讀1頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  題 目</b></p><p>  基于單片機(jī)的萬(wàn)年歷設(shè)計(jì)</p><p><b>  學(xué)號(hào):</b></p><p><b>  姓名: </b></p><p>  日期:2015.12.28</p><p>

2、<b>  摘 要</b></p><p>  單片機(jī)就是微控制器,是面向應(yīng)用對(duì)象設(shè)計(jì)、突出控制功能的芯片。單片機(jī)接上晶振、復(fù)位電路和相應(yīng)的接口電路,裝載軟件后就可以構(gòu)成單片機(jī)應(yīng)用系統(tǒng)。本設(shè)計(jì)就是應(yīng)用單片機(jī)強(qiáng)大的控制功能制作而成的電子萬(wàn)年歷,該電子萬(wàn)年歷包括三大功能:實(shí)時(shí)顯示年、月、日、星期、時(shí)、分、秒;</p><p>  計(jì)時(shí)芯片采用DALLAS公司的涓細(xì)充電

3、時(shí)鐘芯片DS1302,該芯片通過(guò)簡(jiǎn)單的串行通信與單片機(jī)進(jìn)行通信,時(shí)鐘/日歷電路能夠?qū)崟r(shí)提供年、月、日、時(shí)分、秒信息,采用雙電源供電,當(dāng)外部電源掉電時(shí)能夠利用后備電池準(zhǔn)確計(jì)時(shí)。</p><p>  顯示器件采用通用型1602液晶,可顯示32個(gè)字符,如果使用數(shù)碼管來(lái)做顯示器件需消耗大量的系統(tǒng)資源,因此采用低功耗的1602液晶,該液晶顯示方便,功能強(qiáng)大,完全能滿足數(shù)字萬(wàn)年歷的顯示要求。</p><p

4、>  通過(guò)此次設(shè)計(jì)能夠更加牢固的掌握單片機(jī)的應(yīng)用技術(shù),增強(qiáng)動(dòng)手能力、硬件設(shè)計(jì)能力以及軟件設(shè)計(jì)能力。</p><p>  關(guān)鍵詞:AT89C51、1602液晶、DS1302、萬(wàn)年歷</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è)計(jì)6</p><p>  2.1液晶顯示模塊6</p><p>  2.2實(shí)時(shí)時(shí)間計(jì)算模塊6</p><p><b>  2.3設(shè)置模塊6</b></p>

6、<p>  第3章 系統(tǒng)硬件設(shè)計(jì)8</p><p>  3.1LCD顯示模塊設(shè)計(jì)8</p><p>  3.2時(shí)間計(jì)算模塊設(shè)計(jì)9</p><p>  3.3設(shè)置模塊12</p><p>  3.4硬件電路設(shè)計(jì)13</p><p>  第4章 系統(tǒng)軟件設(shè)計(jì)14</p><p&

7、gt;  4.1程序框圖如下:14</p><p>  第5章 系統(tǒng)硬件PROTEUS仿真原理圖15</p><p>  5.1顯示實(shí)時(shí)時(shí)間15</p><p>  5.2時(shí)間設(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>  參考文獻(xiàn)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ā)展,時(shí)間的流逝,從觀太陽(yáng)、擺鐘到現(xiàn)在電子鐘,人類不斷研究,不斷創(chuàng)新紀(jì)錄。它可以對(duì)年、月、日、時(shí)、分、秒進(jìn)行計(jì)時(shí),還具有閏年補(bǔ)償?shù)榷喾N功能,而且DS1302的使用壽命長(zhǎng),誤差小。對(duì)

10、于數(shù)字電子萬(wàn)年歷采用直觀的數(shù)字顯示,可以同時(shí)顯示年、月、日、時(shí)、分、秒等信息,還具有時(shí)間校準(zhǔn)等功能。該電路采用AT89C51單片機(jī)作為核心,功耗小,能在3V的低壓工作,電壓可選用3~5V電壓供電。 </p><p>  此萬(wàn)年歷具有讀取方便、顯示直觀、功能多樣、電路簡(jiǎn)潔、成本低廉等諸多優(yōu)點(diǎn),符合電子儀器儀表的發(fā)展趨勢(shì),具有廣闊的市場(chǎng)前景。 </p><p>  1.2課題的研究目的

11、與意義 </p><p>  二十一世紀(jì)是數(shù)字化技術(shù)高速發(fā)展的時(shí)代,而單片機(jī)在數(shù)字化高速發(fā)展的時(shí)代扮演著極為重要的角色。電子萬(wàn)年歷的開(kāi)發(fā)與研究在信息化時(shí)代的今天亦是當(dāng)務(wù)之急,因?yàn)樗鼞?yīng)用在學(xué)校、機(jī)關(guān)、企業(yè)、部隊(duì)等單位禮堂、訓(xùn)練場(chǎng)地、教學(xué)室、公共場(chǎng)地等場(chǎng)合,可以說(shuō)遍及人們生活的每一個(gè)角落。由于社會(huì)對(duì)信息交換不斷提高的要求及高新技術(shù)的逐步發(fā)展,促使電子萬(wàn)年歷發(fā)展并且投入市場(chǎng)得到廣泛應(yīng)用。</p>&l

12、t;p>  第2 章 總體方案論證與設(shè)計(jì)</p><p>  本系統(tǒng)以AT89C51單片機(jī)為控制核心,通過(guò)與DS1302和DS18B20通信獲取實(shí)時(shí)時(shí)間和實(shí)時(shí)環(huán)境溫度,并將得到的數(shù)據(jù)通過(guò)1602液晶顯示出來(lái),同時(shí)通過(guò)相應(yīng)的按鍵調(diào)整相應(yīng)的值。因此本設(shè)計(jì)可分為一下模塊:顯示模塊、實(shí)時(shí)時(shí)間計(jì)</p><p>  算模塊、設(shè)置模塊(時(shí)間設(shè)置模塊)下面對(duì)各個(gè)模塊逐一進(jìn)行論證分析:</p&

13、gt;<p><b>  2.1液晶顯示模塊</b></p><p><b>  方案一:</b></p><p>  數(shù)碼管是利用發(fā)光二極管的特性組合而成數(shù)字顯示器件,通過(guò)控制相應(yīng)的二極管的狀態(tài)顯示相應(yīng)的數(shù)字。要使數(shù)碼管正常顯示就得有驅(qū)動(dòng)電路驅(qū)動(dòng)相應(yīng)的段碼,數(shù)碼管的現(xiàn)實(shí)方式可分為靜態(tài)顯示和動(dòng)態(tài)顯示,靜態(tài)顯示方式只適合顯示單個(gè)的數(shù)字

14、,因此本設(shè)計(jì)應(yīng)采用動(dòng)態(tài)顯示方式。由于動(dòng)態(tài)顯示方式利用的是人眼視覺(jué)暫留的特性,掃描的時(shí)間應(yīng)不大于20毫秒,占用系統(tǒng)資源大,而且顯示的個(gè)數(shù)和字型有限,在本設(shè)計(jì)中不易采用。</p><p><b>  方案二:</b></p><p>  1602液晶也叫1602字符型液晶 它是一種專門用來(lái)顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊 它有若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成

15、,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符。每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有也有間隔,起到了字符間距和行間距的作用。1602的驅(qū)動(dòng)電路帶有11條指令,可以很方便的控制液晶的現(xiàn)實(shí)效果如:清屏、左移右移、光標(biāo)顯示。而且1602顯示的字符在下一條指令為到來(lái)之前不會(huì)改變,也就是能夠維持顯示的字符,1602液晶占用的系統(tǒng)資源也少。綜合比較上述兩種方案,應(yīng)采用1602液晶組成本設(shè)計(jì)的顯示模塊。</p><p>  2.2實(shí)時(shí)時(shí)

16、間計(jì)算模塊</p><p><b>  方案一:</b></p><p>  AT89C51單片機(jī)內(nèi)部帶有定時(shí)/計(jì)數(shù)功能,此定時(shí)功能是通過(guò)對(duì)外部晶振的脈沖進(jìn)行計(jì)數(shù),從而達(dá)到計(jì)時(shí)功能,只要使用11.0592的晶振就能實(shí)現(xiàn)零誤差的計(jì)時(shí),因此可以利用此功能實(shí)現(xiàn)計(jì)時(shí),但因?yàn)橹挥袉我坏挠?jì)時(shí)功能要實(shí)現(xiàn)“萬(wàn)年歷”的功能需要較復(fù)雜的程序,而且如果單片機(jī)掉電無(wú)法繼續(xù)進(jìn)行計(jì)時(shí),所以使用不

17、便。</p><p><b>  方案二:</b></p><p>  DS1302是美國(guó)DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)

18、2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。利用單片機(jī)強(qiáng)大的控制功能就可實(shí)現(xiàn)實(shí)時(shí)計(jì)時(shí)的功能,而且消耗的系統(tǒng)資源少,程序簡(jiǎn)單。綜合上述兩種方案,宜采用方案(2)實(shí)現(xiàn)實(shí)時(shí)計(jì)時(shí)功能。</p><p><b>  2.3設(shè)置模塊</b></p><p>  因設(shè)置模塊只需編寫相應(yīng)的程序外加相應(yīng)的按鍵即可

19、實(shí)現(xiàn),實(shí)現(xiàn)方法較簡(jiǎn)單,在此不再論述。</p><p><b>  總體方案組成框圖</b></p><p>  第3章 系統(tǒng)硬件設(shè)計(jì)</p><p>  3.1LCD顯示模塊設(shè)計(jì)</p><p> ?。?)、1602液晶功耗較小可直接與單片機(jī)接口相接,電源直接與電源電路相接,使用單片機(jī)的P0口和P1口與1602進(jìn)行通信。

20、</p><p> ?。?)、1602相應(yīng)功能特性介紹</p><p>  +5V電壓,對(duì)比度可調(diào)</p><p><b>  內(nèi)含復(fù)位電路</b></p><p>  提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能</p><p>  有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM<

21、;/p><p>  內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM</p><p>  8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM</p><p> ?。?)、1602引腳介紹</p><p>  (4)、1602液晶與單片機(jī)接口電路</p><p>  3.2時(shí)間計(jì)算模塊設(shè)計(jì)</p><p

22、>  DS1302通過(guò)三根口線實(shí)現(xiàn)與單片機(jī)的通信,因DS1302功耗很小,即使電源掉電后通過(guò)3V的紐扣電池仍能維持DS1302精確走時(shí)。</p><p> ?。?)DS1302特性介紹</p><p>  DS1302是美國(guó)DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和R

23、AM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。工作電壓寬達(dá)2.5~5.5V。采用雙電源供電(主電源和備用電源),可設(shè)置備用電源充電方式,提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。</p><p> ?。?)DS1302引腳介紹</p><p><b>  各引腳的功能為:</b></p><

24、p>  8 、Vcc1:備用電池端;</p><p>  1、Vcc2:5V電源。當(dāng)Vcc2>Vcc1+0.2V時(shí),由Vcc2向DS1302供電,當(dāng)Vcc2< Vcc1時(shí),由Vcc1向DS1302供電。</p><p>  7、 SCLK:串行時(shí)鐘,輸入;  </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)日歷、時(shí)間的寄存器 </p><p>  寄存器的說(shuō)明如下:1、秒寄存器(81h、80h)的位

26、7定義為時(shí)鐘暫停標(biāo)志(CH)。當(dāng)初始上電時(shí)該位置為1,</p><p>  時(shí)鐘振蕩器停止,DS1302處于低功耗狀態(tài);只有將秒寄存器的該位置改寫為0時(shí),時(shí)鐘才能開(kāi)</p><p>  始運(yùn)行。2、小時(shí)寄存器(85h、84h)的位7用于定義DS1302是運(yùn)行于12小時(shí)模式還是24小時(shí)模式。當(dāng)為</p><p>  高時(shí),選擇12小時(shí)模式。在12小時(shí)模式時(shí),位5是

27、,當(dāng)為1時(shí),表示PM。在24小時(shí)模式時(shí),</p><p>  位5是第二個(gè)10小時(shí)位3、控制寄存器(8Fh、8Eh)的位7是寫保護(hù)位(WP),其它7位均置為0。在對(duì)任何的時(shí)鐘和</p><p>  RAM的寫操作之前,WP位必須為0。當(dāng)WP位為1時(shí),寫保護(hù)位防止對(duì)任一寄存器的寫操作。</p><p>  也就是說(shuō)在電路上電的初始態(tài)WP是1,這時(shí)是不能改寫上面任何一

28、個(gè)時(shí)間寄存器的,</p><p>  只有首先將WP改寫為0,才能進(jìn)行其它寄存器的寫操作。 </p><p> ?。?)DS1302控制字介紹</p><p>  控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。</p><p>  位6:如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);<

29、/p><p>  位5至位1(A4~A0):指示操作單元的地址;</p><p>  位0(最低有效位):如為0,表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作。</p><p><b>  讀數(shù)據(jù):</b></p><p>  讀數(shù)據(jù)時(shí)在緊跟8位的控制字指令后的下一個(gè)SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),</p>

30、<p>  讀出的數(shù)據(jù)是從最低位到最高位。</p><p><b>  寫數(shù)據(jù):</b></p><p>  控制字總是從最低位開(kāi)始輸出。在控制字指令輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí),</p><p>  數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入也是從最低位(0位)開(kāi)始。</p><p>  位0(最低有效位)

31、:為1表示進(jìn)行讀操作。 如為0,表示要進(jìn)行寫操作,</p><p>  控制字后 SCLK 下降沿 讀數(shù)據(jù) SCLK上升沿寫數(shù)據(jù)。</p><p>  (5)DS1302單字節(jié)讀寫時(shí)序介紹</p><p>  DS1302的數(shù)據(jù)讀寫是通過(guò)I/O串行進(jìn)行的。當(dāng)進(jìn)行一次讀寫操作時(shí)最少得讀寫兩個(gè)字節(jié),第一個(gè)字節(jié)是控制字節(jié),就是一個(gè)命令,告訴DS1302是讀還是寫操作

32、,是對(duì)RAM還是對(duì)CLOK寄存器操作,以及操作的址。第二個(gè)字節(jié)就是要讀或?qū)懙臄?shù)據(jù)了。我們先看</p><p>  單字節(jié)寫:在進(jìn)行操作之前先得將CE(也可說(shuō)是RST)置高電平,然后單片機(jī)將控制字的位0放到I/O上,當(dāng)I/O的數(shù)據(jù)穩(wěn)定后,將SCLK置高電平,DS1302檢測(cè)到SCLK的上升沿后就將I/O上的數(shù)據(jù)讀取,然后單片機(jī)將SCLK置為低電平,再將控制字的位1放到I/O上,如此反復(fù),將一個(gè)字節(jié)控制字的8個(gè)位傳給

33、DS1302。接下來(lái)就是傳一個(gè)字節(jié)的數(shù)據(jù)給DS1302,當(dāng)傳完數(shù)據(jù)后,單片機(jī)將CE置為低電平,操作結(jié)束。</p><p>  單字節(jié)讀操作的一開(kāi)始寫控制字的過(guò)程和上面的單字節(jié)寫操作是一樣,但是單字節(jié)讀操作在寫控制字的最后一個(gè)位,SCLK還在高電平時(shí),DS1302就將數(shù)據(jù)放到I/O上,單片機(jī)將SCLK置為低電平后數(shù)據(jù)鎖存,單機(jī)機(jī)就可以讀取I/O上的數(shù)據(jù)。如此反復(fù),將一個(gè)字節(jié)的數(shù)據(jù)讀入單片機(jī)。讀與寫操作的不同就在于,

34、寫操作是在SCLK低電平時(shí)單片機(jī)將數(shù)據(jù)放到IO上,當(dāng)SCLK上升沿時(shí),DS1302讀取。而讀操作是在SCLK高電平時(shí)DS1302放數(shù)據(jù)到IO上,將SCLK置為低電平后,單片機(jī)就可從IO上讀取數(shù)據(jù)。</p><p> ?。?)DS1302操作指令介紹</p><p><b>  操作說(shuō)明:</b></p><p>  1 首先要通過(guò)8EH將寫保護(hù)

35、去掉,將日期,時(shí)間的初值寫時(shí)各個(gè)寄存器。2 然后就可以對(duì)80H、82H、84H、86H、88H、8AH、8CH進(jìn)行初值的寫入。同時(shí)也通過(guò)秒寄存器將位7的CH值改成0,這樣DS1302就開(kāi)始走時(shí)運(yùn)了。3 將寫保護(hù)寄存器再寫為80H,防止誤改寫寄存器的值。4 不斷讀取80H-8CH的值,將它們格式化后顯示到1602LCD液晶上</p><p>  (7)DS1302與單片機(jī)接口電路</p><

36、;p><b>  3.3設(shè)置模塊</b></p><p>  設(shè)置模塊采用四個(gè)按鍵與P1^4、P1^5、P1^6、P1^7</p><p>  相接組成獨(dú)立按鍵,接口電路如下;</p><p><b>  3.4硬件電路設(shè)計(jì)</b></p><p>  第4章 系統(tǒng)軟件設(shè)計(jì)</p>

37、<p>  軟件設(shè)計(jì)是本設(shè)計(jì)的關(guān)鍵,軟件程序編寫的好壞直接影響著系統(tǒng)運(yùn)行情況的良好。因本程序涉及的模塊較多,所以程序編寫也采用模塊化設(shè)計(jì),C語(yǔ)言具有編寫靈活、移植方便、便于模塊化設(shè)計(jì)的特點(diǎn),所以本系統(tǒng)的軟件采用C51編寫。</p><p>  4.1程序框圖如下:</p><p>  第5章 系統(tǒng)硬件PROTEUS仿真原理圖</p><p><b

38、>  5.1顯示實(shí)時(shí)時(shí)間</b></p><p><b>  5.2時(shí)間設(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>  本課題從理論到實(shí)際應(yīng)用,用AT89C51單片機(jī)和時(shí)鐘芯片ds1302成功的設(shè)計(jì)出了一個(gè)電子萬(wàn)年歷。而且所設(shè)計(jì)的電子萬(wàn)年歷設(shè)計(jì)也按當(dāng)初要求的能夠在PROTEUS中進(jìn)行仿真,并且能夠很精確的顯示年歷。利用DS1802測(cè)溫元件進(jìn)行溫度實(shí)時(shí)監(jiān)測(cè)??梢哉f(shuō)該電子萬(wàn)年歷具有很高的實(shí)用價(jià)值。 在軟件設(shè)計(jì)的過(guò)程中,利用

40、了Keil這個(gè)軟件在程序錄入和調(diào)試的時(shí)候的優(yōu)越性,讓我能夠在編寫軟件的時(shí)候很方便的發(fā)現(xiàn)軟件中的錯(cuò)誤,現(xiàn)在已經(jīng)能夠使用Keil對(duì)所設(shè)計(jì)的程序進(jìn)行調(diào)試。用keil生成hex文件燒錄到單片機(jī)中,從而進(jìn)行電路設(shè)計(jì)仿真。本次設(shè)計(jì)的電子萬(wàn)年歷也存在的不足的地方,有待于以后的改進(jìn)。</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 趙長(zhǎng)德.微型計(jì)算機(jī)原理與接

41、口技術(shù)[M].北京:機(jī)械工業(yè)出版社,1999:98-350. </p><p>  [2] 李曉林.單片機(jī)的原理與接口技術(shù)[M].北京:電子工業(yè)出版社,2015.1 </p><p>  [3] 王忠民.微型計(jì)算機(jī)原理[M].西安:西安科技大學(xué)出版社,2003:15-55. </p><p>  [4] 胡戴明.計(jì)算機(jī)組成原理[M].北京:經(jīng)濟(jì)科學(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延時(shí)//</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)//延時(shí)若干微妙//</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)//判斷時(shí)鐘芯片是否關(guān)閉//</p>

68、<p><b>  {</b></p><p>  WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)寄存器命令字,寫入不保護(hù)指令//</p><p>  WriteSet1302(0x80,((0/10)<<4|(0%10)));//根據(jù)秒寄存器命令字,寫入秒的初始值;以下為分時(shí)日月//</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);//打開(kāi)充電功能 選擇2k電阻充電方式//</p><p>  WriteSet1302(0x8E,0x80);//根據(jù)寫狀態(tài)寄存器命

71、令字,寫入保護(hù)指令//</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;//液晶忙檢測(cè)//</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)//在液晶上顯示時(shí)//</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) //鬧鐘小時(shí)部分顯示//

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)//顯示實(shí)時(shí)時(shí)間//</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)//時(shí)間調(diào)整時(shí)光標(biā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)時(shí)//</p><p><b>  

124、{</b></p><p>  uchar timevalue,hour;</p><p>  delay1ms(500);//防止多次觸發(fā)//</p><p>  WriteSet1302(0x8e,0x00);//將寫保護(hù)去掉,確保能正常將調(diào)整后的數(shù)值寫入ds1303//</p><p>  timevalue=ReadSet

125、1302(0x85);//讀取此時(shí)的數(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);//將寫保護(hù)去掉,確保能正常將調(diào)整后的數(shù)值寫入ds1303//</p><p>  timevalue=ReadSet1302(0x83);//讀取此時(shí)的數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論