版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)設計(論文)</b></p><p> 題目單片機控制的萬年歷設計 </p><p> 學院 機電工程系 </p><p> 專業(yè) 電子信息工程技術(shù) </p><p> 年級 &l
2、t;/p><p> 姓名 </p><p> 指導教師 </p><p><b> (20 年 月)</b></p><p> 基于單片機控制1602液晶的萬年歷</p><p><b> 摘要&
3、lt;/b></p><p> 隨著社會主義市場經(jīng)濟的發(fā)展,人們對時間和溫度可靠性的要求不斷提高;到目前為止,利用先進的單片機技術(shù)、控制技術(shù)以及通訊技術(shù),設計高性能、高節(jié)能、能適應不同領域的產(chǎn)品是必然的趨勢</p><p> 本論文分析單片機控制1602液晶的原理及系統(tǒng)的組成結(jié)構(gòu),提出不同的控制方案,通過研究和比較,本論文采用液晶實現(xiàn)時鐘和溫度,然后用數(shù)字對系統(tǒng)單片機的設計。最后
4、對系統(tǒng)的軟硬件設計進行了詳細的介紹。本論文設計與實現(xiàn)通過單片機控制來實現(xiàn)想要的目的。具體講述了系統(tǒng)的總體設計與軟件的實現(xiàn),并對系統(tǒng)采取的可靠性措施進行了說明。</p><p><b> 目錄</b></p><p><b> 第一章 緒論4</b></p><p> 1.1數(shù)字電子鐘的背景4</p>
5、<p> 1.2 數(shù)字電子鐘的意義4</p><p> 1.3數(shù)字電子鐘的應用5</p><p> 第二章 數(shù)字鐘的硬件設計6</p><p> 第三章 數(shù)字鐘的軟件設計10</p><p> 3.1 ds1302芯片的介紹10</p><p> 3.2 程序的實現(xiàn)13</
6、p><p> 3.3 DS18B20溫度管的介紹17</p><p> 3.4 DS18B20的程序20</p><p><b> 3.5主函數(shù)25</b></p><p> 第四章 調(diào)試與功能說明28</p><p> 4.1 硬盤調(diào)試28</p><p
7、> 4.2 系統(tǒng)性能測試與功能說明28</p><p> 4.3 系統(tǒng)時鐘誤差分析29</p><p> 4.4 軟件調(diào)試問題及解決29</p><p> 第五章 單片機的應用特點和應用領域31</p><p> 5.1 單片機的特點31</p><p> 5.2 單片機的應用領域32&
8、lt;/p><p><b> 結(jié)束語34</b></p><p><b> 致 謝35</b></p><p><b> 參考文獻36</b></p><p><b> 第一章 緒論</b></p><p> 1.1數(shù)字
9、電子鐘的背景 </p><p> 20世紀末,電子技術(shù)獲得了飛速的發(fā)展,在其推動下,現(xiàn)代電子產(chǎn)品幾乎滲透了社會的各個領域,有力地推動了社會生產(chǎn)力的發(fā)展和社會信息化程度的提高,同時也使現(xiàn)代電子產(chǎn)品性能進一步提高,產(chǎn)品更新?lián)Q代的節(jié)奏也越來越快。 時間對人們來說總是那么寶貴,工作</p><p> 的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷
10、大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。 </p><p> 目前,單片機正朝著高性能和多品種方向發(fā)展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內(nèi)裝化等幾個方面發(fā)展。下面是單片機的主要發(fā)展趨勢。單片機應用的重要意義還在于,它從根本上改變了傳統(tǒng)的控制系統(tǒng)設計思想和設計方法。從前必須由模擬電路或數(shù)字電路實現(xiàn)的大部分功能,現(xiàn)在已能用單片機通過軟件方法來實現(xiàn)了。這種軟件代替
11、硬件的控制技術(shù)也稱為微控制技術(shù),是傳統(tǒng)控制技術(shù)的一次革命。 </p><p> 單片機模塊中最常見的是數(shù)字鐘,數(shù)字鐘是一種用數(shù)字電路技術(shù)實現(xiàn)時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。</p><p> 1.2 數(shù)字電子鐘的意義 </p><p> 數(shù)字鐘是采用數(shù)字電路實現(xiàn)對.時,分
12、,秒.數(shù)字顯示的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應用,使得數(shù)字鐘的精度,遠遠超過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎
13、的。因此,研究數(shù)字鐘及擴大其應用,有著非常現(xiàn)實的意義。</p><p> 1.3數(shù)字電子鐘的應用 </p><p> 數(shù)字鐘已成為人們?nèi)粘I钪校罕夭豢缮俚谋匦杵?,廣泛用于個人家庭以及車站、碼頭、劇場、辦公室等公共場所,給人們的生活、學習、工作、娛樂帶來極大的方便。由于數(shù)字集</p><p> 成電路技術(shù)的發(fā)展和采用了先進的石英技術(shù),使數(shù)字鐘具有走時準確、性
14、能穩(wěn)定、攜帶方便等優(yōu)點,它還用于計時、自動報時及自動控制等各個領域。 </p><p> 第二章 數(shù)字鐘的硬件設計</p><p><b> 1)最小系統(tǒng)</b></p><p> 單片機最小系統(tǒng)或者稱為最小應用系統(tǒng),素質(zhì)用最少的元件組成的單片機可以工作的系統(tǒng),對51系列單片機來說,最小系統(tǒng)一般應該包括:單片機、復位電路、晶振電路。&l
15、t;/p><p> 復位電路:使用了獨立式鍵盤,單片機的P1口鍵盤的接口。該設計要求只需4個鍵對步進電機的狀態(tài)進行控制,但考慮到對控制功能的擴展,使用了6路獨立式鍵盤。復位電路采用手動復位,所謂手動復位,是指通過接通一按鈕開關(guān),使單片機進入復位狀態(tài),晶振電路用30PF的電容和一12M晶體振蕩器組成為整個電路提供時鐘頻率。如圖。</p><p> 晶振電路: 51單片機的時鐘信號通常用兩種電
16、路形式電路得到:內(nèi)部震蕩方式和外部中斷方式。在引腳XTAL1和XTAL2外部接晶振電路器(簡稱晶振)或陶瓷晶振器,就構(gòu)成了內(nèi)部晶振方式。由于單片機內(nèi)部有一個高增益反相放大器,當外接晶振后,就構(gòu)成了自激振蕩器并產(chǎn)生振蕩時鐘脈沖。內(nèi)部振蕩方式的外部電路如圖5示。其電容值一般在5~30pf,晶振頻率的典型值為12MHz,采用6MHz的情況也比較多。內(nèi)部振蕩方式所得的時鐘信號比較穩(wěn)定,實用電路實用較多。 </p><p>
17、; 1.電源引腳 </p><p> Vcc 40 電源端 </p><p> GND 20 接地端 </p><p> 工作電壓為5V,另有AT89LV51工作電壓則是 2.7-6V, 引腳功能一樣。 </p><p><b> 2.外接晶體引腳 </b></p><p&g
18、t; 晶振連接的內(nèi)部、外部方式</p><p><b> XTAL1 19 </b></p><p><b> XTAL2 18 </b></p><p> XTAL1是片內(nèi)振蕩器的反相放大器輸入端,XTAL2則是輸出端,使用外部振蕩器時,外</p><p> 部振蕩信號應直接加到XTAL
19、1,而XTAL2懸空。內(nèi)部方式時,時鐘發(fā)生器對振蕩脈沖二分頻,如晶振為 12MHz,時鐘頻率就為 6MHz。晶振的頻率可以在 1MHz-24MHz內(nèi)選擇。電容取 30PF左右。系統(tǒng)的時鐘電路設計是采用的內(nèi)部方式,即利用芯片內(nèi)部的振蕩電路。AT89單片機內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器。引腳 XTAL1和 XTAL2分別是此放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外晶體諧振器一起構(gòu)成一個自激振蕩器。外接晶體諧振器以及
20、電容 C1和 C2構(gòu)成并聯(lián)諧振電路,接在放大器的反饋回路中。對外接電容的值雖然沒有嚴格的要求,但電容的大小會影響震蕩器頻率的高低、震蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性。因此,此系統(tǒng)電路的晶體振蕩器的值為 12MHz,電容應盡可能的選擇陶瓷電容,電容值約為 22μF。在焊接刷電路板時,晶體振蕩器和電容應盡可能安裝得與單片機芯片靠近,以減少寄生電容,更好地保證震蕩器穩(wěn)定和可靠地工作。 </p><p> 3.
21、 復位 RST 9 </p><p> 在振蕩器運行時,有兩個機器周期(24個振蕩周期)以上的高電平出現(xiàn)在此引腿時,將使單片機復位,只要這個腳保持高電平,51芯片便循環(huán)復位。復位后 P0-P3口均置 1引腳表現(xiàn)為高電平,程序計數(shù)器和特殊功能寄存器 SFR全部清零。當復位腳由高電平變?yōu)榈碗娖綍r,芯片為 ROM的 00H處開始運行程序。復位是由外部的復位電路來實現(xiàn)的。片內(nèi)復位電路是復位引腳 RST通過一個斯密特觸發(fā)
22、器與復位電路相連,斯密特觸發(fā)器用來抑制噪聲,它的輸出在每個機器周期的S5P2,由復位電路采樣一次。復位電路通常采用上電自動復位和按鈕復位兩種方式,此電路系統(tǒng)采用的是上電與按鈕復位電路。當時鐘頻率選用6MHz時,C取22μF,Rs約為200Ω,Rk約為1K。復位操作不會對內(nèi)部RAM有所影響。 </p><p><b> 4.輸入輸出引腳 </b></p><p>
23、(1) P0端口[P0.0-P0.7] P0是一個8位漏極開路型雙向I/O端口,端口置1(對端口寫</p><p> 1)時作高阻抗輸入端。作為輸出口時能驅(qū)動8個TTL。 </p><p> 對內(nèi)部Flash程序存儲器編程時,接收指令字節(jié);校驗程序時輸出指令字節(jié),要求外接上位電阻。 </p><p> 在訪問外部程序和外部數(shù)據(jù)存儲器時,P0口是分時轉(zhuǎn)換的地址(
24、低 8位)/數(shù)據(jù)總線,訪問期間內(nèi)部的上拉電阻起作用。 </p><p> (2) P1端口[P1.0-P1.7] P1是一個帶有內(nèi)部上拉電阻的 8位雙向 I/0端口。輸出時可驅(qū)動4個TTL。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部Flash程序存儲器編程時,接收低 8位地址信息。 </p><p> (3) P2端口[P2.0-P2.7] P2是一個帶有內(nèi)部上拉電阻的
25、 8位雙向 I/0端口。輸出時可驅(qū)動 4個 TTL。端口置 1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對內(nèi)部 Flash程序存儲器編程時,接收高8位地址和控制信息。 </p><p> 在訪問外部程序和 16位外部數(shù)據(jù)存儲器時,P2口送出高 8位地址。而在訪問 8位地址的外部數(shù)據(jù)存儲器時其引腳上的內(nèi)容在此期間不會改變。 </p><p> (4) P3端口[P3.0-P3.7] P
26、2是一個帶有內(nèi)部上拉電阻的 8位雙向 I/0端口。輸出時可驅(qū)動4個TTL。端口置1時,內(nèi)部上拉電阻將端口拉到高電平,作輸入用。 </p><p> 對內(nèi)部Flash程序存儲器編程時,接控制信息。除此之外P3端口還用于一些專門功能,LED顯示電路顯示器普遍地用于直觀地顯示數(shù)字系統(tǒng)的運行狀態(tài)和工作數(shù)據(jù),按照材料及產(chǎn)品工藝,單片機應用系統(tǒng)中常用的顯示器有: 發(fā)光二極管LED顯示器、液晶LCD顯示器、CRT顯示器等。
27、</p><p> 發(fā)光二極管(LED)由特殊的半導體材料砷化鎵、磷砷化鎵等制成,可以單獨使用,也可以組裝成分段式或點陣式LED顯示器件(半導體顯示器)。分段式顯示器由7條線段圍成 8字型,每一段包含一個發(fā)光二極管。外加正向電壓時二極管導通,發(fā)出清晰的光。只要按規(guī)律控制各發(fā)光段亮、滅,就可以顯示各種字形或符號。LED數(shù)碼管有共陽、共LED液晶的原理和符號.。顯示電路顯示模塊需要實時顯示當前的時間,即時、分、秒,
28、因此需要,另需來顯示橫。采用動態(tài)顯示方式顯示時間,硬件連接如下圖所示,時的十位和個位分別顯示在分的十位和個位分別顯示在第四個和第五個秒的十位和個位分別顯示在,其余顯示橫線。LED顯示器的顯示控制方式按驅(qū)動方式可分成靜態(tài)顯示方式和動態(tài)顯示方式兩種。對于多位LED顯示器,通常都是采用動態(tài)掃描的方法進行顯示,其硬件連接方式。流80mA(每段 10mA);動態(tài):平均電流 4-5mA 峰值電流 100mA </p><p>
29、; 3.3 鍵盤控制電路 </p><p> 該設計需要校對時間,所以用三個按鍵來實現(xiàn)。按 khour來調(diào)節(jié)小時的時間,按來調(diào)節(jié)分針的時間,按 ksec來調(diào)節(jié)秒的時間。 </p><p> 時間隨鍵盤材料和操作員而異,不過通??偸遣淮笥?0ms。很容易想到,抖動問題不解決就會引起對閉合鍵的識別。用軟件方法可以很容易地解決抖動問題,這就是通過延</p><p>
30、; 第三章 數(shù)字鐘的軟件設計</p><p> 系統(tǒng)的軟件設計也是工具系統(tǒng)功能的設計。單片機軟件的設計主要包括執(zhí)行軟件(完成各種實質(zhì)性功能)的設計和監(jiān)控軟件的設計。單片機的軟件設計通常要考慮以下幾個方面的問題: </p><p> (1)根據(jù)軟件功能要求,將系統(tǒng)軟件劃分為若干個相對獨立的部分,設計出合理的總體結(jié)構(gòu),使軟件開發(fā)清晰、簡潔和流程合理; </p><p
31、> ?。?)培養(yǎng)良好的編程風格,如考慮結(jié)構(gòu)化程序設計、實行模塊化、子程序化。既便于調(diào)試、鏈接,又便于移植和修改; </p><p> (3)建立正確的數(shù)學模型,通過仿真提高系統(tǒng)的性能,并選取合適的參數(shù); </p><p> ?。?)繪制程序流程圖; </p><p> ?。?)合理分配系統(tǒng)資源; </p><p> ?。?)為程序加入
32、注釋,提高可讀性,實施軟件工程; </p><p> ?。?)注意軟件的抗干擾設計,提高系統(tǒng)的可靠性。 </p><p> 3.1 ds1302芯片的介紹</p><p> 對于市面上的大多數(shù)51單片機開發(fā)板來說。ds1302和ds18b20應該是比較常見的兩種外圍芯片。ds1302是具有SPI總線接口的時鐘芯片。ds18b20則是具有單總線接口的數(shù)字溫度傳感器
33、。下面讓我們分別來認識并學會應用這兩種芯片。 </p><p> 首先依舊是看DS1302的datasheet中的相關(guān)介紹。</p><p> DS1302是DALLAS公司推出的涓流充電時鐘芯片,內(nèi)含有一個實時時鐘/日歷和31字節(jié)靜態(tài)RAM,通過簡單的串行接口與單片機進行日歷電路通信。實時時鐘/日歷提供秒、分、時、日、日期、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動調(diào)整,時鐘操作可通
34、過AM/PM指示決定采用24或12小時格式。DS1302與單片機之間能簡單地采用同步串行的方式進行通信,僅需用到三個口線:(1)RES(復位),(2)I/O(數(shù)據(jù)線),(3)SCLK(串行時鐘)。時鐘/RAM的讀/寫數(shù)據(jù)以一個字節(jié)或多達31字節(jié)的字符組方式通信。DS1302工作時功耗很低,保持數(shù)據(jù)和時鐘信息時功耗小于1mW。 DS1302時由DS1202改進而來,增加了以下特性:雙電源管腳用于主電源和備份電源供應,Vccl為可編
35、程涓流充電電源,附加七個字節(jié)存儲器。它廣泛用于電話、傳真、便攜式儀器以及電池供電的儀器儀表等產(chǎn)品領域。下面將主要的性能指標作一綜合:●實時時鐘具有能計算2100年之前的秒、分、時、日、日期、星期、月、年的能力,還有閏年調(diào)整的能力●31X8為暫存數(shù)據(jù)存儲RAM●串行I/O口方式使得管腳數(shù)量最少●寬范圍工作電壓</p><p> 上面是它的一些基本的應用介紹。</p><p> 下
36、面是它的引腳的描述</p><p> 下面是DS1302的時鐘寄存器。我們要讀取的時間數(shù)據(jù)就是從下面這些數(shù)據(jù)寄存器中讀取出來的。當我們要想調(diào)整時間時,可以把時間數(shù)據(jù)寫入到相應的寄存器中就可以了。 </p><p> 這是DS1302內(nèi)部的31個RAM寄存器。在某些應用場合我們可以應用到。如我們想要做一個帶定時功能的鬧鐘。則可以把鬧鐘的時間寫入到31個RAM寄存器中的任意幾個。當單片機掉
37、電時,只要我們的DS1302的備用電池還能工作,那么保存在其中的鬧鐘數(shù)據(jù)就不會丟失。</p><p> 由于對于這些器件的操作基本上按照數(shù)據(jù)手冊上面提供的時序圖和相關(guān)命令字來進行操作就可以了。因此在我們應用這些器件的時候一定要對照著手冊上面的要求來進行操作。如果覺得還不夠放心的話??梢缘骄W(wǎng)上下載一些參考程序。對著手冊看別人的程序,看別人的思路是怎么樣的。 </p><p> DS130
38、2和單片機的連接很簡單。只需一根復位線,一根時鐘線,一根數(shù)據(jù)線即可。同時它本身還需要接一個32.768KHz的晶振來提供時鐘源。對于晶振的兩端可以分別接一個6PF左右的電容以提高晶振的精確度。同時可以在第8腳接上一個3.6V的可充電的電池。當系統(tǒng)正常工作時可以對電池進行涓流充電。當系統(tǒng)掉電時,DS1302由這個電池提供的能量繼續(xù)工作。 </p><p><b> 3.2 程序的實現(xiàn)</b>
39、</p><p> #include<reg51.h>//寄存器的定義</p><p> #include"ww.h"</p><p> #include <intrins.h></p><p> #include"delay.h"</p><p>
40、; sbit sck=P3^6;//時鐘</p><p> sbit io=P3^4;//數(shù)據(jù)</p><p> sbit rst = P3^5;// DS1302復位// DS1302復位</p><p> uchar time_data[7]={11,04,05,19,16,44,00};//年周月日時分秒</p><p>
41、; uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};</p><p> uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};</p><p> uchar dis[6];</p><p> void write_ds1302_byte(u
42、char dat)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<8;i++)//有八位脈沖,是串行的,</p><p><b> {</b></p><p>
43、; sck=0;//先是低電平</p><p> io=dat&0x01;//是從地位開始傳的 </p><p> sck=1;//拉高,把數(shù)據(jù)傳過去,完成</p><p> dat=dat>>1;//與完了,要移位操作</p><p><b> }</b></p><p
44、><b> }</b></p><p> void write_ds1302(uchar add, uchar dat)</p><p><b> {</b></p><p> rst=0;//rst是片選,先置低脈沖</p><p> _nop_();//不動</p>
45、<p> sck=0;_nop_();</p><p> rst=1;//是為了寫數(shù)據(jù)</p><p><b> _nop_();</b></p><p> write_ds1302_byte(add);//傳數(shù)據(jù)</p><p> write_ds1302_byte(dat);//傳數(shù)據(jù)</
46、p><p> rst=0;//保持,因為他比較敏感</p><p><b> _nop_();</b></p><p> io=1;//釋放出</p><p> sck=1;//釋放出</p><p><b> }</b></p><p> u
47、char read_ds1302(uchar add)</p><p><b> {</b></p><p> uchar i,value;</p><p><b> rst=0;</b></p><p><b> _nop_();</b></p><
48、;p> sck=0;_nop_();</p><p><b> rst=1;</b></p><p><b> _nop_();</b></p><p> write_ds1302_byte(add);</p><p> for(i=0;i<8;i++)</p>
49、<p><b> {</b></p><p> value=value>>1;</p><p><b> sck=0;</b></p><p><b> if(io)</b></p><p> value=value|0x80;</p>
50、;<p><b> sck=1;</b></p><p><b> }</b></p><p><b> rst=0;</b></p><p><b> _nop_();</b></p><p><b> sck=0;&l
51、t;/b></p><p><b> sck=1;</b></p><p><b> io=1;</b></p><p> return value;</p><p><b> }</b></p><p> void set_rtc(vo
52、id)//設置時間</p><p><b> {</b></p><p> uchar i,j;</p><p> for(i=0;i<7;i++)</p><p><b> {</b></p><p> j=time_data[i]/10;</p>
53、;<p> time_data[i]=time_data[i]%10;</p><p> time_data[i]=time_data[i]+j*16;//轉(zhuǎn)換bcd碼</p><p><b> }</b></p><p> write_ds1302(0x8e,0x00);//去除寫保護</p><p&
54、gt; for(i=0;i<7;i++)//往里寫數(shù)據(jù)</p><p><b> {</b></p><p> write_ds1302(write_add[i],time_data[i]);</p><p><b> }</b></p><p> write_ds1302(0x8e
55、,0x80);//加除寫保護</p><p><b> }</b></p><p> void read_rtc(void)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i
56、=0;i<7;i++)</p><p><b> {</b></p><p> time_data[i]=read_ds1302(read_add[i]);</p><p><b> }</b></p><p><b> }</b></p><
57、p> /*void time_pros()</p><p><b> {</b></p><p> dis[1]=time_data[6]/16;</p><p> dis[2]=time_data[5]%16;</p><p> dis[3]=time_data[5]/16;</p>&l
58、t;p> dis[4]=time_data[4]%16;</p><p> dis[5]=time_data[4]/16;</p><p><b> } */</b></p><p> #ifndef __WW_H__</p><p> #define __WW_H__</p><p&
59、gt; #include"delay.h"</p><p> //uchar time_data[7]={0,0,12,15,5,3,00};</p><p> //uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};</p><p> //uchar read_add[7]={
60、0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};</p><p> //uchar dis[6];</p><p> void write_ds1302_byte(uchar dat);</p><p> void write_ds1302(uchar add, uchar dat);</p><p> uch
61、ar read_ds1302(uchar add);</p><p> void set_rtc(void);</p><p> void read_rtc(void);</p><p> //void time_pros(void);//轉(zhuǎn)換十進制</p><p> //void display(void);</p>
62、<p><b> #endif</b></p><p><b> 延時函數(shù)文件</b></p><p> #include"delay.h"</p><p> void delayms(uint xms)</p><p><b> {</b&
63、gt;</p><p><b> uint i,j;</b></p><p> for(i=xms;i>0;i--)</p><p> for(j=110;j>0;j--);</p><p><b> } </b></p><p> void delay
64、(uint t)</p><p><b> {</b></p><p> while(t--);</p><p><b> }</b></p><p> void delay_50ms(uint t)</p><p><b> {</b><
65、;/p><p><b> uchar j;</b></p><p> for(;t>0;t--)</p><p> for(j=6245;j>0;j--);</p><p><b> }</b></p><p> #ifndef __DELAY_H__<
66、;/p><p> #define __DELAY_H__ </p><p> #define uint unsigned int </p><p> #define uchar unsigned char</p><p> void delayms(uint xms);</p><p> void delay
67、(uint t);</p><p> void delay_50ms(uint t);</p><p><b> #endif</b></p><p> 有了上面的這些函數(shù)我們就可以對DS1302進行操作了。當我們想要獲取當前時間時,只需要調(diào)用( void )這個函數(shù)即可。讀取到的時間數(shù)據(jù)保存在這個結(jié)構(gòu)體中 </p><
68、;p> 3.3 DS18B20溫度管的介紹</p><p> 下面再讓我們看看DS18B20吧。 </p><p> 全數(shù)字溫度轉(zhuǎn)換及輸出。</p><p> 先進的單總線數(shù)據(jù)通信。</p><p> 最高12位分辨率,精度可達+-0.5攝氏度。</p><p> 12位分辨率的最大周期為750毫秒
69、。</p><p><b> 可選擇寄生工作方式</b></p><p> 檢測溫度為-50’C~+125’C(-67’+257’F)</p><p> 內(nèi)置EEPROM,,限溫報警功能。</p><p> 64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機掛接。</p><p> 多樣封裝形式
70、,適應不同硬件系統(tǒng)。</p><p> DS18B20的內(nèi)部存儲器分為以下幾部分 </p><p> ROM:存放該器件的編碼。前8位為單線系列的編碼(DS18B20的編碼是19H)后面48位為芯片的唯一序列號。在出場的時候就已經(jīng)設置好,用戶無法更改。最后8位是以上56位的CRC碼。 </p><p> RAM:DS18B20的內(nèi)部暫存器共9個字節(jié)。其中第一
71、個和第二個字節(jié)存放轉(zhuǎn)換后的溫度值。第二個和第三個字節(jié)分別存放高溫和低溫告警值。(可以用RAM指令將其拷貝到EEPROM中)第四個字節(jié)為配置寄存器。第5~7個字節(jié)保留。第9個字節(jié)為前8個字節(jié)的CRC碼。</p><p> DS18B20的溫度存放如上圖所示。其中S位符號位。當溫度值為負值時,S = 1 ,反之則S = 0 。我們把得到的溫度數(shù)據(jù)乘上對應的分辨率即可以得到轉(zhuǎn)換后的溫度值。 </p>&
72、lt;p> DS18B20的通訊協(xié)議: </p><p> 在對DS18B20進行讀寫編程時,必須嚴格保證讀寫的時序。否則將無法讀取測溫結(jié)果。根據(jù)DS18B20的通訊協(xié)議,主機控制DS18B20完成溫度轉(zhuǎn)換必須經(jīng)過3個步驟:每一次讀寫之前都要對DS18B20進行復位,復位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令。這樣才能對DS18B20進行預定的操作。 </p><p>
73、復位要求主機將數(shù)據(jù)線下拉500us,然后釋放,DS18B20收到信號后等待16~160us然后發(fā)出60~240us的</p><p> 存在低脈沖,主機收到此信號表示復位成功。</p><p> 上圖即DS18B20的復位時序圖。 </p><p> 下面是讀操作的時序圖</p><p><b> 這是寫操作的時序圖<
74、/b></p><p> 3.4 DS18B20的程序</p><p> #include<reg51.h></p><p> #include"ss.h"</p><p> #include"delay.h"</p><p> void init_
75、1(void)</p><p><b> {</b></p><p><b> uchar x;</b></p><p><b> DQ=1;</b></p><p><b> delay(8);</b></p><p>&
76、lt;b> DQ=0;</b></p><p> delay(80);</p><p><b> DQ=1;</b></p><p><b> delay(8);</b></p><p><b> x=DQ;</b></p><p
77、><b> delay(4);</b></p><p><b> }</b></p><p> void write_byle(uchar date)</p><p><b> {</b></p><p><b> uchar i;</b>
78、</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p><b> DQ=0;</b></p><p> DQ=date&0x01; </p><p><b> delay(4);</b
79、></p><p><b> DQ=1;</b></p><p> date=date>>1;</p><p><b> }</b></p><p><b> delay(4);</b></p><p><b> }
80、</b></p><p> uchar read_byle(void)</p><p><b> {</b></p><p> uchar i,value;</p><p> for(i=0;i<8;i++)</p><p><b> {</b>&
81、lt;/p><p><b> DQ=0;</b></p><p> value>>=1;</p><p><b> DQ=1;</b></p><p><b> if(DQ)</b></p><p> value=value|0x80;
82、</p><p><b> delay(4);</b></p><p><b> }</b></p><p> return value;</p><p><b> }</b></p><p> uchar temupt(void)</p
83、><p><b> {</b></p><p> uchar a,b;</p><p><b> init_1();</b></p><p> write_byle(0xcc);</p><p> write_byle(0x44);</p><p&g
84、t; delay(10);</p><p><b> init_1();</b></p><p> write_byle(0xcc);</p><p> write_byle(0xbe);</p><p> a=read_byle();</p><p> b=read_byle();&
85、lt;/p><p><b> b<<=4;</b></p><p> b+=(a&0xf0)>>4;</p><p><b> return b;</b></p><p><b> }</b></p><p> #i
86、fndef __SS_H__</p><p> #define __SS_H__</p><p> #include<reg51.h></p><p> #include"delay.h"</p><p> sbit DQ=P3^7;</p><p> void init_1(
87、void);</p><p> void write_byle(uchar date);</p><p> uchar read_byle(void);</p><p> uchar temupt(void);</p><p><b> #endif</b></p><p><b&g
88、t; 延時函數(shù)文件</b></p><p> #include"delay.h"</p><p> void delayms(uint xms)</p><p><b> {</b></p><p><b> uint i,j;</b></p>
89、<p> for(i=xms;i>0;i--)</p><p> for(j=110;j>0;j--);</p><p><b> } </b></p><p> void delay(uint t)</p><p><b> {</b></p>&l
90、t;p> while(t--);</p><p><b> }</b></p><p> void delay_50ms(uint t)</p><p><b> {</b></p><p><b> uchar j;</b></p><p&
91、gt; for(;t>0;t--)</p><p> for(j=6245;j>0;j--);</p><p><b> }</b></p><p> #ifndef __DELAY_H__</p><p> #define __DELAY_H__ </p><p>
92、#define uint unsigned int </p><p> #define uchar unsigned char</p><p> void delayms(uint xms);</p><p> void delay(uint t);</p><p> void delay_50ms(uint t);</p>
93、;<p><b> #endif</b></p><p><b> 液晶c語言程序設計</b></p><p> #include <reg51.h></p><p> #include"smg.h"</p><p> #include&quo
94、t;delay.h"</p><p> sbit rd = P2^6; </p><p> sbit rw = P2^5;</p><p> sbit ep = P2^7; </p><p> //uchar table[]="I LOVE MUC";</p>
95、<p> //uchar code table1[]="WWW.BAIDU.COM";</p><p> void write_tt(uchar tt)</p><p><b> {</b></p><p><b> ep=0;</b></p><p><
96、;b> rd=0;</b></p><p><b> rw=0;</b></p><p><b> P0=tt;</b></p><p> delayms(1);</p><p><b> ep=1;</b></p><p>
97、 delayms(1);</p><p> ep=0;</p><p> } </p><p> void write_com(uchar dat)</p><p><b> {</b></p><p><b> ep=0;<
98、/b></p><p><b> rd=1;</b></p><p><b> rw=0;</b></p><p><b> P0=dat;</b></p><p> delayms(1);</p><p><b> ep=1;
99、</b></p><p> delayms(1);</p><p><b> ep=0;</b></p><p><b> }</b></p><p> void init(void)</p><p><b> {</b><
100、;/p><p> delayms(15);</p><p> write_tt(0x38);</p><p> delayms(5);</p><p> write_tt(0x38);</p><p> delayms(5);</p><p> write_tt(0x38);</p
101、><p> write_tt(0x38);</p><p> write_tt(0x08);</p><p> write_tt(0x01);</p><p> write_tt(0x06);</p><p> write_tt(0x0c);</p><p><b> }<
102、;/b></p><p> #ifndef __SMG_H__</p><p> #define __SMG_H__</p><p> #include"delay.h"</p><p> //uchar table[]="I LOVE MUC";</p><p>
103、; void write_tt(uchar tt);</p><p> void write_com(uchar dat);</p><p> void init(void);</p><p><b> #endif</b></p><p> 如果想獲取當前的溫度數(shù)據(jù),在主函數(shù)中調(diào)用 ( void )就可以了。
104、溫度數(shù)據(jù)就保存到Temperature中去了。</p><p><b> 3.5主函數(shù)</b></p><p> #include"ss.h"</p><p> #include"smg.h"</p><p> #include"delay.h"<
105、/p><p> #include"ww.h"</p><p><b> bit flag;</b></p><p> uchar time_data[];</p><p> //uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};<
106、/p><p> //uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};</p><p> //uchar table[]="2";</p><p> uchar disp[]="0123456789";</p><p> //uchar
107、 table[]="℃ ";</p><p> void main()</p><p><b> {</b></p><p> uchar temp;</p><p><b> init();</b></p><p> // set_rtc();
108、</p><p><b> while(1)</b></p><p><b> {</b></p><p> read_rtc();</p><p> //time_pros();</p><p> write_tt(0x80);</p><p&
109、gt; write_com(disp[time_data[4]/16]);</p><p> write_tt(0x81);</p><p> write_com(disp[time_data[4]%16]);</p><p> delay_50ms(20);</p><p><b> if(flag)</b>
110、</p><p><b> {</b></p><p> write_tt(0x82);</p><p> write_com(':');</p><p> write_tt(0x85);</p><p> write_com(':');</p>
111、;<p> delay(55500); </p><p><b> flag=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
112、<p> write_tt(0x82);</p><p> write_com(' ');</p><p> write_tt(0x85);</p><p> write_com(' ');</p><p> delay(55500);</p><p><b&
113、gt; flag=1; </b></p><p><b> }</b></p><p> write_tt(0x83);</p><p> write_com(disp[time_data[5]/16]);</p><p> write_tt(0x84);</p><p>
114、 write_com(disp[time_data[5]%16]);</p><p> delay_50ms(20);</p><p> write_tt(0x86);</p><p> write_com(disp[time_data[6]/16]);</p><p> write_tt(0x87);</p><
115、p> write_com(disp[time_data[6]%16]);</p><p> delay_50ms(20);</p><p> write_tt(0x8b);</p><p> write_com(disp[time_data[1]/16]);</p><p> write_tt(0x8c);</p>
116、<p> write_com(disp[time_data[1]%16]);</p><p> delay_50ms(20);</p><p> write_tt(0x80+0x45);</p><p> write_com('2');</p><p> write_tt(0x80+0x46);<
117、/p><p> write_com('0');</p><p> delay_50ms(20); </p><p> write_tt(0x80+0x47);</p><p> write_com(disp[time_data[0]/16]);</p><p> write_tt(0x80+0x4
118、8);</p><p> write_com(disp[time_data[0]%16]);</p><p> delay_50ms(20);</p><p> write_tt(0x80+0x49);</p><p> write_com('-');</p><p> write_tt(0x
119、80+0x4a);</p><p> write_com(disp[time_data[2]/16]);</p><p> write_tt(0x80+0x4b);</p><p> write_com(disp[time_data[2]%16]);</p><p> delay_50ms(20);</p><p&
120、gt; write_tt(0x80+0x4c);</p><p> write_com('-'); </p><p> write_tt(0x80+0x4d);</p><p> write_com(disp[time_data[3]/16]);</p><p> write_tt(0x80+0x4e);</p
121、><p> write_com(disp[time_data[3]%16]);</p><p> delay_50ms(20); </p><p> temp=temupt();</p><p> write_tt(0x80+0x40);</p><p> write_com(disp[temp/10]);<
122、;/p><p> delay(50);</p><p> write_tt(0x80+0x41);</p><p> write_com(disp[temp%10]);</p><p> delay(50);</p><p> write_tt(0x80+0x42);</p><p>
123、write_com(0xa5);</p><p> write_tt(0x80+0x43);</p><p> write_com('c');</p><p><b> }</b></p><p><b> }</b></p><p>
124、第四章 調(diào)試與功能說明</p><p> 單片機應用系統(tǒng)的調(diào)試包括硬件和軟件兩部分,但是他們并不能完全分開。一般的方法</p><p> 是排除明顯的硬件故障,再進行綜合調(diào)試,排除可能的軟/硬件故障。 </p><p><b> 4.1 硬盤調(diào)試 </b></p><p> 拿到電路板后,首先要檢查加工質(zhì)量,并
125、確保沒有任何方面的錯誤,如短路和斷路,尤</p><p> 其要避免電源短路;元器件在安裝前要逐一檢查,用萬用表測其數(shù)值,看是否與所用相同;</p><p> 完成焊接后,應先空載上電(芯片座上不插芯片),并檢查各引腳的電位是否正確。若一切</p><p> 正常,方可在斷電的情況下將芯片插入,再次檢查各引腳的電位及其邏輯關(guān)系。將萬用表的</p>
126、<p> 探針放到單片機接電源的引腳上檢測一下,看是否符合要求。 </p><p> 4.2 系統(tǒng)性能測試與功能說明 </p><p> 走時:默認為走時狀態(tài),按 24小時制分別顯示“時時-分分-秒秒”,有 2個“-”動態(tài)</p><p> 顯示,時間會按實際時間以秒為最少單位變化。 </p><p> 走時調(diào)整:按
127、ksec對秒進行調(diào)整,按一下加一秒;按 kmin對分進行調(diào)整,按一下加一</p><p> 分;按khour對時進行調(diào)整,按一下加一小時,從而達到快速設定時間的目的。 </p><p> 4.3 系統(tǒng)時鐘誤差分析 </p><p> 時間是一個基本物理量,具有連續(xù)、自動流逝、不重復等特性。我國時間基準來自國家</p><p> 授時中
128、心,人們?nèi)粘J褂玫臅r鐘就是以一定的精度與該基準保持同步的。結(jié)合時間概念和誤</p><p> 差理論,可以定義電子鐘的走時誤差 S=S1-S2,S1表示程序?qū)嶋H運行計算所得的秒;S2表示</p><p> 客觀時間的標準秒。S>0時表示電子鐘秒單元數(shù)值刷新滯后,即走時誤差為“慢”;反之,</p><p> S<0表示秒單元數(shù)值的刷新超前,即走時誤差
129、為“快”。 </p><p> 本次設計的單片機電子鐘系統(tǒng)中,其誤差主要來源包括晶體頻率誤差,定時器溢出誤差,</p><p> 延遲誤差。晶體頻率產(chǎn)生震蕩,容易產(chǎn)生走時誤差;定時器溢出的時間誤差,本應這一秒溢</p><p> 出,但卻在下一秒溢出,造成走時誤差;延遲時間過長或過短,都會造成與基準時間產(chǎn)生偏</p><p> 差,造
130、成走時誤差。 </p><p> 4.4 軟件調(diào)試問題及解決 </p><p> 軟件程序的調(diào)試一般可以將重點放在分模塊調(diào)試上,統(tǒng)調(diào)是最后一環(huán)。軟件調(diào)試可以采</p><p> 取離線調(diào)試和在線調(diào)試兩種方式。前者不需要硬件仿真器,可借助于軟件仿真器即可;后者</p><p> 一般需要仿真系統(tǒng)的支持。本次課題,Keil軟件來調(diào)試程序,
131、通過各個模塊程序的單步或跟</p><p> 蹤調(diào)試,使程序逐漸趨于正確,最后統(tǒng)調(diào)程序。 </p><p> 仿真部分采用 protus 6 professional軟件,此軟件功能強大且操作較為簡單,可以很</p><p> 容易的實現(xiàn)各種系統(tǒng)的仿真。 </p><p> 首先打開 protus 6 professional軟件,在
132、元件庫中找到要選用的所有元件,然后進行</p><p> 原理圖的繪制;繪制好后再選擇wave6000已經(jīng)編譯好的*.hex文件,選擇運行,觀察顯示結(jié)</p><p> 果,根據(jù)顯示的結(jié)果和課題的要求再修改程序,再運行查,直到滿足要求。 </p><p> 第五章 單片機的應用特點和應用領域</p><p> 5.1 單片機的特點&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機萬年歷系統(tǒng)畢業(yè)設計
- 基于單片機的萬年歷畢業(yè)設計
- 畢業(yè)設計---基于單片機萬年歷的設計
- 畢業(yè)設計---基于單片機萬年歷的設計
- 基于單片機的萬年歷設計畢業(yè)設計
- 基于單片機的萬年歷設計畢業(yè)設計
- 51單片機萬年歷畢業(yè)設計論文
- 基于單片機的測溫萬年歷畢業(yè)設計
- 基于51單片機的萬年歷畢業(yè)設計
- 基于單片機的電子萬年歷畢業(yè)設計
- 畢業(yè)設計---基于51單片機的萬年歷設計
- 畢業(yè)設計---基于51單片機的萬年歷設計
- 基于單片機的電子萬年歷設計畢業(yè)設計
- 畢業(yè)設計---基于單片機的數(shù)字萬年歷設計
- 基于單片機的萬年歷設計畢業(yè)設計.doc
- 單片機的電子萬年歷設計
- 畢業(yè)設計--基于單片機控制1602液晶的萬年歷
- 畢業(yè)設計----基于單片機的電子萬年歷的設計
- 基于單片機的電子萬年歷的設計畢業(yè)設計
- 單片機課程設計--萬年歷
評論
0/150
提交評論