

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計任務書</b></p><p> 課 程: 單片機技術 </p><p> 課程設計題目: 數(shù)字溫度計 </p><p> 班 級: </p><p> 姓
2、 名: </p><p> 學 號: </p><p> 時 間: </p><p> 指 導 教 師: </p><p><b> 目 錄</b></p><p>
3、第1章 設計數(shù)字溫度計的任務及功能要求說明1</p><p> 1.1、設計數(shù)字溫度計的任務1</p><p> 1.2 、數(shù)字溫度計功能要求說明1</p><p> 第2章 數(shù)字溫度計硬件系統(tǒng)的設計2</p><p> 2.1、數(shù)字溫度計硬件系統(tǒng)各模塊功能簡要介紹2</p><p> 2.2、
4、數(shù)字溫度計電路原理圖6</p><p> 2.3、數(shù)字溫度計PCB圖6</p><p> 2.4、數(shù)字溫度計元器件布局圖6</p><p> 2.5、數(shù)字溫度計元器件清單6</p><p> 第3章 數(shù)字溫度計軟件系統(tǒng)的設計7</p><p> 3.1、數(shù)字溫度計使用單片機資源的情況7</
5、p><p> 3.2、數(shù)字溫度計軟件系統(tǒng)各模塊功能簡要介紹及流程框圖7</p><p> 第4章 設計結論、仿真結果15</p><p> 4.1、數(shù)字溫度計的設計結論及使用說明15</p><p> 4.2、數(shù)字溫度計的仿真結果15</p><p> 第5章 課程設計心得體會17</p>
6、;<p><b> 參考文獻19</b></p><p> 附錄A 數(shù)字溫度計電路原理圖20</p><p> 附錄B 數(shù)字溫度計PCB圖(正)21</p><p> 附錄C 數(shù)字溫度計PCB圖(底)22</p><p> 附錄D 數(shù)字溫度計元器件布局圖23</p>
7、<p> 附錄E 數(shù)字溫度計器件清單24</p><p> 附錄F 數(shù)字溫度計源程序25</p><p> 第1章 設計數(shù)字溫度計的任務及功能要求說明</p><p> 1.1、設計數(shù)字溫度計的任務</p><p> 設計一個具有特定功能的數(shù)字溫度計。該數(shù)字溫度計上電或按鍵復位后能自動顯示系統(tǒng)提示符“28090
8、303”,進入準備工作狀態(tài)。測量溫度范圍0℃~99℃,測量精度小數(shù)點后四位,可以通過開始和結束鍵控制數(shù)字溫度計的工作狀態(tài)。</p><p> 1.2 、數(shù)字溫度計功能要求說明</p><p> 數(shù)字溫度計在上電或按鍵復位后能自動顯示系統(tǒng)提示符“28090303”。P1口是獨立式按鍵控制口,當按下S2鍵時,啟動18B20并進入工作狀態(tài),并在數(shù)碼管上顯示即時溫度,溫度值可精確到小數(shù)點后四位
9、;當按下S3鍵后,使18B20處于停止工作狀態(tài),并讓數(shù)碼管顯示系統(tǒng)提示符。當18B20周圍的溫度高于溫度上限值時(例如可設定溫度上限值為20度),接在P3.1口的蜂鳴器報警,并且開啟接P3.1口的警示燈。系統(tǒng)的邏輯框圖如圖1.1所示。</p><p> 圖1.1 系統(tǒng)的邏輯框圖</p><p> 第2章 數(shù)字溫度計硬件系統(tǒng)的設計</p><p> 2.1、
10、數(shù)字溫度計硬件系統(tǒng)各模塊功能簡要介紹</p><p> 數(shù)字溫度計的整體硬件電路仿真圖如圖2.1所示。主要包括單片機主板電路(復位電路和時鐘電路),DS18B20電路,溫度顯示電路(數(shù)碼管電路),按鍵輸入電路,以及有報警作用的蜂鳴器電路和LED警示燈顯示電路。</p><p> 圖2.1 整體硬件電路</p><p> ?。?)、單片機主板電路</p&g
11、t;<p> 圖2.2是單片機主板電路。包括時鐘振蕩電路和按鍵復位電路,時鐘電路是由外接的晶振以及兩個電容構成。晶振的兩個引腳分別接在單片機的X1和X2引腳。按鍵復位電路是上電復位加手動復位,由單片機的RES引腳外接的電阻電容以及一個復位按鍵構成。另外擴展電路中,蜂鳴器電路由蜂鳴器、三極管及電阻構成。其接在單片機的P3.1口,是低電平有效。蜂鳴器可以在被測溫度不在上限范圍內時,發(fā)出報警鳴叫聲音,接在P3.1口的LED警示
12、燈被點亮,同時數(shù)碼管顯示被測量的溫度值。按鍵輸入電路是由單片機的P1口控制的,是低電平為有效信號。其圖如圖2.3所示。</p><p> 圖2.2 單片機主板電路</p><p> 圖2.3 按鍵輸入電路</p><p><b> ?。?)、顯示電路</b></p><p> 數(shù)碼管顯示電路如圖2.3所示。數(shù)碼
13、管顯示電路使用的是串口顯示,這種顯示方式最大的優(yōu)點就是使用口資源比較少,只用P0和P2口。兩個四位一體共陽數(shù)碼管采用動態(tài)接法,即位控并聯(lián)、段控分別控制。P0口為段控口,P2口為位控口,都是低電平為有效信號。在位控口接上電阻和的三極管,期望增加驅動電流,以使數(shù)碼管高亮度顯示。</p><p><b> 圖2.3 顯示電路</b></p><p> ?。?)、18B20
14、電路</p><p> 圖2.4所示的18B20由P3.0口引出。DS18B20具有獨特的單線接口僅需要一個端口引腳進行通信,而且用戶可定義報警設置。本實驗中就用到了該功能,當環(huán)境的溫度值超過系統(tǒng)設定的溫度上限值時,設定了蜂鳴器和LED燈的有效程序。蜂鳴器會報警,LED燈會點亮。</p><p> 圖2.4 DS18B20電路</p><p> 18B20
15、溫度傳感器的內部存儲器包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結構為8字節(jié)的存儲器,結構如圖2.5所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電復位時被刷新。第5個字節(jié),為配置寄存器,它的內容用于確定溫度值的數(shù)字轉換分辨率。DS18B20工作時寄存器中的分辨率轉換為相應精度的溫度數(shù)值。該字節(jié)各位的定義如圖2.6所示。低5位一直為1,TM是工作模式位,用于設置DS
16、18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為0,用戶要去改動,R1和R0決定溫度轉換的精度位數(shù),來設置分辨率。</p><p> 2.5 8字節(jié)存儲器結構圖</p><p> 2.6 DS18B20字節(jié)定義</p><p> 當DS18B20接收到溫度轉換命令后,開始啟動轉換。轉換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存
17、儲在高速暫存存儲器的第1、2字節(jié)。單片機可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB式表示。</p><p> 當符號位S=0時,表示測得的溫度值為正值,可以直接將二進制位轉換為十進制;當符號位S=1時,表示測得的溫度值為負值,要先將補碼變成原碼,再計算十進制數(shù)值</p><p> DS18B20完成溫度轉換后,就把測得的溫度值與RAM中的T
18、H、TL字節(jié)內容作比較。若T>TH或T<TL,則將該器件內的報警標志位置位,并對主機發(fā)出的報警搜索命令做出響應。因此,可用多只DS18B20同時測量溫度并進行報警搜索。</p><p> 在64位ROM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗碼(CRC)。主機ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到的ROM數(shù)據(jù)是否正確。</p><p> 另外,
19、由于DS18B20單線通信功能是分時完成的,它有嚴格的時隙概念,因此讀寫時序很重要。系統(tǒng)對DS18B20的各種操作按協(xié)議進行。操作協(xié)議為:初使化DS18B20(發(fā)復位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。分別說明如下:</p><p> ●初始化:單總線的所有處理均從初始化開始。初始化過程是主機通過向作為從機的DS18B20芯片發(fā)一個有時間寬度要求的初始化脈沖實現(xiàn)的。初始化后,才可進行讀寫操作。
20、</p><p> ●ROM操作命令:總線主機檢測到DS18B20的存在便可以發(fā)出ROM操作命令之一。這些命令如表2.1所示。</p><p> 表2.1 ROM操作命令</p><p> ●存儲器操作命令如表2.2所示。 </p><p> 表2.2 存儲器操作命令</p><p> 2.2、數(shù)字溫度
21、計電路原理圖</p><p><b> 見附錄A。</b></p><p> 2.3、數(shù)字溫度計PCB圖</p><p><b> 見附錄B和附錄C。</b></p><p> 2.4、數(shù)字溫度計元器件布局圖</p><p><b> 見附錄D。</
22、b></p><p> 2.5、數(shù)字溫度計元器件清單</p><p><b> 見附錄E。</b></p><p> 第3章 數(shù)字溫度計軟件系統(tǒng)的設計</p><p> 3.1、數(shù)字溫度計使用單片機資源的情況</p><p> 數(shù)字溫度計設計使用單片機資源情況如下所述。P0口的八
23、根口線都用于控制數(shù)碼管的段空線,采用并聯(lián)方式連接。P2口的八根口線都用于控制數(shù)碼管的位控線,采用單獨連接方式。P1口則用于控制按鍵電路,只用到了P1.0和P1.1口,P1.0接S2按鍵,做為開啟鍵,P1.1口接S3按鍵,做為停止鍵,即按鍵復位狀態(tài)。P3口只用到了P3.0和P3.1口,P3.0口為18B20的DQ口控制狀態(tài),低電平有效,因此要是18B20處于工作狀態(tài),P3.0口的LED燈會被點亮。P3.1口是控制蜂鳴器和警示燈的口線,是低
24、電平有效,當蜂鳴器報警且警示燈點亮時,表示溫度超過系統(tǒng)設定的溫度上限值。</p><p> 3.2、數(shù)字溫度計軟件系統(tǒng)各模塊功能簡要介紹及流程框圖</p><p> 本次數(shù)字溫度計的設計目的,主要是通過單片機控制18B20溫度傳感器來測量周邊的環(huán)境溫度。在上電復位或按鍵復位后顯示系統(tǒng)提示符,通過開啟和停止鍵來控制溫度傳感器的工作狀態(tài)。但溫度高于系統(tǒng)設定的溫度上限值時,系統(tǒng)通過蜂鳴器報警
25、,同時點亮警示燈。主要的軟件模塊包括主程序、18B20初始化程序、做好讀溫度準備子程序、讀溫度子程序、寫溫度子程序、顯示子程序以及鍵掃描程序。他們的功能及流程框圖如下所示。由于18B20是串行口,故尤其要注意時序問題,要延時以給機器足夠的反應時間。</p><p><b> ?。?)、主程序</b></p><p> 主程序的功能是要操作整個系統(tǒng),首先要將溫度傳感器
26、的DQ拉高,通過單片機P1口的按鍵控制18B20的工作狀態(tài)。若開啟鍵按下,則做好讀溫度的準備,接著是先讀低位的溫度值,再讀高位的溫度值,然后將所讀的二進制溫度值轉換成十進制的溫度值,并將溫度值送往數(shù)碼管顯示。顯示溫度的過程中,若碰到溫度值超過系統(tǒng)設定的溫度上限值,則開啟報警電路。若按下停止鍵,則顯示系統(tǒng)提示符。流程框圖如圖3.1所示。</p><p> 3.1 主程序流程框圖</p><p&
27、gt; ?。?)、18B20初始化程序</p><p> 由于18B20初始化過程中有復位和存在脈沖的問題,因此需多次改變DQ的狀態(tài)并延時等待。首先要將DQ拉為高電平,延時幾微妙。其次將DQ拉為低電平,控制器Tx“復位脈沖”延時480-960us。接著又將DQ拉為高電平等待60us,最后延時讓18B20輸出存在脈沖。并且延時足夠長,等待脈沖輸出完畢。程序流程框圖如圖3.2所示。</p><p
28、> 3.2 18B20初始化流程框圖</p><p> ?。?)、做好讀溫度準備子程序</p><p> 18B20的操作協(xié)議為規(guī)定為:初使化DS18B20(發(fā)復位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。單總線的所有處理均從初始化開始。初始化過程是主機通過向作為從機的DS18B20芯片發(fā)一個有時間寬度要求的初始化脈沖實現(xiàn)的。初始化后,才可進行讀寫操作。當總線主機檢測
29、到DS18B20的存在,便可以發(fā)出ROM操作命令之一即可。Skip ROM就是ROM操作指令中的一個,其代碼為CCH。存儲器命令中的Convert T命令的作用是開啟溫度轉換,其代碼是44H,單線總線發(fā)出協(xié)議后,表示18B20處在讀溫度忙狀態(tài)。最后是數(shù)據(jù)處理情況。其流程框圖如圖3.3所示。</p><p> 圖3.3 做好讀溫度準備子程序流程框圖</p><p> (4)、讀溫度子
30、程序</p><p> 讀溫度的子程序中要注意控制器讀數(shù)的時間間隙。根據(jù)18B20的讀時序可以得知,首先應將DQ拉為高電平,一個機器周期后將其拉為低電平,然后將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備,接著開始讀溫度。利用與運算,將值從低位到高位讀出,讀一位則二進制數(shù)右移一位,即可讀完所測溫度八位數(shù)的值。讀的過程中要給控制器足夠的采樣時間。最后延時,給機器較長的反應時間
31、。其流程框圖如圖3.4所示。</p><p> 圖3.4 讀溫度子程序流程框圖</p><p> ?。?)、寫溫度子程序</p><p> 寫溫度的子程序與讀溫度的子程序類似,只需將讀溫度子程序中所讀得的值一位一位寫入。同樣是先將DQ拉為高電平,再拉低,然戶開始從低位到高位依次寫入。由于兩個寫時序間至少需要1us的恢復期,所以位與位之間至少延時2us時間。最后
32、稍作延時,給機器反應時間。其流程框圖如圖3.5所示。</p><p> 圖3.5 寫溫度子程序流程框圖</p><p><b> ?。?)、顯示函數(shù)</b></p><p> 本設計中有兩個顯示函數(shù),一個是按鍵或上電復位后的顯示函數(shù),即顯示系統(tǒng)提示符;另一個是所測得的溫度顯示。溫度的顯示可以精確到小數(shù)點后四位,多位數(shù)據(jù)的顯示可以采用數(shù)組的
33、方式一位一位將值送往數(shù)碼管顯示。整個程序的開始定義了一個存放顯示數(shù)值代碼的數(shù)組。還有一個位控的數(shù)組,用來控制數(shù)碼管的每一位。將數(shù)值代碼送往控制段控口的P0口,將位控值送往位控口P2口,每送一位要延時一段時間。以防有陰影,最后可將P0、P2口送“滅”的代碼。程序流程框圖如圖3.6所示。系統(tǒng)提示符顯示函數(shù),是由本人設定的固定顯示。將所要顯示的值送往數(shù)組,然后從低位到高位依次送往P2口顯示。其流程框圖如圖3.7所示。</p>&
34、lt;p> 圖3.6 數(shù)碼管顯示程序流程圖</p><p> 圖3.7 數(shù)碼管顯示系統(tǒng)提示符程序流程圖</p><p> ?。?)、鍵掃描子程序</p><p> 按鍵掃描子程序包括鍵值處理程序和鍵掃描程序。鍵處理程序中,首先得將P1口的電平拉高,則送往P1口的值為低電平有效,將所得的P1口的值取反后做為P1口的鍵值。按鍵接在單片機的P1口,鍵處理將
35、其值送往鍵掃描程序,判斷是否有鍵按下,延時消抖后再判斷是否有鍵按下,再次調P1口鍵處理函數(shù),若真正有鍵按下,取鍵值并暫存。然后判斷鍵是否松開,延時一直到鍵松開,再將所得的鍵值保存,并作為函數(shù)的返回值。其程序流程圖如圖3.8所示。</p><p> 圖3.8 鍵掃描程序流程圖</p><p> 第4章 設計結論、仿真結果</p><p> 4.1、數(shù)字溫度計
36、的設計結論及使用說明</p><p> 經(jīng)過制板與編程,本次設計的數(shù)字溫度計能夠準確達到預期的結果。能夠準確的按照軟件系統(tǒng)的設定實現(xiàn)其功能。該數(shù)字溫度計的使用說明如下:接通電源,電源指示燈亮,表明電源正常。當系統(tǒng)板進入上電復位或者按鍵復位后,能夠顯示系統(tǒng)提示符,即為“ZB090303”。單片機的P1口為按鍵控制口,當按下P1.0控制的S2鍵時,系統(tǒng)將進入18B20的工作狀態(tài),即顯示即時溫度。當溫度超過系統(tǒng)設定的
37、溫度上限值時,P3.1控制的蜂鳴器會報警,同時P3.1控制的LED燈會被點亮。當按下P1.1控制的S3按鍵時,18B20退出工作狀態(tài),即顯示系統(tǒng)提示符。</p><p> 4.2、數(shù)字溫度計的仿真結果</p><p> 數(shù)字溫度計的仿真結果如下:</p><p> ?。?)、上電或按鍵復位時的仿真結果如圖4.1所示。</p><p>
38、圖4.1 上電或按鍵復位時的仿真結果</p><p> ?。?)、按下S2鍵的仿真結果如圖4.2所示。</p><p> 圖4.2 按下S2鍵時的仿真結果</p><p> ?。?)、溫度超過20攝氏度時的仿真結果如圖4.3所示。</p><p> 圖4.3 溫度超過20攝氏度時的仿真結果</p><p>
39、 第5章 課程設計心得體會</p><p> 這次的單片機課程設計取得了圓滿成功。我早已經(jīng)為這一期的單片機課程設計做好了充分的準備。在大二的暑假期間,參加過的電子線路培訓,為本次的課程設計奠定了堅實的基礎。當老師把課程設計的題目與要求公布出來時,我無比的激動,一開始就對這次的課程設計充滿了信心。其實一開始是想著做搶答器的,可是由于該項目的成員已滿,經(jīng)過推敲,最終決定做一個數(shù)字溫度計的設計。</p>
40、<p> 由于在暑假培訓的時候就有做過相關的項目,所以這無疑給這次的課程設計帶來了很大的方便。數(shù)碼管系統(tǒng)板在這次課程設計之前已經(jīng)做好了,它能夠實現(xiàn)數(shù)字溫度計的設計要求。因此不必忙于去制板。暑假培訓中,做過的一些項目中,基本上包括了這次設計的子程序,所以只需稍加設計即可。本次的課程設計要求要高于暑假培訓的,因此還需要添加一些基本功能,例如按鍵控制功能。當把之前寫好的程序導入到單片機中去時,數(shù)碼管的顯示總是不對。所以只好從頭
41、至尾將程序檢查了一遍,但結果還是一樣,也沒發(fā)現(xiàn)有什么錯誤。后來仔細看了看原理圖,才發(fā)現(xiàn)自己少插了短路帽,導致系統(tǒng)板不能正常工作。既然要做好本次的課程設計,就應該要著手于每個細節(jié)。雖然大體上可以說出整個程序的功能,但細化到每條語句,我并不能說清楚它的來由,尤其是18B20的相關程序。因為對18B20的功能用法不是很了解,所以需查閱大量的資料去了解18B20的工作特點與用法。了解到一些有關18B20的知識。由于18B20單線通信功能是分時完
42、成的,它有嚴格的時隙概念,因此讀寫時序尤其重要。系統(tǒng)對18B20的各種操作按協(xié)議進行。</p><p> 18B20初始化過程中有復位和存在脈沖的問題,因此需多次改變DQ的狀態(tài)并延時等待。首先要將DQ拉為高電平,延時幾微妙。其次將DQ拉為低電平,控制器TX“復位脈沖”延時480-960us。接著又將DQ拉為高電平等待60us,最后延時讓18B20輸出存在脈沖。并且延時足夠長,等待脈沖輸出完畢。這便是18B20的
43、初始化程序過程。18B20的操作協(xié)議為規(guī)定為:初使化DS18B20(發(fā)復位脈沖)→發(fā)ROM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。單總線的所有處理均從初始化開始。初始化過程是主機通過向作為從機的DS18B20芯片發(fā)一個有時間寬度要求的初始化脈沖實現(xiàn)的。初始化后,才可進行讀寫操作。當總線主機檢測到DS18B20的存在,便可以發(fā)出ROM操作命令之一即可。Skip ROM就是ROM操作指令中的一個,其代碼為CCH。存儲器命令中的Convert
44、 T命令的作用是開啟溫度轉換,其代碼是44H,單線總線發(fā)出協(xié)議后,表示18B20處在讀溫度忙狀態(tài)。最后是數(shù)據(jù)處理情況。這便是18B20做好讀溫度準備的子程序過程。寫溫度的子程序與讀溫度的子程序類似,只需將讀溫度子程序中所讀得的值一位一位寫入。同樣是先將</p><p> 在做文檔的時候,同時也學會了繪制簡單的流程圖。做一次課程設計不僅要有實物而且還需要有論文。論文的撰寫需要大量的資料,在查找資料的過程中,又培養(yǎng)
45、了我從文獻、生產(chǎn)實踐、和調查研究中獲取知識的能力,提高了我從別人的經(jīng)驗、從其它學科找到解決問題新途徑的悟性。</p><p> 在整個過程中,我從中學到了不少東西,更深一步掌握了單片機電路,更深的了解設計中所用到的單片機最小系統(tǒng)的工作原理,同時也掌握了單片機各引腳的功能及用途。通過本次的課程設計,讓我了解到所學過的知識要及時復習,運用到實踐中,才能更好地掌握所學知識。</p><p>&
46、lt;b> 參考文獻</b></p><p> [1] 李朝青. 單片機原理及接口技術[M]. 北京:北京航空航天大學出版社,1998.</p><p> [2] 李勛等. 單片機實用教程[M]. 北京:北京航空航天大學出版社,2000.</p><p> [3] 王幸之等. 單片機應用系統(tǒng)抗干擾技術[M]. 北京:北京航空航天大學出版社,
47、1999.</p><p> [4] 李華. MCS-51系列單片機實用接口技術[M]. 北京:北京航空航天大學出版社,1993.</p><p> [5] 何為民. 低功耗單片微機系統(tǒng)設計[M]. 北京:北京航空航天大學出版社,1994.</p><p> [6] 何立民. 單片機應用技術選編5[M]. 北京:北京航空航天大學出版社,1997.</p&
48、gt;<p> [7] 李廣弟,朱月秀,冷祖祁. 單片機基礎(第三版)[M].北京:北京航空航天大學出版社,2007.</p><p> 附錄A 數(shù)字溫度計電路原理圖</p><p> 附錄B 數(shù)字溫度計PCB圖(正)</p><p> 附錄C 數(shù)字溫度計PCB圖(底)</p><p> 附錄D 數(shù)字溫度計元器
49、件布局圖</p><p> 附錄E 數(shù)字溫度計器件清單</p><p> 附錄F 數(shù)字溫度計源程序</p><p> //數(shù)字溫度計的設置:上電或按鍵復位后,顯示系統(tǒng)提示符ZB090303;當K2(P1.0口)鍵按下后,顯示即時溫度;P0口為段控口,P2口為位控口,P1 口 為按鍵控制口,P3口控制流水燈</p><p> #
50、include<reg52.h> //包含單片機寄存器的頭文件</p><p> #include<intrins.h> //包含_nop_()函數(shù)定義的頭文件</p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p>
51、<p> Uchar duan[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90, 0x8c,0xce,0x86,0xAB,0xA1,0xff};</p><p> // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</
52、p><p> // p T E n D 滅</p><p> uchar wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};</p><p> char find_code[8]={3,0
53、,3,0,9,0,8,2};</p><p> /*******************************************************************</p><p> 以下是DS18B20的操作程序</p><p> ******************************************************
54、*************/ </p><p> sbit DQ=P3^0; </p><p> sbit bz=P3^1;</p><p> uchar time; //設置全局變量,專門用于嚴格延時</p><p> /***************************************************
55、****************</p><p> 函數(shù)功能:將DS18B20傳感器初始化,讀取應答信號</p><p> 出口參數(shù):flag </p><p> *******************************************************************/</p><p> bit Init
56、_DS18B20(void)</p><p> {bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在</p><p> DQ = 1; //先將數(shù)據(jù)線拉高</p><p> for(time=0;time<2;time++) //略微延時約6微秒</p&g
57、t;<p><b> ;</b></p><p> DQ = 0; //再將數(shù)據(jù)線從高拉低,要求保持480~960us</p><p> for(time=0;time<200;time++) //略微延時約600微秒</p><p> ; //以向DS18B20發(fā)出一持續(xù)480
58、~960us的低電平復位脈沖 </p><p> DQ = 1; //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) </p><p> for(time=0;time<16;time++)</p><p> ; //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)</p><p> flag=DQ
59、; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) </p><p> for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢</p><p><b> ;</b></p><p> return (flag); //返回檢測成功標志</p&
60、gt;<p><b> }</b></p><p> /*******************************************************************</p><p> 函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)</p><p><b> 出口參數(shù):dat</b>
61、;</p><p> *******************************************************************/ </p><p> uchar ReadOneChar(void)</p><p> {uchar i=0;</p><p> uchar dat; //儲存讀出的一個字節(jié)
62、數(shù)據(jù)</p><p> for (i=0;i<8;i++)</p><p> { DQ =1; // 先將數(shù)據(jù)線拉高</p><p> _nop_(); //等待一個機器周期 </p><p> DQ = 0;//單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序</p><
63、p><b> dat>>=1;</b></p><p> _nop_(); //等待一個機器周期 </p><p> DQ = 1; //將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備</p><p> for(time=0;time<2;time++)<
64、;/p><p> ; //延時約6us,使主機在15us內采樣</p><p><b> if(DQ==1)</b></p><p> dat|=0x80; //如果讀到的數(shù)據(jù)是1,則將1存入dat</p><p><b> else</b></p><p>
65、 dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat</p><p> //將單片機檢測到的電平信號DQ存入r[i]</p><p> for(time=0;time<8;time++)</p><p> ; //延時3us,兩個讀時序之間必須有大于1us的恢復期</p><p> }
66、 </p><p> return(dat); //返回讀出的十進制數(shù)據(jù)</p><p><b> }</b></p><p> /*****************************************************************</p><p> 函數(shù)功
67、能:向DS18B20寫入一個字節(jié)數(shù)據(jù)</p><p><b> 入口參數(shù):dat</b></p><p> ******************************************************************/ </p><p> void WriteOneChar(unsigned char dat)&
68、lt;/p><p> { uchar i=0;</p><p> for (i=0;i<8;i++)</p><p> {DQ =1; // 先將數(shù)據(jù)線拉高</p><p> _nop_(); //等待一個機器周期 </p><p> DQ=0; //將數(shù)據(jù)
69、線從高拉低時即啟動寫時序 </p><p> DQ=dat&0x01; //利用與運算取出要寫的某位二進制數(shù)據(jù),</p><p> //并將其送到數(shù)據(jù)線上等待DS18B20采樣</p><p> for(time=0;time<10;time++)</p><p> ; //延時約30us,DS18B
70、20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣</p><p> DQ=1; //釋放數(shù)據(jù)線 </p><p> for(time=0;time<1;time++)</p><p> ;//延時3us,兩個寫時序間至少需要1us的恢復期</p><p> dat>>=1; /
71、/將dat中的各二進制位數(shù)據(jù)右移1位</p><p><b> }</b></p><p> for(time=0;time<4;time++)</p><p> ; //稍作延時,給硬件一點反應時間</p><p><b> }</b></p><p> /
72、*******************************************************************</p><p> 函數(shù)功能:做好讀溫度的準備</p><p> *******************************************************************/ void ReadyReadTemp(void)&
73、lt;/p><p> { Init_DS18B20(); //將DS18B20初始化</p><p> WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p> WriteOneChar(0x44); // 啟動溫度轉換 </p><p> for(time=0;time<100;time
74、++)</p><p> ; //溫度轉換需要一點時間</p><p> Init_DS18B20(); //將DS18B20初始化</p><p> WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p> WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
75、</p><p><b> }</b></p><p> /*******************************************************************</p><p><b> 延時函數(shù)</b></p><p> *****************
76、**************************************************/</p><p> void display_delay(void)</p><p> { unsigned int time1=100;</p><p> while(time1) time1-- ; </p><p>&
77、lt;b> }</b></p><p> /*******************************************************************</p><p><b> 延時1ms函數(shù)</b></p><p> ************************************
78、*******************************/</p><p> void DelayX1ms(uint count) </p><p><b> { uint j;</b></p><p> while(count--!=0) </p><p> { for(j=0;j
79、<80;j++);</p><p> } </p><p><b> }</b></p><p> /*******************************************************************</p><p><b> 顯示班級學號
80、</b></p><p> *******************************************************************/</p><p> void disp()</p><p> {char i,j=0xfe;</p><p><b> char k;</b&g
81、t;</p><p> for(i=0;i<8;i++)</p><p><b> { P2=j;</b></p><p> k=find_code[i];</p><p> P0=duan[k];</p><p> DelayX1ms(1);</p><p&g
82、t; j=_crol_(j,1);</p><p><b> P0=0xff;</b></p><p><b> }</b></p><p><b> }</b></p><p> /******************************************
83、*************************</p><p> * 函數(shù)原型:keychuli();</p><p> * 功 能:處理與鍵盤相連的P1口的內容,作為鍵值。</p><p> *******************************************************************/</
84、p><p> uchar keychuli()</p><p> { uchar k; </p><p> k=P1; //P1口內容送K</p><p> k=~k; /
85、/取反</p><p> return(k); //返回鍵值</p><p><b> }</b></p><p> /*******************************************************************</p><p&g
86、t; * 函數(shù)原型:key();</p><p> * 功 能:鍵盤掃描函數(shù),函數(shù)返回值即鍵值。</p><p> *******************************************************************/</p><p> uchar key()</p><p> {
87、uchar keyzhi,keyzhii; //電子鐘鍵盤按鍵鍵值臨時存放</p><p> keyzhi=keychuli(); //調P1口處理函數(shù)</p><p> if(keyzhi!=0) //有鍵動作延時去抖動,否則函數(shù)返回</p><p><b> {
88、disp();</b></p><p> keyzhi=keychuli(); //再次調P1口處理函數(shù)</p><p> if(keyzhi!=0) //真正有鍵按下,取鍵值并暫存</p><p> { keyzhii=keyzhi;</p><p> while(k
89、eyzhi!=0) //判按鍵是否釋放,沒有釋放延時去抖動等待釋放</p><p><b> {disp();</b></p><p> keyzhi=keychuli();</p><p><b> }</b></p><p> keyzhi=keyzhii; /
90、/按鍵釋放后恢復按鍵鍵值</p><p><b> }</b></p><p><b> } </b></p><p> return(keyzhi); //返回按鍵鍵值</p><p><b> }</b></p>&l
91、t;p> /*****************************************************************</p><p><b> 顯示溫度程序</b></p><p> *****************************************************************/</p&g
92、t;<p> void display(uchar gewei,uchar shiwei ,uchar baiwei,uchar shi,uchar bai,uchar qian,uchar wan)</p><p> { P0=duan[wan]; //萬分位</p><p> P2=wei[6]; </p><p> dis
93、play_delay();</p><p><b> P2=0xff;</b></p><p> P0=duan[qian]; //千分位</p><p> P2=wei[5]; </p><p> display_delay();</p><p><b> P2=0xff;
94、</b></p><p> P0=duan[bai]; //百分位</p><p> P2=wei[4]; </p><p> display_delay();</p><p><b> P2=0xff;</b></p><p> P0=duan[shi]; //十分位&l
95、t;/p><p> P2=wei[3]; </p><p> display_delay();</p><p><b> P2=0xff;</b></p><p> P0=duan[gewei]&0x7f; //個位</p><p> P2=wei[2]; </p>
96、<p> display_delay();</p><p><b> P2=0xff;</b></p><p> P0=duan[shiwei]; //十位</p><p> P2=wei[1]; </p><p> display_delay();</p><p>&l
97、t;b> P2=0xff;</b></p><p> P0=duan[baiwei]; //百位</p><p> P2=wei[0]; </p><p> display_delay();</p><p><b> P2=0xff;</b></p><p> P0=
98、0xff; </p><p><b> } </b></p><p> /*******************************************************************</p><p><b> 主函數(shù)</b></p><p> ******
99、*************************************************************/</p><p> void main(void)</p><p> { uchar TL,TH,TD,TN;</p><p> uchar gewei,shiwei,baiwei,shi,bai,qian,wan;</p>
100、<p> unsigned int xiaoshu;</p><p><b> uchar m;</b></p><p><b> DQ=1;</b></p><p><b> m=key();</b></p><p><b> while(1)
101、</b></p><p><b> { disp();</b></p><p><b> m=key();</b></p><p> if(m==0x01)</p><p> { while(1)</p><p> { w:ReadyReadTemp()
102、; </p><p> TL=ReadOneChar(); //先讀的是溫度值低位</p><p> TH=ReadOneChar(); //接著讀的是溫度值高位</p><p> TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16</p><p> TD=(TL&
103、;0x0f);</p><p> xiaoshu=625*TD;</p><p> gewei=TN%10;</p><p> shiwei=(TN/10)%10;</p><p> baiwei=TN/100;</p><p> if(baiwei==0) baiwei=15;//滅</p>
104、<p> if(baiwei==15&&shiwei==0) shiwei=15;//滅</p><p> shi=(xiaoshu/1000)%10;</p><p> bai=(xiaoshu/100)%10; </p><p> qian=(xiaoshu/10)%10;</p><p
105、> wan=xiaoshu%10; </p><p> Display (gewei, shiwei, baiwei, shi,bai,qian,wan);</p><p> if(TN>=20 )</p><p><b> bz=0;</b></p><p> else bz=1; &
106、lt;/p><p><b> m=key();</b></p><p> if(m==0x02)</p><p><b> { for(;;)</b></p><p><b> { disp();</b></p><p><b> m=k
107、ey();</b></p><p> if(m==0x01)</p><p><b> goto w;</b></p><p><b> } </b></p><p><b> }</b></p><p><b> }&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設計---數(shù)字溫度計
- 數(shù)字溫度計課程設計
- 數(shù)字溫度計課程設計
- 數(shù)字溫度計課程設計
- 數(shù)字溫度計課程設計
- 數(shù)字溫度計課程設計
- 課程設計-數(shù)字溫度計
- 課程設計---數(shù)字溫度計設計
- 數(shù)字溫度計課程設計 (2)
- 數(shù)字溫度計課程設計 (2)
- 數(shù)字溫度計課程設計 (2)
- 數(shù)字溫度計的課程設計
- 數(shù)字溫度計課程設計報告
- 課程設計之數(shù)字溫度計
- 數(shù)字溫度計課程設計報告
- 數(shù)字溫度計的課程設計
- 數(shù)字溫度計課程設計 (2)
- 數(shù)字溫度計課程設計 (2)
- 數(shù)字溫度計課程設計---基于51單片機數(shù)字溫度計設計
- 數(shù)字溫度計課程設計---基于51單片機數(shù)字溫度計設計
評論
0/150
提交評論