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