版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 電氣與電子信息工程學院</p><p> 單片機原理及應用課程設計報告</p><p> 設計題目: 多功能數字溫度計設計 </p><p> 專業(yè)班級: 電子信息科學與技術082 </p><p> 學生姓名: </p><p> 學 號
2、: </p><p> 指導教師: </p><p> 設計時間: 2011.08.22-2011.09.02 </p><p><b> 一、內容摘要</b></p><p> 隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它
3、所給人帶來的方便也是不可否定的,其中數字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現代人工作、科研、生活、提供更好的更方便的設施就需要從數字單片機技術入手,一切向著數字化控制,智能化控制方向發(fā)展。</p><p> 本設計所介紹的數字溫度計與傳統(tǒng)的溫度計相比,具有讀數方便,測溫范圍廣,測溫準確,其輸出溫度采用數字顯示,主要用于對測溫比較準確的場所,或科研實驗室使用,該設計控制器使用單片機ATS89
4、C51,測溫傳感器使用DS18B20,用4位共陰極LED數碼管以串口傳送數據,實現溫度顯示,能準確達到以上要求。溫度測量在物理實驗、醫(yī)療衛(wèi)生、食品生產等領域,尤其在熱學試驗(如:物體的比熱容、汽化熱、熱功當量、壓強溫度系數等教學實驗)中,有特別重要的意義?,F在所使用的溫度計通常都是精度為1℃和0.1℃的水銀、煤油或酒精溫度計。這些溫度計的刻度間隔通常都很密,不容易準確分辨,讀數困難,而且他們的熱容量還比較大,達到熱平衡所需的時間較長,因
5、此很難讀準,并且使用非常不方便。本設計所介紹的數字溫度計與傳統(tǒng)的溫度計相比,具有讀數方便,測溫范圍廣,測溫準確等優(yōu)點,其輸出溫度采用數字顯示,主要用于對測溫比較準確的場所,或科研實驗室使用。因此本課題就嘗試通過編程與芯片的結合來解決傳統(tǒng)數字溫度計的弊端,設計出新型數字溫度計。</p><p><b> 二、課程設計目的</b></p><p> 1了解單片機的構造
6、及原理。</p><p> 2熟悉單片機最小系統(tǒng)及其應用。 </p><p> 3鞏固和加強“單片機接口技術”課程的理論知識</p><p> 4掌握單片機系統(tǒng)一般的設計方法,并了解電子產品研制開發(fā)過程;</p><p> 5培養(yǎng)獨立分析問題和解決問題的能力以及創(chuàng)新能力和創(chuàng)新思維。 分析問題和解決問題的能力以及創(chuàng)新能力和創(chuàng)新思維。&l
7、t;/p><p><b> 三、課程設計題目</b></p><p> 多功能數字溫度計設計</p><p><b> 四、課程內容及要求</b></p><p><b> 1、設計內容</b></p><p> 多功能數字溫度計設計具有如下功能:
8、</p><p> ① 輸出溫度和時鐘采用4位LED數碼管顯示。</p><p> ② 設計控制器使用MCS-51系列單片機,溫度傳感受器使用DS18B20,用位數碼管以并行傳送數據。</p><p> ?、?采用數字式溫度計傳感受器為檢測元件,進行單點溫度檢測。</p><p> ?、?能夠顯示當前的環(huán)境溫度,精確到小數點后1位。;&l
9、t;/p><p> ?、?自定義的擴展功能。</p><p><b> 2、設計要求</b></p><p> 1)獨立設計原理圖及相應的硬件電路。</p><p> 2)針對選擇的設計題目,設計系統(tǒng)軟件。軟件要做到:操作方便,實用性強,穩(wěn)定可靠。</p><p> 3)設計說明書格式規(guī)范,層
10、次合理,重點突出。并附上設計原理圖及相應的源程序。</p><p><b> 五、電路工作原理</b></p><p><b> 1、設計方案</b></p><p><b> 方案一</b></p><p> 由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫
11、效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉換后,就可以用單片機進行數據的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉換電路,感溫電路比較麻煩。</p><p><b> 方案二 </b></p><p> 進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS
12、18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。</p><p> 從以上兩種方案,很容易看出,采用方案二,電路比較簡單,軟件設計也比較簡單,故采用了方案二。</p><p><b> 2、器件介紹</b></p><p> 1)單片機引腳及功能</p><p><b>
13、 VCC:供電電壓。</b></p><p><b> GND:接地。</b></p><p> P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P
14、0輸出原碼,此時P0外部必須被拉高。</p><p> P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p> P2口:P2口為一個內部上拉電阻的8位雙向I/O口,
15、P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優(yōu)勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。
16、</p><p> P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89C51的一些特殊功能口,如下表所示:口管腳 備選功能P3.0 RXD(串行輸入口)P3.1 TXD(串行輸出口)P3.2 /INT0(外部中斷0
17、)P3.3 /INT1(外部中斷1)P3.4 T0(記時器0外部輸入)P3.5 T1(記時器1外部輸入)P3.6 /WR(外部數據存儲器寫選通)P3.7 /RD(外部數據存儲器讀選通)P3口同時為閃爍編程和編程校驗接收一些控制信號。</p><p> RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。</p><p> ALE/PROG:當訪問外
18、部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外
19、部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。</p><p> /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RE
20、SET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p> XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。 </p><p> AT89C51引腳圖</p><p> 2)DS18B20介紹</p><p> 這
21、里我們用到溫度芯片DS18B20。使用集成芯片,能夠有效的減小外界的干擾,提高測量的精度,簡化電路的結構。使用集成芯片,已經慢慢的成為設計電路的一種趨勢。本系統(tǒng)使用溫度芯片也正是順應了這一趨勢。DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據實際要求通過簡單的編程實現9~12位的數字值讀數方式。DS18B20的性能特點如下:</
22、p><p> ●獨特的單線接口僅需要一個端口引腳進行通信;</p><p> ●多個DS18B20可以并聯在惟一的三線上,實現多點組網功能;</p><p><b> ●無須外部器件;</b></p><p> ●可通過數據線供電,電壓范圍為3.0~5.5V;</p><p><b>
23、; ●零待機功耗;</b></p><p> ●溫度以9或12位數字;</p><p> ●用戶可定義報警設置;</p><p> ●報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;</p><p> ●負電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p
24、> DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內部結構框圖如圖所示。</p><p> DS18B20內部結構</p><p> 64位ROM的結構開始8位是產品類型的編號 ,接著是每個器件的惟一的序號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。<
25、;/p><p> DS18B20溫度傳感器的內部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節(jié)的存儲器,結構如圖3所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電復位時被刷新。第5個字節(jié),為配置寄存器,它的內容用于確定溫度值的數字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數值。該字節(jié)各位的定義如圖1 所
26、示。低5位一直為1,TM是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數,來設置分辨率。</p><p> 圖1 DS18B20字節(jié)定義</p><p> 由表1可見,DS18B20溫度轉換的時間比較長,而且分辨率越高,所需要的溫度數據轉換時間越長。因此,在實際應用中要將分辨率和轉換時間權
27、衡考慮。</p><p> 高速暫存RAM的第6、7、8字節(jié)保留未用,表現為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗數據,從而保證通信數據的正確性。</p><p> 當DS18B20接收到溫度轉換命令后,開始啟動轉換。轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第1、2字節(jié)。單片機可以通過單線接口讀出該數據,讀數據時低位在先,高位在后
28、,數據格式以0.0625℃/LSB形式表示。</p><p> 當符號位S=0時,表示測得的溫度值為正值,可以直接將二進制位轉換為十進制;當符號位S=1時,表示測得的溫度值為負值,要先將補碼變成原碼,再計算十進制數值。表2 是一部分溫度值對應的二進制溫度數據。</p><p> 表1 DS18B20溫度轉換時間表</p><p> DS18B20完成溫度轉換
29、后,就把測得的溫度值與RAM中的TH、TL字節(jié)內容作比較。若T>TH或T<TL,則將該器件內的報警標志位置位,并對主機發(fā)出的報警搜索命令作出響應。因此,可用多只DS18B20同時測量溫度并進行報警搜索。</p><p> 在64位ROM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗碼(CRC)。主機ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到的ROM數據是否正確。</p>
30、;<p> DS18B20的測溫原理是這這樣的,器件中低溫度系數晶振的振蕩頻率受溫度的影響很小,用于產生固定頻率的脈沖信號送給減法計數器1;高溫度系數晶振隨溫度變化其振蕩頻率明顯改變,所產生的信號作為減法計數器2的脈沖輸入。器件中還有一個計數門,當計數門打開時,DS18B20就對低溫度系數振蕩器產生的時鐘脈沖進行計數進而完成溫度測量。計數門的開啟時間由高溫度系數振蕩器來決定,每次測量前,首先將-55℃所對應的一個基數分別
31、置入減法計數器1、溫度寄存器中,計數器1和溫度寄存器被預置在-55℃所對應的一個基數值。減法計數器1對低溫度系數晶振產生的脈沖信號進行減法計數,當減法計數器1的預置值減到0時,溫度寄存器的值將加1,減法計數器1的預置將重新被裝入,減法計數器1重新開始對低溫度系數晶振產生的脈沖信號進行計數,如此循環(huán)直到減法計數器計數到0時,停止溫度寄存器的累加,此時溫度寄存器中的數值就是所測溫度值。其輸出用于修正減法計數器的預置值,只要計數器門仍未關閉就
32、重復上述過程,直到溫度寄存器值大致被測溫度值。</p><p> 表2 一部分溫度對應值表</p><p> 另外,由于DS18B20單線通信功能是分時完成的,它有嚴格的時隙概念,因此讀寫時序很重要。系統(tǒng)對DS18B20的各種操作按協議進行。操作協議為:初使化DS18B20(發(fā)復位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數據。</p><p><b
33、> 2、單元電路介紹</b></p><p><b> 1)主控制器</b></p><p> 單片機AT89C51具有低電壓供電和體積小等特點,只需要少量I/O口就能滿足要求,很適合便攜手持式半產品的設計使用系統(tǒng)可用二節(jié)電池供電。</p><p><b> 2)顯示電路</b></p>
34、;<p> 顯示電路采用4位共陽LED數碼管,P2口控制數碼管段選,P0口控制數碼管位選,本設計采用三極管驅動。</p><p> 3)DS18B20溫度傳感器與單片機的接口電路</p><p> DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源。另一種是寄生電源供電方式,如圖2 所示單片機端口接單線
35、總線,為保證在有效的DS18B20時鐘周期內提供足夠的電流,可用一個MOSFET管來完成對總線的上拉。當DS18B20處于寫存儲器操作和溫度A/D轉換操作時,總線上必須有強的上拉,上拉開啟時間最大為10us。采用寄生電源供電方式時VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。</p><p> 圖2 DS18B20與單片機的接口電路</p><p><b>
36、六、硬件系統(tǒng)框圖</b></p><p> 溫度計、時鐘電路設計總體設計框圖如圖所示,控制器采用單片機AT89S51,溫度傳感器采用DS18B20,用4位LED數碼管以并行傳送數據實現溫度、時鐘的顯示。</p><p><b> 七、完整的電路圖</b></p><p> 八、系統(tǒng)軟件設計框圖</p><p
37、><b> 1、主程序</b></p><p> 主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量的當前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內測量一次被測溫度,其程序流程見圖3所示。</p><p><b> 2、讀出溫度子程序</b></p><p> 讀出溫度子程序的主要功
38、能是讀出RAM中的9字節(jié),在讀出時需進行CRC校驗,校驗有錯時不進行溫度數據的改寫。其程序流程圖如圖4所示。</p><p> 圖3主程序流程圖 圖4讀溫度流程圖</p><p> 3、溫度轉換命令子程序</p><p> 溫度轉換命令子程序主要是發(fā)溫度轉換開始命令,當采用12位分辨率時轉換時間約為750ms,在本程序設計中采用1s顯示
39、程序延時法等待轉換的完成。溫度轉換命令子程序流程圖如上圖,圖5所示。</p><p><b> 圖5溫度轉換流程</b></p><p><b> 4、計算溫度子程序</b></p><p> 計算溫度子程序將RAM中讀取值進行BCD碼的轉換運算,并進行溫度值正負的判定,其程序流程圖如圖6所示。</p>
40、<p><b> 圖6計算溫度流程圖</b></p><p> 5、顯示數據刷新子程序</p><p> 顯示數據刷新子程序主要是對顯示緩沖器中的顯示數據進行刷新操作,當最高顯示位為0時將符號顯示位移入下一位。程序流程圖如圖7</p><p> 圖7顯示數據刷新流程圖</p><p><b>
41、; 6、時鐘顯示子程序</b></p><p><b> 九、源程序設計</b></p><p> #include <reg51.h></p><p> #include"intrins.h"</p><p> #define uchar unsigned char
42、</p><p> #define uint unsigned int</p><p> uchar min,sec,hour,counts,flm,hsec,time[8];</p><p> unsigned int j=0; </p>&
43、lt;p> unsigned char dispbitcode[8]={0xfe,0xfd,0xf7,0xfb}; //位掃描</p><p> unsigned char dispcode[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa7,0xFF}; //共陽數碼管段碼</p><p> unsigne
44、d char dispbuf[4]; </p><p> sbit P1_3=P1^0;</p><p> sbit P1_4=P1^4;</p><p> sbit P1_1=P1^5;</p><p> sbit DQ=P3^6;</p><p> bit flag_
45、P=0,flag_M=0;</p><p> void delay(uint t)</p><p> {for (; t>0 ; t--);</p><p><b> }</b></p><p> void time1(void) interrupt 3 using 0 </p><p
46、><b> { </b></p><p><b> hsec++;</b></p><p><b> TL1=0xF3;</b></p><p><b> TH1=0xD8;</b></p><p><b> TF1=0;<
47、/b></p><p> if(hsec==100)</p><p><b> { sec++;</b></p><p><b> hsec=0;}</b></p><p> if(sec==60)</p><p><b> { min++;<
48、/b></p><p><b> sec=0;}</b></p><p> if(min==60)</p><p><b> { hour++;</b></p><p><b> min=0;}</b></p><p> if(hour=
49、=24)</p><p><b> { hour=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> void add_time(void)</p><p> { switch(coun
50、ts)</p><p> { case 1: min++;</p><p> min=min%60;</p><p><b> break;</b></p><p> case 2: hour++;</p><p> hour=hour%24;</p><p>&
51、lt;b> break;</b></p><p><b> }</b></p><p> return; }</p><p> void sub_time(void)</p><p> { switch(counts)</p><p> { case 1: if(
52、min==0) {min=60;};</p><p><b> min--;</b></p><p><b> break;</b></p><p> case 2: if(hour==0) {hour=24;};</p><p><b> hour--;</b><
53、;/p><p><b> break; }</b></p><p><b> return;</b></p><p><b> }</b></p><p> void check_button(void)</p><p> { if(P1_1=
54、=0&&flag_P==0)</p><p> {delay(300);</p><p> if(P1_1==0)</p><p> { flag_P=1;</p><p><b> TR1=0;</b></p><p><b> counts++;</b
55、></p><p> if(counts>=3)</p><p> {counts=0;</p><p> TR1=1;}}} </p><p> if(P1_3==0&&flag_P==0)</p><p> { delay(300);</p><p>
56、 if(P1_3==0)</p><p> {flag_P=1;</p><p> add_time();}}</p><p> if(P1_4==0&&flag_P==0)</p><p> { delay(300);</p><p> if(P1_4==0)</p><
57、p> {flag_P=1;</p><p> sub_time();}}</p><p> if(flag_P&&P1_1==1&&P1_3==1&&P1_4==1)</p><p> { flag_P=0;}</p><p><b> return ;</b&g
58、t;</p><p><b> }</b></p><p> ///******************算法24小時制*******************//</p><p> void calculate(void)</p><p> { time[0]=hour/10; //十時</p&
59、gt;<p> time[1]=hour%10; //時</p><p> time[2]=min/10; //十分</p><p> time[3]=min%10; //分</p><p><b> return;</b></p><p><b> }
60、</b></p><p> void LED_time(void)</p><p> { if((counts==0||counts==2)||flag_M)</p><p> {P0=0xfe; //P0.0=0,選通第一位</p><p> P2=dispcode[time[
61、3]]; //段顯</p><p> delay(100); //延時</p><p> P2=0xff; //消隱</p><p> P0=0xfd; //P0.1=0,選通第二位</p><p> P2=dispcode[time
62、[2]]; //段顯</p><p> delay(100); //延時</p><p> P2=0xff;} //消隱</p><p> if(counts==0||counts==1||counts==3||flag_M) </p><p&
63、gt; {P0=0xfb; //P0.2=0,選通第三位</p><p> P2=dispcode[time[0]]; //段顯</p><p> delay(100); //延時</p><p> P2=0xff; //消隱<
64、/p><p> P0=0xf7; //P0.3=0,選通第四位</p><p> P2=dispcode[time[1]]; </p><p> P2&=0x7f; //加小數點</p><p> delay(100);
65、 //延時 </p><p> P2=0xff;} //消隱</p><p><b> return;</b></p><p><b> }</b></p><p> void LED_temp(void)</p><p&g
66、t; {/*此程序用的是三極管驅動4位數碼管顯示,考慮到為數有限,將百位和負號位屏蔽掉*/ </p><p> //if(tpmsb>7)//表示負溫度</p><p> // { //把負號標志放在整數最高位不是0的前一位</p><p> //if(temperature_tab[0]==0&&tempe
67、rature_tab[1]!=0) temperature_tab[0]=10;</p><p> //if(temperature_tab[0]==0&&temperature_tab[1]==0){ temperature_tab[0]=11;temperature_tab[1]=10;}</p><p><b> //}</b></p
68、><p> P0=0xfe; //P0.0=0,選通第一位</p><p> P2=dispcode[ dispbuf[0]]; //段顯</p><p> delay(200); //延時</p><p> P2=0xff;
69、 //消隱</p><p> P0=0xfd; //P0.1=0,選通第二位</p><p> P2=dispcode[dispbuf[1]]; //段顯</p><p> delay(200); //
70、延時</p><p> P2=0xff; //消隱</p><p> P0=0xfb; //P0.2=0,選通第三位</p><p> P2=dispcode[dispbuf[3]]; //段顯</p><p&g
71、t; delay(200); //延時</p><p> P2=0xff; //消隱</p><p> P0=0xf7; //P0.3=0,選通第四位</p><p> P2=dispcode[dispbuf[2]
72、]; </p><p> P2&=0x7f; //加小數點</p><p> delay(200); //延時</p><p> P2=0xff; //消隱</p><p><b> retu
73、rn;</b></p><p><b> }</b></p><p> void Mod_flash(void)</p><p> { uchar k;</p><p><b> TR0=1;</b></p><p><b> ET0=0;
74、</b></p><p><b> if(TF0)</b></p><p><b> {flm++;</b></p><p><b> TL0=0xF3;</b></p><p><b> TH0=0xD8;</b></p>
75、<p><b> TF0=0;}</b></p><p> if(flm==100)</p><p><b> { flm=0;}</b></p><p><b> k=flm/25;</b></p><p> if(k==0||k==2)</p&
76、gt;<p> { flag_M=1;}</p><p> else flag_M=0;</p><p><b> return;</b></p><p><b> }</b></p><p> /* 產生復位脈沖初始化DS18B20 */</p><p&
77、gt; void ow_reset(void)</p><p> { char presence=1;</p><p> while(presence)</p><p><b> {</b></p><p> while(presence)</p><p><b> {&
78、lt;/b></p><p> DQ=1;_nop_();_nop_();//從高拉倒低</p><p> DQ=0; </p><p> delay(50); //550 us</p><p> DQ=1;
79、 </p><p> delay(6); //66 us</p><p> presence=DQ; //presence=0 復位成功,繼續(xù)下一步</p><p><b> } </b></p><p> delay(45);
80、 //延時500 us</p><p> presence=~DQ; </p><p><b> }</b></p><p> DQ=1; //拉高電平</p><p><b> }</b></p>&l
81、t;p> /************************************************************</p><p> 向 1-WIRE 總線上寫一個字節(jié)**數據線從高電平拉至低電平,產生寫起始信號。</p><p> 15ms之內將所需寫的位送到數據線上</p><p> ***********************
82、***************************************/</p><p> void write_byte(uchar val)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for (i=8; i>
83、0; i--) //在15~60ms之間對數據線進行采樣,如果是高電平就寫1,低寫0發(fā)生。 </p><p><b> {</b></p><p> DQ = 1;_nop_(); _nop_(); //在開始另一個寫周期前必須有1Us以上的高電平恢復期。 </p><p> DQ = 0
84、;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //5us</p><p> DQ = val&0x01; //最低位移出</p><p> delay(6) ; //66us</p><p> val = val/2; //右移1位</p><p><b> }&l
85、t;/b></p><p><b> delay(1);</b></p><p><b> }</b></p><p> /************************************************************</p><p> //讀1字節(jié) //主機
86、數據線先從高拉至低電平1us以上,再使數據線升為高電平,從而產生讀信號</p><p> **************************************************************/</p><p> uchar read_byte (void)</p><p><b> {</b></p>
87、<p><b> uchar i;</b></p><p> uchar value = 0;</p><p> for(i = 8;i>0;i--)</p><p><b> {</b></p><p> DQ = 1; // 給脈沖信號</p>&l
88、t;p> _nop_(); _nop_(); </p><p> value>>= 1;</p><p> DQ = 0; // 給脈沖信號</p><p> _nop_(); _nop_(); _nop_(); _nop_();_nop_(); //4us</p><p> DQ = 1; _nop_();_
89、nop_();_nop_();_nop_();_nop_();//5us</p><p><b> if(DQ) </b></p><p> {value|= 0x80 ; } </p><p> delay(13); //66us 注意延時的長短,如果是delay(6) 會造成LED閃爍</p><p
90、> }</p><p><b> DQ = 1;</b></p><p> return(value);</p><p><b> }</b></p><p> /*設置DS18B20轉換精度及報警**見配置寄存器說明*/</p><p&
91、gt; void Setting_DS18B20(void)</p><p><b> {</b></p><p> ow_reset();</p><p> write_byte(0xCC); // 跳過讀序號列號的操作</p><p> write_byte(0x4e);</p>&l
92、t;p> write_byte(0x64); //100不使用DS18B20本身的溫度告警設置,為進行轉換精度設定,湊兩個寫寄存器操作</p><p> write_byte(0x8a); //-10</p><p> write_byte(0x7f); //設置DS18B20 為12位轉換精度 R1,R0的值決定轉換精度 R1=R0=1對應12位
93、</p><p><b> }</b></p><p> /*讀取溫度并完成轉化*/</p><p> void Read_Temperature(void)</p><p> {uchar tplsb,tpmsb;// 溫度值低位、高位字節(jié)</p><p> uchar flag
94、=0;</p><p> // unsigned int j=0; //暫存計算得溫度的整數部分</p><p><b> float tt;</b></p><p> ow_reset();</p><p> write_byte(0xCC); // 跳過讀序號列號的操作</p><p>
95、; write_byte(0x44); // 啟動溫度轉換</p><p> ow_reset();</p><p> write_byte(0xCC); //跳過讀序號列號的操作</p><p> write_byte(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> tplsb=read_
96、byte(); // 溫度值低位字節(jié)(其中低4位為二進制的“小數”部分)</p><p> tpmsb=read_byte(); // 高位值高位字節(jié)(其中高5位為符號位</p><p><b> //轉換溫度</b></p><p><b> j=tpmsb;</b></p><p>
97、<b> j<<=8;</b></p><p> j+=tplsb; //寫為j=j|tplsb;也可以。// 兩字節(jié)合成一個整型變量。</p><p> if(tpmsb>7)</p><p><b> {</b></p><p> j=(j^0xffff);//
98、異或</p><p> j=j+1; //如果溫度小于0,這5位為1,測到的數值需要取反加1再乘于0.0625即可得到實際溫度。</p><p><b> } </b></p><p> tt=(j*0.0625);</p><p> j=tt*10+0.5; //四舍五入成整數,并擴大十倍 此
99、處暫不考慮符號 </p><p> dispbuf[3]=j/100%10; //十位</p><p> dispbuf[2]=j/10%10; //個位</p><p> dispbuf[1]= j%10;//取溫度小數點1位 </p><p> dispbuf[0]=10; //表示溫度符號C</p><p
100、> //dispbuf[3]=j/1000; //百位 </p><p> /*此程序用的是三極管驅動4位數碼管顯示,考慮到為數有限,將百位和負號位屏蔽掉*/</p><p><b> }</b></p><p> void main(void)</p><p><b> { </b&g
101、t;</p><p><b> uchar cl;</b></p><p> min=12,sec=0,hour=12,</p><p> hsec=0,counts=0;</p><p> TMOD=0x11;</p><p><b> IE=0x8A;</b>&
102、lt;/p><p><b> TH0=0xD8;</b></p><p><b> TL0=0xF3;</b></p><p><b> TH1=0xD8;</b></p><p><b> TL1=0xF3;</b></p><p
103、><b> TR1=1;</b></p><p> Setting_DS18B20();</p><p><b> MPG: </b></p><p> check_button();</p><p> calculate();</p><p> if(co
104、unts==1||counts==2) Mod_flash();</p><p> cl=sec%10;</p><p> if(counts==0&&cl>=7)</p><p> { if(hsec==0) Read_Temperature();</p><p> LED_temp();}</p>
105、;<p> if((counts==0&&cl<=6)||counts==1||counts==2) </p><p> LED_time();</p><p> goto MPG ;</p><p><b> }</b></p><p><b> 十、心得體會&l
106、t;/b></p><p> 經過將近三周的單片機課程設計,終于完成了我們的數字溫度計的設計,并且達到設計要求,這次的課程設計將這三年所學的單片機和C語言以及PROTEUS的理論知識用到具體的實踐中去,深化了理論知識,同時也鍛煉了動手實踐能力,有了以前的練習為前提做起來也比較的順利。</p><p> 不過在具體的實踐的時候還是遇到了一些小的問題,比如數據類型的定義錯誤,字符的錯
107、誤輸入等等,這些雖然都是小問題,不過在具體實踐過程中卻浪費了不少時間,看來平時要多多的實踐才是,除了要考慮問題周到還要多多注意一些細小的問題才是,做的熟練了問題也很容易的解決。</p><p> 通過本次的課程設計對PROTEUS的功能又多了些了解,同時也較為熟悉的掌握了C這門語言。一開始的時候遇到了不少小問題,后來多和同學討論,多看看書,理論聯系實踐,許多問題就迎刃而解了。在本次的課程設計中覺得應該注意程序的
108、設計。雖然不是很難,但很多細小的問題需要認真的對待,稍有不注意問題就會在具體的應用程序調試過程中出現,這要求在實踐的過程中除了要了塌實的理論知識還要細心,有耐心。當然在本次的設計過程中還出現了其他不少的問題,問題隨著設計思想的深入而不斷變化,不斷的產生新問題,而在這過程中不斷的解決問題,正是在這一過程中,加深了對原理的認識,完善了設計思想,使我們分析問題解決問題的能力得到進一步的加強。</p><p> 在課程
109、設計過程中,全面實踐一個基于單片機的應用系統(tǒng)的開發(fā)過程,學習了很多有關的知識。這樣的項目對學過的單片機,C語言程序設計,PROTEUS等課程是一個綜合性很高的實踐。一些以前沒有學得很雜實的課程的內容,由于需要在實踐中運用,剛開始也感到很頭痛,但回過頭再去看有關的教科書,經過一段時間的鉆研,對與這些知識點的相關的背景,概念和解決方案理解得更透徹了,學習起來也越來越有興趣,越來越輕松。</p><p> 另外還充分
110、體會了從事單片機開發(fā)工作需要特別嚴謹認真的態(tài)度和作風,一點都馬虎不得。每一個細微的細節(jié)都必須十分的注意,如果不認真思考決策,就會出現或大或小的錯誤,如果早期的錯誤隱藏下來,對后面的工作影響就會很大,甚至有時要推倒很多前面做的工作重來。有時候,我們覺得寫的程序非常的正確,但是就是編譯通不過,在查找錯誤的過程中,面臨著否認我們的過程,非常的痛苦,而且由于我們的經驗及各方面的能力的不足,所以進展的速度非常的緩慢,往往幾天的時間還沒有一點進展。
111、這時候,一般是我們先通過書本,手冊和資料找解決辦法,雖然我們鉆研花的時間較多,但強迫獨立的思考對學習提高幫助非常大。</p><p> 在開始編寫程序的時候,看到別人的程序功能非常的詳細,總希望我們的程序也非常的完善,但是,經過一個月的學習,發(fā)現編一個完整的程序決不是一蹴而就的事情,需要長時間的積累和經驗。認清我們的能力后,就特別注意在工作的過程中不貪圖大而全,而是根據我們的能力,制定適當的目標。</p&
112、gt;<p> 反反復復的學習,辛勤努力有了回報,終于做出了數字溫度計,雖然這個系統(tǒng)的功能非常的簡單,而且在實際的運用中,還有些不足。</p><p> 由于知識淺薄,經驗不足及閱歷頗淺,因此,本次課程設計還有很多不足,我們會在以后的學習過程中,根據要求不斷的修改,完善,爭取使其趨向完美,并希望得到老師指點。 </p><p><b> 十一、參考文獻 <
113、;/b></p><p> [1] 李朝青.單片機原理及接口技術(簡明修訂版).杭州:北京航空航天大學出版社,1998</p><p> [2] 李廣弟.單片機基礎[M].北京:北京航空航天大學出版社,1994</p><p> [3] 閻石.數字電子技術基礎(第三版). 北京:高等教育出版社,1989</p><p> [4]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計--數字溫度計
- 單片機課程設計--數字溫度計
- 單片機課程設計-數字溫度計
- 單片機課程設計—數字溫度計
- 單片機數字溫度計課程設計
- 單片機課程設計---數字溫度計
- 單片機課程設計-數字溫度計
- 單片機課程設計—數字溫度計
- 單片機課程設計——數字溫度計
- 單片機課程設計—數字溫度計
- 單片機課程設計--數字溫度計設計
- 單片機課程設計--數字溫度計設計
- 數字溫度計課程設計---基于51單片機數字溫度計設計
- 單片機課程設計-數字溫度計
- 數字溫度計--單片機課程設計
- 溫度計課程設計---基于51單片機數字溫度計設計
- 數字溫度計課程設計---基于51單片機數字溫度計設計
- 單片機原理及應用課程設計---數字式溫度計的設計
- 單片機課程設計---單片機數字顯示溫度計
- 單片機課程設計數字溫度計
評論
0/150
提交評論