版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于單片機(jī)的電子萬(wàn)年歷
- 基于單片機(jī)的電子萬(wàn)年歷
- 單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 基于單片機(jī)的電子萬(wàn)年歷的設(shè)計(jì)論文
- 基于單片機(jī)的電子萬(wàn)年歷大學(xué)
- 基于51單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 萬(wàn)年歷畢業(yè)論文---基于at89s52單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)
- 基于單片機(jī)的電子萬(wàn)年歷畢業(yè)論文
- 畢業(yè)論文(設(shè)計(jì))基于單片機(jī)的電子萬(wàn)年歷
- 單片機(jī)課程設(shè)計(jì)—電子萬(wàn)年歷
- 基于51單片機(jī)的電子萬(wàn)年歷的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-電子萬(wàn)年歷
- 單片機(jī)課程設(shè)計(jì)-- 電子萬(wàn)年歷
- 單片機(jī)中文電子萬(wàn)年歷
- 基于單片機(jī)的數(shù)字萬(wàn)年歷設(shè)計(jì)
- 基于5152單片機(jī)的電子萬(wàn)年歷設(shè)計(jì)經(jīng)典
- 外文翻譯-基于單片機(jī)的電子萬(wàn)年歷
- 基于單片機(jī)的電子萬(wàn)年歷畢業(yè)設(shè)計(jì)
- 基于51單片機(jī)的電子萬(wàn)年歷畢業(yè)設(shè)計(jì)論文
- 基于51單片機(jī)電子萬(wàn)年歷
評(píng)論
0/150
提交評(píng)論