版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《單片機應用與仿真訓練》設計報告</p><p> 多機溫度檢測系統設計</p><p> 2011年11月23日</p><p><b> 摘要</b></p><p> 本設計是采用AT89S52單片機作為控制核心設計了溫度測量系統,該系統由溫度檢測模塊、微控制器模塊、串口通信模塊、數碼
2、管顯示和報警模塊等四部分組成,能對0℃~100℃范圍的溫度進行測量,同時利用4位八段數碼管可以實時顯示環(huán)境溫度。</p><p> 系統硬件電路包括傳感器數據采集、溫度顯示、模式選擇、上、下限報警主電路等。整個裝置的控制核心是 AT89S52單片機。溫度傳感器 DS18B20采用外部電源供電,傳感器輸出引腳直接和單片機相連。電路支持模式選擇功能,可以選擇設定報警極限值或顯示當前溫度值。當被測溫度越限時,報警主電
3、路產生聲光報警。撥動開關可以對設定報警極限值進行寫保護。采用2片單片機,組成多機溫度檢測系統;下位單片機采集溫度,通過串行通信傳送至上位單片機;上位單片機用數碼管顯示溫度大??;基本范圍0℃~100℃;精度誤差小于0.5℃;可以任意設定溫度的上下限報警功能。</p><p> 該系統精度高、測溫范圍廣、報警及時,可廣泛應用于基于單片機的測溫報警場合。系統抗干擾性強、設計靈活方便,適合在惡劣的環(huán)境下進行溫度測量。&
4、lt;/p><p> 關鍵詞:AT89S52;DS18B20溫度傳感器;共陰極LED顯示;報警</p><p><b> 摘要2</b></p><p><b> 1 概述4</b></p><p> 1.1 下位機溫度采集發(fā)送系統4</p><p> 1.2上
5、位機顯示及報警系統4</p><p> 2 系統方案設計5</p><p> 2.1主控制部分設計5</p><p> 2.2 傳感器部分設計5</p><p> 3.系統總體方案及硬件設計7</p><p> 3.1系統總體方案7</p><p> 3.2系統總體方案圖
6、7</p><p> 3.3系統各部分硬件電路設計8</p><p> 3.3.1 AT89S52單片機及最小相系統8</p><p> 3.3.2數據顯示電路9</p><p> 3.3.3 數字溫度傳感器DS18B2010</p><p> 3.4整體電路14</p><
7、p><b> 4 軟件設計15</b></p><p><b> 4.1 概述15</b></p><p> 4.2 主程序方案15</p><p> 4.3DS18B20的相處理子程序16</p><p> 4.3.1DS18B20初始化16</p><
8、;p> DS18B20初始化子程序:16</p><p> 4.3.2 DS18B20的寫操作17</p><p> 4.3.3 DS18B20的讀操作17</p><p> 5.Proteus軟件仿真19</p><p> 5.1 系統仿真環(huán)境19</p><p> 5.2 器件參數選
9、取19</p><p> 5.3仿真結果19</p><p> 6.課程設計體會21</p><p><b> 參考文獻22</b></p><p> 附件一:源程序代碼23</p><p> 附件二:系統原理圖30</p><p><b>
10、 1 概述</b></p><p> 1.1 下位機溫度采集發(fā)送系統 </p><p> 下位機溫度采集發(fā)送系統是本系統的主要核心之一,它的主要功能是采集DS18B20的溫度數據,進行轉換,并通過串口發(fā)送出去。該溫度測量系統采用8051內核Atmel公司的AT89S52八位單片機。</p><p> 溫度采集發(fā)送系統由溫度檢測模塊、下位控制器
11、模塊、發(fā)送放大模塊三部分組成,如圖1-1 溫度測量系統的系統框圖:</p><p> 圖 溫度測量系統的系統框圖</p><p> 溫度檢測模塊中溫度傳感器DS18B20采集溫度數據,通過P2.3口傳給下位單片機,微控制模塊進行數據轉換,得出十進制溫度值,然后通過串行口經MAX232將數據發(fā)送出去。</p><p> 1.2上位機顯示及報警系統</p&g
12、t;<p> 上位機系統的主要功能是接收下位機發(fā)送過來的溫度數據,與報警溫度進行比較,判斷是否發(fā)送報警信號,并同時直接驅動四位八段數碼管進行顯示。</p><p> 上位機系統由串口接收模塊、處理控制模塊、數碼管顯示模塊和報警模塊四部分組成,如圖1-2上位機系統框圖:</p><p><b> 圖 上位機系統框圖</b></p>&l
13、t;p> 串行口接收數據后進行判斷是否報警,并由P0口和P2.0~P2.3直接驅動數碼管顯示溫度數據。報警控制模塊通過按鈕電路可以改變報警溫度的上下限實現系統的靈活功能。</p><p><b> 2 系統方案設計</b></p><p> 2.1主控制部分設計</p><p><b> 方案一:</b>&l
14、t;/p><p> 此方案采用PC機實現。它可在線編程,可在線仿真的功能,這讓調試變得方便。且人機交互友好。但是PC機輸出信號不能直接與DS18B20通信。需要通過RS232電平轉換兼容,硬件的合成在線調試,較為繁瑣,很不簡便。而且在一些環(huán)境比較惡劣的場合,PC機的體積大,攜帶安裝不方便,性能不穩(wěn)定,給工程帶來很多麻煩!</p><p><b> 方案二:</b>&l
15、t;/p><p> 此方案采用AT89S52八位單片機實現。單片機軟件編程的自由度大,可通過編程實現各種各樣的算術算法和邏輯控制。而且體積小,硬件實現簡單,安裝方便。既可以單獨對多DS18B20控制工作,還可以與PC機通信.運用主從分布式思想,由一臺上位機,下位機多點溫度數據采集,組成兩級分布式多點溫度測量的巡回檢測系統,實現遠程控制。另外AT89S52在工業(yè)控制上也有著廣泛的應用,編程技術及外圍功能電路的配合使用
16、都很成熟 </p><p> 2.2 傳感器部分設計</p><p><b> 方案一:</b></p><p> 采用熱敏電阻,可滿足40攝氏度至90攝氏度測量范圍,但熱敏電阻精度、重復性、可靠性較差,對于檢測1攝氏度的信號是不適用的。而且在溫度測量系統中,采用單片溫度傳感器,比如AD590,LM35等.但這些芯片輸出的都是模擬信號,必
17、須經過A/D轉換后才能送給計算機,這樣就使得測溫裝置的結構較復雜.另外,這種測溫裝置的一根線上只能掛一個傳感器,不能進行多點測量.即使能實現,也要用到復雜的算法,一定程度上也增加了軟件實現的難度。</p><p><b> 方案二:</b></p><p> 在多點測溫系統中,傳統的測溫方法是將模擬信號遠距離采樣進行AD轉換,而為了獲得較高的測溫精度,就必須采用措
18、施解決由長線傳輸,多點測量切換及放大電路零點漂移等造成的誤差補償問題。采用數字溫度芯片DS18B20測量溫度,輸出信號全數字化。便于單片機處理及控制,省去傳統的測溫方法的很多外圍電路。且該芯片的物理化學性很穩(wěn)定,它能用做工業(yè)測溫元件,此元件線形較好。在0—100攝氏度時,最大線形偏差小于1攝氏度。DS18B20的最大特點之一采用了單總線的數據傳輸,由數字溫度計DS1820和微控制器AT89S52構成的溫度測量裝置,它直接輸出溫度的數字信
19、號,可直接與計算機連接。這樣,測溫系統的結構就比較簡單,體積也不大,且由于AT89S52可以帶多個DSB1820,因此可以非常容易實現多點測量.輕松的組建傳感器網絡。</p><p> 采用溫度芯片DS18B20測量溫度,可以體現系統芯片化這個趨勢。部分功能電路的集成,使總體電路更簡潔,搭建電路和焊接電路時更快。而且,集成塊的使用,有效地避免外界的干擾,提高測量電路的精確度。所以集成芯片的使用將成為電路發(fā)展的一
20、種趨勢。本方案應用這一溫度芯片,也是順應這一趨勢。</p><p> 綜上所述,溫度傳感器以及主控部分都采用第二方案。</p><p> 系統采用針對傳統溫度測溫系統測溫點少,系統兼容性及擴展性較差的特點,運用分布式通訊的思想。設計一種可以用于大規(guī)模多點溫度測量的巡回檢測系統。該系統采用的是RS-232串行通訊的標準,通過上位機進行現場的溫度采集,溫度數據既可以由下位機模塊實時顯示,也
21、可以送回上位機進行數據處理,具有巡檢速度快,擴展性好,成本低的特點。</p><p> 3.系統總體方案及硬件設計</p><p><b> 3.1系統總體方案</b></p><p> 該數字溫度計由電源電路、晶振電路、復位電路、下載電路、單片機、</p><p> 數字顯示電路、溫度測量電路、報警電路和控制電
22、路組成。 可以實現基本范圍0℃-100℃的測量和任意設置溫度的上下限,當所設置的溫度高于所設置的上限或低于所設置的下限時可通過發(fā)光二極管報警。當開關處于開的狀態(tài)時才可實現上述功能,否則不可實現。</p><p> 3.2系統總體方案圖</p><p> 3.3系統各部分硬件電路設計</p><p> 3.3.1 AT89S52單片機及最小相系統</p&
23、gt;<p><b> AT89S52</b></p><p> AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業(yè)80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash
24、,使得AT89S52為眾多嵌入式控制應用系統提供高靈活、超有效的解決方案。AT89S52具有以下標準功能: 8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時器,2 個數據指針,三個16 位定時器/計數器,一個6向量2級中斷結構,全雙工串行口,片內晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數器、串口、中斷繼續(xù)工作。掉
25、電保護方式下,RAM內容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。</p><p> AT89S52最小相系統</p><p> 3.3.2數據顯示電路</p><p> 本次設計中采用共陰極數碼管作為顯示器。LED的驅動電路簡單,使用方便,具有耗電少、成本低廉、配置簡單靈活、安裝方便、耐振動、使用壽命長等優(yōu)點。LED顯示器與單片
26、機的接口一般有動態(tài)顯示與靜態(tài)顯示接口兩種電路。</p><p> 1、靜態(tài)顯示方式:是指當顯示器顯示某一字符時,發(fā)光二極管的位選始終被選中。在這種顯示方式下,每一個LED數碼管顯示器都需要一個8位的輸出口進行控制,顯示穩(wěn)定,提高了CPU的工作效率。其不足之處是占用硬件資源較多,每個LED數碼管需要獨占8條輸出線。隨著顯示器位數的增加,需要的I/O口線也將增加。</p><p> 2、動
27、態(tài)顯示方式:動態(tài)顯示方式是指一位一位地輪流點亮每位顯示器(稱為掃描),即每個數碼管的位選被輪流選中,多個數碼管公用一組段選,段選數據僅對位選選中的數碼管有效。對于每一位顯示器來說,每隔一段時間輪流點亮。顯示器的亮度既與導通電流有關,也與點亮時間和間隔時間的比例有關, 由于掃描速度極快,顯示效果與靜態(tài)驅動相同。通過調整電流和時間參數,可以既保證亮度,又保證顯示。</p><p> 本次設計中,由于單片機本身提供的
28、I/O口有限,本次設計采用動態(tài)顯示,數碼管采用的是共陰極接法。用AT89S52的P0口作段碼輸出時, 驅動能力相當大,但由于輸出極為漏極開路電路,驅動拉電流負載,引腳上應外接上拉電阻。。因此,在本次設計中我們將數碼管各段加上拉電阻后接單片機P0口。我們把P2口的輸出信號直接接到數碼管的位選端作為位選信號,低電平有效。</p><p><b> 數據顯示電路</b></p>&
29、lt;p> 3.3.3 數字溫度傳感器DS18B20</p><p> 本次設計的硬件電路簡單,關鍵的地方在DS18B20,也是最復雜難懂的。</p><p> 由DALLAS半導體公司生產的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事等領域的溫度測量及控制儀器、測控系統和大型設備中。它具有體積小,接口方便,傳輸距離遠等
30、特點。</p><p> DS18B20的性能特點:</p><p> 采用單總線專用技術,既可通過串行口線,也可通過其它I/O口線與微機接口,無須經過其它變換電路,直接輸出被測溫度值(9位二進制數,含符號位)</p><p> 測溫范圍為-55℃-+125℃,測量分辨率最小為0.0625℃</p><p> 內含64位經過激光修正的
31、只讀存儲器ROM</p><p> DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉換電路集成在形如一只三極管的集成電路內</p><p> 適配各種單片機或系統機</p><p> 測量結果直接輸出數字溫度信號,以“一線總線“串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p> 用戶可分別設
32、定各路溫度的上、下限</p><p> 適應電壓范圍寬,3.0~5.5V,在寄生電源方式下可由數據線供電</p><p> DS18B20的管腳排列如圖5所示。引腳功能如下表所示:</p><p><b> 圖DS18B20</b></p><p><b> 表1:</b></p>
33、;<p> DS18B20主要包括寄生電源、溫度傳感器、64位激光ROM單線接口、存放中間數據的高速暫存器(內含便箋式RAM),用于存儲用戶設定的溫度上下限值的TH和TL觸發(fā)器存儲與控制邏輯、8位循環(huán)冗余校驗碼(CRC)發(fā)生器等七部分內部,其內部結構框圖如圖所示。</p><p> 圖DS18B20內部結構</p><p> DS18B20有4個主要的數據部件:<
34、/p><p> ① 64位激光ROM。64位激光ROM從高位到低位依次為8位CRC、48位序列號和8位家族代碼(28H)組成。</p><p><b> ?、?溫度靈敏元件。</b></p><p> ?、?非易失性溫度報警觸發(fā)器TH和TL??赏ㄟ^軟件寫入用戶報警上下限值。</p><p> ?、?配置寄存器。 配置
35、寄存器為高速暫存存儲器中的第五個字節(jié)。DS18B20在0工作時按此寄存器中的分辨率將溫度轉換成相應精度的數值,</p><p> 其各位定義如圖所示。</p><p> 其中,TM:測試模式標志位,出廠時被寫入0,不能改變;R0、R1:溫度計分辨率設置位,其對應四種分辨率如下表所列,出廠時R0、R1置為缺省值:R0=1,R1=1(即12位分辨率),用戶可根據需要改寫配置寄存器以獲得合適
36、的分辨率。</p><p> 配置寄存器與分辨率關系表 :</p><p> 高速暫存存儲器。高速暫存存儲器由9個字節(jié)組成,其分配如下圖所示。當溫度轉換命令發(fā)布后,經轉換所得的溫度值以二字節(jié)補碼形式存放在高速暫存存儲器的第0和第1個字節(jié)。單片機可通過單線接口讀到該數據,讀取時低位在前,高位在后,數據格式如圖所示。對應的溫度計算:當符號位S=0時,直接將二進制位轉換為十進制;當S=1時,
37、先將補碼變?yōu)樵a,再計算十進制值。</p><p> 溫度值格式圖DS18B20 溫度數據表:</p><p> 對DS18B20的設計,需要注意以下問題:</p><p> 對硬件結構簡單的單線數字溫度傳感器DS18B20 進行操作,需要用較為復雜的程序完成。編制程序時必須嚴格按芯片數據手冊提供的有關操作順序進行,讀、寫時間片程序要嚴格按要求編寫。尤其在使用
38、DS18B20 的高測溫分辨率時,對時序及電氣特性參數要求更高。</p><p> 有多個測溫點時,應考慮系統能實現傳感器出錯自動指示,進行自動DS18B20 序列號和自動排序,以減少調試和維護工作量。</p><p> 測溫電纜線建議采用屏蔽4 芯雙絞線,其中一對線接地線與信號線,另一組接VCC和地線,屏蔽層在源端單點接地。DS18B20 在三線制應用時,應將其三線焊接牢固;在兩線應
39、用時,應將VCC與GND接在一起,焊接牢固。若VCC脫開未接,傳感器只送85.0 ℃的溫度值。</p><p> 實際應用時,要注意單線的驅動能力,不能掛接過多的DS18B20,同時還應注意最遠接線距離。另外還應根據實際情況選擇其接線拓撲結構。</p><p> 圖DS18B20接線圖</p><p><b> 3.4整體電路</b>&l
40、t;/p><p> 見附件二:系統原理圖</p><p><b> 4 軟件設計</b></p><p><b> 4.1 概述</b></p><p> 整個系統的功能是由硬件電路配合軟件來實現的,當硬件基本定型后,軟件的功能也就基本定下來了。從軟件的功能不同可分為兩大類:一是監(jiān)控軟件(主程序
41、),它是整個控制系統的核心,專門用來協調各執(zhí)行模塊和操作者的關系。二是執(zhí)行軟件(子程序),它是用來完成各種實質性的功能如測量、計算、顯示、通訊等。每一個執(zhí)行軟件也就是一個小的功能執(zhí)行模塊。這里將各執(zhí)行模塊一一列出,并為每一個執(zhí)行模塊進行功能定義和接口定義。各執(zhí)行模塊規(guī)劃好后,就可以規(guī)劃監(jiān)控程序了。</p><p> 首先要根據系統的總體功能和鍵盤設置選擇一種最合適的監(jiān)控程序結構,然后根據實時性的要求,合理地安排
42、監(jiān)控軟件和各執(zhí)行模塊之間地調度關系。</p><p><b> 4.2 主程序方案</b></p><p> 主程序調用了數碼管顯示程序、溫度測試程序、中斷控制程序、單片機與PC機串口通訊等程序。</p><p> 溫度測試程序:對溫度芯片送過來的數據進行處理,進行判斷和顯示。</p><p> 數碼管顯示程序:
43、向數碼的顯示送數,控制系統的顯示部分。</p><p> 中斷控制程序:實現循環(huán)顯示功能。</p><p> 串口通訊程序:實現PC機與單片機通訊,將溫度數據傳送給PC機</p><p> 將各個功能程序以子程序的形式寫好,當寫主程序的時候,只需要調用子程序,然后在寄存器的分配上作一下調整,消除寄存器沖突和I/O沖突即可。程序應該盡可能多的使用調用指令代替跳轉
44、指令。因為跳轉指令使得程序難以看懂各程序段之間的結構關系。而調用指令則不同,調用指令使得程序結構清晰,無論是修改還是維護都比較方便。將功能程序段寫成子程序的形式,除了方便調用之外,還有一個好處那就是以后寫程序的時候如果要用到,就可以直接調用這個單元功能模塊。</p><p> 4.3DS18B20的相處理子程序 </p><p> 4.3.1DS18B20初始化</p>
45、<p> ?。?) 先將數據線置高電平“1”。</p><p> (2) 延時(該時間要求的不是很嚴格,但是盡可能的短一點)</p><p> (3) 數據線拉到低電平“0”。</p><p> ?。?) 延時750微秒(該時間的時間范圍可以從480到960微秒)。</p><p> ?。?) 數據線拉到高電平“1”。</
46、p><p> (6) 延時等待(如果初始化成功則在15到60毫秒時間之內產生一個由DS18B20所返回的低電平“0”。據該狀態(tài)可以來確定它的存在,但是應注意不能無限的進行等待,不然會使程序進入死循環(huán),所以要進行超時控制)。</p><p> ?。?) 若CPU讀到了數據線上的低電平“0”后,還要做延時,其延時的時間從發(fā)出的高電平算起(第(5)步的時間算起)最少要480微秒。</p>
47、;<p> ?。?) 將數據線再次拉高到高電平“1”后結束。</p><p> DS18B20初始化子程序:</p><p> void Init_DS18B20(void) </p><p><b> {</b></p><p> unsigned char x=0;</p><
48、;p> DQ = 1; //DQ復位</p><p> delay_18B20(8); //稍做延時</p><p> DQ = 0; //單片機將DQ拉低</p><p> delay_18B20(80); //精確延時 大于 480us</p><p> DQ = 1;
49、 //拉高總線</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p> delay_18B20(20);</p><p><b> }</b></p><p>
50、 4.3.2 DS18B20的寫操作</p><p> ?。?) 數據線先置低電平“0”。</p><p> (2) 延時確定的時間為15微秒。</p><p> (3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位)。</p><p> ?。?) 延時時間為45微秒。</p><p> ?。?) 將數據線拉到
51、高電平。</p><p> ?。?) 重復上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。</p><p> ?。?) 最后將數據線拉高。</p><p> DS18B20的寫程序為</p><p> void WriteOneChar(unsigned char dat)</p><p><b>
52、 {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p><p><b> DQ = 0;</b></p><p> DQ = da
53、t&0x01;</p><p> Delay_DS18B20(5);</p><p><b> DQ = 1;</b></p><p><b> dat>>=1;</b></p><p><b> }</b></p><p>
54、<b> }</b></p><p> 4.3.3 DS18B20的讀操作</p><p> ?。?)將數據線拉高“1”。</p><p><b> ?。?)延時2微秒。</b></p><p> ?。?)將數據線拉低“0”。</p><p> (4)延時15微秒。&l
55、t;/p><p> ?。?)將數據線拉高“1”。</p><p> ?。?)延時15微秒。</p><p> ?。?)讀數據線的狀態(tài)得到1個狀態(tài)位,并進行數據處理。</p><p> (8)延時30微秒。</p><p> DS18B20的讀程序為:</p><p> unsigned cha
56、r ReadOneChar(void)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> unsigned char dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b>
57、; {</b></p><p> DQ = 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號</p><p><b> if(DQ)</b></p><
58、p> dat|=0x80;</p><p> Delay_DS18B20(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> 5.Proteus軟件仿真</p
59、><p> 5.1 系統仿真環(huán)境</p><p> 本設計采用Proteus仿真軟件進行仿真,Proteus軟件是英國Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。</p><p> 首先在Proteus的元件庫中找到所需的元件,按照硬
60、件設計中的說明把各部件連接起來組成一個數字式溫度計硬件系統。然后把在Keil環(huán)境調試下生成的.HEX文件導入到AT89S52里,點擊運行符號就可以使軟硬件的配套設施在Proteus的環(huán)境下仿真實現,以檢查是否存在錯誤。</p><p> 5.2 器件參數選取</p><p> 單片機采用AT89C52,時鐘頻率為12MHz。時鐘產生電路的晶振為12MHz,接地電容為30pF。復位電路的
61、電解電容為10uF,與電容并聯的電阻為1K,接地的電阻為10K。LED數碼管及DS18B20的工作電壓為+5V。</p><p><b> 5.3仿真結果</b></p><p> 系統原理圖見附件二:</p><p> 此圖為正常測溫數碼管畫面</p><p> 溫度超下限或者超過100℃</p>
62、<p><b> 數碼管顯示bbbb</b></p><p> 并且此時報警電路二極管D2亮</p><p> 溫度超上限數碼管顯示</p><p> 超上限時報警電路二極管D1亮</p><p><b> 6.課程設計體會</b></p><p>
63、通過這次單片機課程設計,我們不僅加深了對單片機理論的理解,將很多課本理論很好地應用到實際當中,而且我們還學會了如何去培養(yǎng)我們的學習精神和團隊協作能力,從而不斷地戰(zhàn)勝自己,超越自己。通過這次完成這次的設計,我們發(fā)現了我們在課堂上學習的知識是十分寶貴且有用的,也發(fā)現了我們在課堂學習過程中的不足和大意,有很多東西都在課堂上被我們忽略來了,為了完成本次的設計,我們不斷地翻閱書籍、請教同學,重新學習了課堂上的知識,雖然還沒能做到融會貫通、厚積薄發(fā)
64、,但畢竟窺一管而知全豹,走進了單片機應用的遼闊世界,了解到了單片機系統的強大功能,開闊了視野,提高了設計能力,使更多的知識成為了自己的東西,相信這些在我們今后的學習和工作生涯中將會是一筆寶貴的財富。</p><p> 在這次設計中,串口通信是我們的一大難點,不斷的仿真和不斷的錯誤和失敗告訴我們基礎知識的不踏實,正如老師所言“基礎不牢,地動山搖”,于是我們重新認真的看課本重新的學習,終于實現了串口發(fā)送和接受功能。
65、</p><p> 本次設計我們使用的是C51語言,雖然c語言結構明確,可讀性強,但由于單片機的硬件資源有限,在數據定義和特殊寄存器的選用及修改上比較固定,對于新手來說有些理解和實現,所以C語言編程時很多地方程序結構固定,而我們又沒有系統深入的學習過C51語言,所以在這次設計中我們部分的借鑒了別人的程序,雖然這一部分不是我們寫的,但是我們認真讀懂了它并且學到了很多東西,包括編程思想和設計技巧,這些都提高了我們的
66、學習能力和模仿能力。</p><p> 總之,通過這次的課程設計,使我們認識到了不足,看清了學習的方向,找到了學習的動力,提高了動手能力和學習能力,收獲很大。</p><p><b> 參考文獻</b></p><p> [1] 余發(fā)山主編.單片機原理及應用技術.徐州:中國礦業(yè)大學出版社.2003.12</p><p&
67、gt; [2] 白澤生. 用MCS-51單片機實現溫度的檢測[J].現代電子技術.2005.10</p><p> [3] 李玉梅編著.基于MCS-51系列單片機原理的應用設計.國防工業(yè)出版社</p><p> [4] 余小平、奚大順編著.電子系統設計基礎篇.北京:北京航空航天大學出版社,2007.3</p><p> [5] 郭愛芳主編.傳感器原理及應用.
68、西安電子科技大學出版社.2007.5</p><p> [6] http//www.jiangx.net/post/322.html</p><p> [7] 譚浩強著.C語言程序設計.清華大學出版社.2005.7</p><p><b> 附件一:源程序代碼</b></p><p><b> 上位機源
69、代碼</b></p><p> #include<reg51.h></p><p> unsigned char t[]={0,0},tt1[]={0,0,0,0,0},tt2[4],flag=1;</p><p> unsigned char *pt;//用來存放溫度值,測溫程序就是通過這個數組與主函數通信的</p&
70、gt;<p> unsigned char code dotcode[]={0,25,50,75};</p><p> sbit DQ = P1^6;</p><p> sbit UP=P1^0;</p><p> sbit DW=P1^1;</p><p> sbit G=P1^2;</p><p
71、> void delay(unsigned char i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> void delay_18B20(unsigned int i)</p>
72、<p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> /**********ds18b20初始化函數**********************/</p><p> void Init_DS18B20(vo
73、id) </p><p><b> {</b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復位</p><p> delay_18B20(8); //稍做延時</p><p> DQ = 0;
74、//單片機將DQ拉低</p><p> delay_18B20(80); //精確延時 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay_18B20(14);</p><p> x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗&
75、lt;/p><p> delay_18B20(20);</p><p><b> }</b></p><p> /***********ds18b20讀一個字節(jié)**************/ </p><p> unsigned char ReadOneChar(void)</p><p>
76、<b> {</b></p><p> unsigned char i=0;</p><p> unsigned char dat = 0;</p><p> for (i=8;i>0;i--)</p><p><b> {</b></p><p> DQ
77、= 0; // 給脈沖信號</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號</p><p><b> if(DQ)</b></p><p> dat|=0x80;</p><p> delay_18
78、B20(4);</p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> /*************ds18b20寫一個字節(jié)****************/ </p><p> v
79、oid WriteOneChar(unsigned char dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p><b> {</b></p>&
80、lt;p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p> delay_18B20(5);</p><p><b> DQ = 1;</b></p><p><b> dat>>=1;</b>
81、</p><p><b> }</b></p><p><b> }</b></p><p> /**************讀取ds18b20當前溫度************/</p><p> unsigned char *ReadTemperature(char TH,char TL,
82、unsigned char RS)</p><p><b> {</b></p><p> unsigned char tt[]={0,0};</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p>
83、<p> WriteOneChar(0x4E); // //寫入"寫暫存器"命令,修改TH和TL和分辯率配置寄存器</p><p> //先寫TH,再寫TL,最后寫配置寄存器</p><p> WriteOneChar(TH);//寫入想設定的溫度報警上限</p><p> WriteOneChar(TL);//寫入想
84、設定的溫度報警下限</p><p> WriteOneChar(RS);//寫配置寄存器,格式為0 R1 R0 1,1 1 1 1</p><p> //R1R0=00分辨率婁9位,R1R0=11分辨率為12位 </p><p> delay_18B20(80); // this message is wery important</p&
85、gt;<p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉換</p><p> delay_18B20(80); // this message is wery import
86、ant</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p> delay_18B20(80);</p>
87、<p> tt[0]=ReadOneChar(); //讀取溫度值低位</p><p> tt[1]=ReadOneChar(); //讀取溫度值高位</p><p> return(tt);</p><p><b> }</b></p><p> void init()</p&
88、gt;<p><b> {</b></p><p> SCON=0X40; //多機通信方式,接收允許</p><p> PCON=0X00; //波特率加倍</p><p> TMOD=0x20; //定時器1,模式2</p><p><b> TH1=0xf3;</b&g
89、t;</p><p> TL1=0xf3; //定時器初值</p><p> TR1=1; //啟動定時器1</p><p><b> }</b></p><p> void senddata(unsigned char tt2[])</p><p><b> {<
90、;/b></p><p><b> int i;</b></p><p><b> init();</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> SBUF=tt2
91、[i]; //寫SBUF,開始發(fā)送</p><p> while(!TI); //等待發(fā)送</p><p> TI=0; //清發(fā)送標志位</p><p> delay_18B20(100);</p><p><b> }</b></p><p><b> }</b&
92、gt;</p><p> void main()</p><p><b> {</b></p><p> unsigned char x,y; //下一步擴展時可能通過這兩個變量,調節(jié)上下限</p><p> unsigned int TH=100,TL=15; //測溫函
93、數返回這個數組的頭地址</p><p><b> while(1)</b></p><p><b> {</b></p><p> pt=ReadTemperature(TH,TL,0x3f); //上限溫度-22,下限-24,分辨率9位,也就是0.25C,TM R1 R0 1 1 1 1 1 </p&
94、gt;<p> t[0]=*pt;//讀取溫度,溫度值存放在一個兩個字節(jié)的數組中</p><p><b> pt++;</b></p><p> t[1]=*pt;</p><p> t[1]<<=4;//將高字節(jié)左移4位</p><p> t[1]=t[1]&
95、;0x70;//取出高字節(jié)的3個有效數字位</p><p> x=t[0];//將t[0]暫存到X,因為取小數部分還要用到它</p><p> x>>=4;//右移4位</p><p> x=x&0x0f;//和前面兩句就是取出t[0]的高四位</p><p> t[1]=t[1
96、]|x;//將高低字節(jié)的有效值的整數部分拼成一個字節(jié)</p><p> tt1[0]=(t[1]%100)/10;//分離出十位</p><p> tt1[1]=(t[1]%100)%10; //分離出個位</p><p> t[0]=t[0]&0x0c;//取有效的兩位小數</p><p>
97、 t[0]>>=2;//左移兩位,以便查表</p><p> x=t[0];</p><p> y=dotcode[x];//查表換算成實際的小數</p><p> tt1[2]=y/10;//分離出十分位</p><p> tt1[3]=y%10;
98、//分離出百分位 </p><p> if(G==0||UP==0||DW==0)</p><p><b> {</b></p><p><b> flag=0;</b></p><p><b> if(G==0)</b></p><
99、p><b> {</b></p><p><b> if(UP==0)</b></p><p><b> TH++;</b></p><p><b> if(DW==0)</b></p><p><b> TH--;</b&
100、gt;</p><p> if(TH>=100||TH<=0)</p><p><b> TH=0;</b></p><p> tt1[0]=TH/10;</p><p> tt1[1]=TH%10;</p><p><b> }</b></
101、p><p><b> else</b></p><p><b> {</b></p><p><b> if(UP==0)</b></p><p><b> TL++;</b></p><p><b> if(DW
102、==0)</b></p><p><b> TL--;</b></p><p> if(TL>=100||TL<=0)</p><p><b> TL=0;</b></p><p> tt1[0]=TL/10;</p><p> tt1[1]
103、=TL%10;</p><p><b> }</b></p><p><b> }</b></p><p><b> if(flag)</b></p><p><b> {</b></p><p> if((tt1[0
104、]>=(TH/10))&&(tt1[1]>=(TH%10)))</p><p><b> {</b></p><p> tt1[0]=10;</p><p> tt1[1]=10;</p><p> tt1[2]=10;</p><p> tt1[3]=10;
105、</p><p><b> }</b></p><p> if((tt1[0]<=TL/10)&&(tt1[1]<=TL%10)||(tt1[0]<=TL/10))</p><p><b> {</b></p><p> tt1[0]=11;</p&g
106、t;<p> tt1[1]=11;</p><p> tt1[2]=11;</p><p> tt1[3]=11;</p><p><b> }</b></p><p><b> }</b></p><p><b> flag=1;
107、</b></p><p> senddata(tt1);</p><p><b> }</b></p><p><b> }</b></p><p><b> 下位機源代碼</b></p><p> #include<
108、reg52.h></p><p> #include<intrins.h></p><p> #define uint unsigned int</p><p> #define uchar unsigned char</p><p> uchar code tab[] ={0xc0,0xf9,0xa4,0xb0,0
109、x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83};</p><p> uchar code tab1[]={0x08,0x04,0x02,0x01};</p><p> uchar code tt1[4];</p><p> uchar b,num=0,i;</p><p> sbit RE=P1^0;&
110、lt;/p><p> sbit LENG=P1^1;</p><p> void delay(unsigned int i)</p><p><b> {</b></p><p> while(i--);</p><p><b> } </b></p>&
111、lt;p> void UART_Init(void)</p><p><b> {</b></p><p> SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr </p><p> PCON |= 0x00; //SMOD=0;/波特率加倍 </p>
112、<p> TMOD=0x20; //定時器1,模式2</p><p><b> TH1=0xf3;</b></p><p><b> TL1=0xf3;</b></p><p><b> TR1=1;</b></p><p><b> ES=
113、1;</b></p><p><b> EA=1;</b></p><p><b> }</b></p><p> void show(uchar tt1[4]) //數碼管顯示</p><p><b> {</b></p><p>
114、; for(num=0;num<4;num++)</p><p><b> {</b></p><p> b=tt1[num];</p><p> P2=tab1[num];</p><p> if(num==1)</p><p> P0=tab[b]&0x7f;<
115、/p><p><b> else</b></p><p> P0=tab[b];</p><p> delay(200);</p><p><b> }</b></p><p><b> }</b></p><p>
116、; void main()</p><p><b> {</b></p><p> UART_Init();</p><p><b> while(1);</b></p><p><b> }</b></p><p> void INT_Ua
117、rtRcv(void) interrupt 4 //定時器1中斷服務子函數</p><p><b> {</b></p><p> uchar Rcv=0;</p><p> uchar tt[4];</p><p><b> if(RI)</b></p><p>
118、<b> {</b></p><p> RI=0; </p><p><b> Rcv=SBUF;</b></p><p> tt[i]=Rcv;</p><p><b> i++;</b></p><p> if(tt[0]==10
119、)</p><p><b> RE=0;</b></p><p><b> else </b></p><p><b> RE=1;</b></p><p> if(tt[0]==11)</p><p><b> LENG=0;<
120、;/b></p><p><b> else</b></p><p><b> LENG=1;</b></p><p><b> if(i==4)</b></p><p><b> {</b></p><p><
121、b> show(tt);</b></p><p><b> i=0;</b></p><p><b> }</b></p><p><b> return;</b></p><p><b> }</b></p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機溫度檢測課程設計
- 溫度檢測課程設計
- 溫度檢測計課程設計---基于單片機的溫度檢測儀設計
- 多點溫度檢測系統課程設計
- 多機溫度檢測畢業(yè)設計
- 遠程溫度控制課程設計--單片機的溫度遠程檢測與顯示設計
- 溫度計課程設計---單片機課程設計報告
- 單片機課程設計--八路溫度巡回檢測系統
- 單片機溫度控制課程設計
- 基于單片機溫度檢測系統說明書課程設計
- 課程設計報告---多點溫度檢測系統設計
- 溫度檢測課程設計--工廠自動溫度檢測控制系統
- 單片機多機通信課程設計
- 單片機多機通信課程設計
- 微機課程設計報告--溫度巡回檢測系統
- 電子裝置課程設計報告---溫度檢測系統設計
- 單片機課程設計---空調機溫度控制
- 機電課程設計—溫度巡回檢測儀
- 單片機課程設計---雞舍溫度控制設計
- 單片機溫度計課程設計
評論
0/150
提交評論