版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 基于單片機(jī)的DS18B20數(shù)字溫度計(jì)設(shè)計(jì)</p><p> 基于單片機(jī)的DS18B20數(shù)字溫度計(jì)設(shè)計(jì)</p><p> 學(xué)生姓名: 指導(dǎo)老師: </p><p><b> 內(nèi)容摘要:</b>&
2、lt;/p><p> 隨著現(xiàn)代信息化技術(shù)的飛速發(fā)展和傳統(tǒng)工業(yè)改造的逐步實(shí)現(xiàn),能獨(dú)立工作的溫度檢測(cè)系統(tǒng)已廣泛應(yīng)用于各種不同的領(lǐng)域。本文介紹了一個(gè)基于STC89C52單片機(jī)和數(shù)字溫度傳感器DS18B20的測(cè)溫系統(tǒng),并用LED數(shù)碼管顯示溫度值,易于讀數(shù)。系統(tǒng)電路簡單、操作簡便,能任意設(shè)定報(bào)警溫度并可查詢最近的10個(gè)溫度值,系統(tǒng)具有可靠性高、成本低、功耗小等優(yōu)點(diǎn)。</p><p> 關(guān)鍵詞:單片機(jī)
3、 數(shù)字溫度傳感器 溫度計(jì)</p><p><b> 目 錄</b></p><p><b> 1 引言4</b></p><p><b> 2 設(shè)計(jì)要求4</b></p><p> 2.1 基本要求4</p><p> 2.2 擴(kuò)展
4、功能4</p><p> 3 總體方案設(shè)計(jì)4</p><p> 3.1 方案論證4</p><p> 3.1.1 方案一4</p><p> 3.1.2 方案二5</p><p> 3.2 總體設(shè)計(jì)框圖5</p><p><b> 4 硬件設(shè)計(jì)5</b&
5、gt;</p><p> 4.1 單片機(jī)系統(tǒng)5</p><p> 4.2 數(shù)字溫度傳感器模塊6</p><p> 4.2.1 DS18B20性能6</p><p> 4.2.2 DS18B20外形及引腳說明7</p><p> 4.2.3 DS18B20接線原理圖7</p><p
6、> 4.2.4 DS18B20時(shí)序圖7</p><p> 4.2.5 數(shù)據(jù)處理9</p><p> 4.3 顯示電路10</p><p> 4.4 聲光報(bào)警電路10</p><p> 4.5 鍵盤輸入電路11</p><p><b> 5 軟件設(shè)計(jì)11</b><
7、/p><p> 5.1 主程序模塊11</p><p> 5.2 讀溫度值模塊12</p><p> 5.3 中斷模塊14</p><p> 5.4 溫度查詢模塊15</p><p> 5.5 溫度設(shè)定、報(bào)警模塊16</p><p> 5.6 數(shù)碼管驅(qū)動(dòng)模塊18</p&
8、gt;<p><b> 6 源程序19</b></p><p><b> 7 總結(jié)26</b></p><p><b> 參考文獻(xiàn):28</b></p><p><b> 1 引言</b></p><p> 隨著人們生活水平的
9、不斷提高,單片機(jī)控制無疑是人們追求的目標(biāo)之一,它所給人帶來的方便是不可否定的,各種數(shù)字系統(tǒng)的應(yīng)用也使人們的生活更加舒適。數(shù)字化控制、智能控制為現(xiàn)代人的工作、生活、科研等方面帶來方便。其中數(shù)字溫度計(jì)就是一個(gè)典型的例子。</p><p> 數(shù)字溫度計(jì)與傳統(tǒng)的溫度計(jì)相比,具有讀數(shù)方便、測(cè)溫范圍廣、測(cè)溫精確、功能多樣話等優(yōu)點(diǎn)。其主要用于對(duì)測(cè)溫要求準(zhǔn)確度比較高的場(chǎng)所,或科研實(shí)驗(yàn)室使用,該設(shè)計(jì)使用STC89C52單片機(jī)作控
10、制器,數(shù)字溫度傳感器DS18B20測(cè)量溫度,單片機(jī)接受傳感器輸出,經(jīng)處理用LED數(shù)碼管實(shí)現(xiàn)溫度值顯示。</p><p><b> 2 設(shè)計(jì)要求</b></p><p><b> 2.1 基本要求</b></p><p> 實(shí)現(xiàn)實(shí)時(shí)溫度顯示,測(cè)溫范圍0~500C,誤差50C以內(nèi)。</p><p>
11、;<b> 2.2 擴(kuò)展功能</b></p><p> 溫度報(bào)警,能任意設(shè)定溫度范圍實(shí)現(xiàn)聲光報(bào)警;</p><p> 每隔10分鐘記錄一次溫度數(shù)據(jù),至少能查詢過去10個(gè)時(shí)刻的溫度情況。</p><p><b> 3 總體方案設(shè)計(jì)</b></p><p><b> 3.1 方案論證
12、</b></p><p><b> 3.1.1 方案一</b></p><p> 由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類的器件,將隨被測(cè)溫度變化的電壓或電流采樣,進(jìn)行A/D轉(zhuǎn)換后就可以用單片機(jī)進(jìn)行數(shù)據(jù)處理,實(shí)現(xiàn)溫度顯示。這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,增大了電路的復(fù)雜性,而且要做到高精度也比較困難。</p><p><
13、b> 3.1.2 方案二</b></p><p> 考慮到在單片機(jī)屬于數(shù)字系統(tǒng),容易想到數(shù)字溫度傳感器,可選用DS18B20數(shù)字溫度傳感器,此傳感器為單總線數(shù)字溫度傳感器,起體積小、構(gòu)成的系統(tǒng)結(jié)構(gòu)簡單,它可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(hào)給單片機(jī)處理,即可實(shí)現(xiàn)溫度顯示。另外DS18B20具有3引腳的小體積封裝,測(cè)溫范圍為-55~+125攝氏度,測(cè)溫分辨率可達(dá)0.0625攝氏度,其測(cè)量范圍與精度都
14、能符合設(shè)計(jì)要求。</p><p> 以上兩種方案相比較,第二種方案的電路、軟件設(shè)計(jì)更簡單,此方案設(shè)計(jì)的系統(tǒng)在功耗、測(cè)量精度、范圍等方面都能很好地達(dá)到要求,故本設(shè)計(jì)采用方案二。</p><p> 3.2 總體設(shè)計(jì)框圖</p><p> 本方案設(shè)計(jì)的系統(tǒng)由單片機(jī)系統(tǒng)、數(shù)字溫度傳感器、LED顯示模塊、按鍵控制模塊、溫度報(bào)警模塊組成,其總體架構(gòu)如下圖1。</p&
15、gt;<p> 圖1 系統(tǒng)總體方框圖</p><p><b> 4 硬件設(shè)計(jì)</b></p><p><b> 4.1 單片機(jī)系統(tǒng)</b></p><p> 本設(shè)計(jì)采用STC89C52單片機(jī)作為控制器,完成所有功能的控制,包括:</p><p> DS18B20數(shù)字溫度傳感器
16、的初始化和讀取溫度值</p><p> LED數(shù)碼管顯示驅(qū)動(dòng)與控制</p><p><b> 按鍵識(shí)別和響應(yīng)控制</b></p><p><b> 溫度設(shè)置和報(bào)警</b></p><p><b> 溫度值的存儲(chǔ)和讀取</b></p><p>
17、單片機(jī)系統(tǒng)電路原理圖:</p><p> 圖2 單片機(jī)系統(tǒng)原理圖</p><p> 4.2 數(shù)字溫度傳感器模塊</p><p> 4.2.1 DS18B20性能</p><p> 獨(dú)特的單線接口僅需一個(gè)端口引腳進(jìn)行通信</p><p><b> 簡單的多點(diǎn)分布應(yīng)用</b></p&g
18、t;<p><b> 無需外部器件</b></p><p><b> 可通過數(shù)據(jù)線供電</b></p><p><b> 零待機(jī)功耗</b></p><p> 測(cè)溫范圍-55~+125℃,以0.5℃遞增</p><p> 可編程的分辨率為9~12位,對(duì)應(yīng)
19、的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃</p><p> 溫度數(shù)字量轉(zhuǎn)換時(shí)間200ms,12位分辨率時(shí)最多在750ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字</p><p> 應(yīng)用包括溫度控制、工業(yè)系統(tǒng)、消費(fèi)品、溫度計(jì)和任何熱感測(cè)系統(tǒng)</p><p> 負(fù)壓特性:電源極性接反時(shí),傳感器不會(huì)因發(fā)熱而燒毀,但不能正常工作</p><p
20、> 4.2.2 DS18B20外形及引腳說明</p><p> 圖3 DS18B20外形及引腳</p><p><b> GND:地</b></p><p> DQ:單線運(yùn)用的數(shù)據(jù)輸入/輸出引腳</p><p> VD:可選的電源引腳</p><p> 4.2.3 DS18B20
21、接線原理圖</p><p> 單總線通常要求接一個(gè)約4.7K左右的上拉電阻,這樣,當(dāng)總線空閑時(shí),其狀態(tài)為高電平。</p><p> 圖4 DS18B20接線原理圖</p><p> 4.2.4 DS18B20時(shí)序圖</p><p> 主機(jī)使用時(shí)間隙來讀寫DS18B20的數(shù)據(jù)位和寫命令字的位。</p><p>&
22、lt;b> 初始化時(shí)序如下圖:</b></p><p> 圖5 DS18B20初始化時(shí)序</p><p> DS18B20讀寫時(shí)序:</p><p> 圖6 DS18B20讀寫時(shí)序</p><p> 4.2.5 數(shù)據(jù)處理</p><p> 高速暫存存儲(chǔ)器由9個(gè)字節(jié)組成,其分配如表5所示。
23、當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在 高速暫存存儲(chǔ)器的第0和第1個(gè)字節(jié)。單片機(jī)可通過單線接口讀到該數(shù)據(jù),讀取時(shí)低位在前,高位在后。</p><p><b> 圖7 字節(jié)分配</b></p><p> 下表為12位轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在18B20的兩個(gè)8比特的RAM中,二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于0, 這5位為0,
24、只要將測(cè)到的數(shù)值乘于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際 溫度。 例如+125℃的數(shù)字輸出為07D0H,</p><p> 實(shí)際溫度=07D0H*0.0625=2000*0.0625=125℃。</p><p> 例如-55℃的數(shù)字輸出為FC90H,則應(yīng)先將11位數(shù)據(jù)位取反加1得370H(符號(hào)位不變,也不作運(yùn)算)
25、,</p><p> 實(shí)際溫度=370H*0.0625=880*0.0625=55℃。</p><p> 可見其中低四位為小數(shù)位。</p><p> 圖8 DS18B20溫度數(shù)據(jù)表</p><p><b> 4.3 顯示電路</b></p><p> LED數(shù)碼管顯示采用動(dòng)態(tài)掃描方式,能
26、簡化電路布線,節(jié)約單片機(jī)I/O端口。</p><p> 段碼和位碼由單片機(jī)P0送出,分別用74HC673N鎖存。</p><p> 圖9 數(shù)碼管驅(qū)動(dòng)顯示電路</p><p> 4.4 聲光報(bào)警電路</p><p> 當(dāng)溫度超過設(shè)定溫度值時(shí),實(shí)現(xiàn)聲光報(bào)警,蜂鳴器鳴叫、8個(gè)發(fā)光二極管點(diǎn)亮。蜂鳴器由單片機(jī)P2^3口控制,用三極管驅(qū)動(dòng),發(fā)光
27、二極管接單片機(jī)P1口,由74HC673N鎖存。</p><p> 圖10 聲光報(bào)警電路</p><p> 4.5 鍵盤輸入電路</p><p> 四個(gè)鍵分別連接單片機(jī)P3^4、P3^5、P3^6、P3^7構(gòu)成獨(dú)立式鍵盤,分別實(shí)現(xiàn)加、減、報(bào)警溫度設(shè)定功能鍵和溫度查詢功能鍵。</p><p> 圖11 鍵盤輸入電路</p>
28、<p><b> 5 軟件設(shè)計(jì)</b></p><p><b> 5.1 主程序模塊</b></p><p> 主程序需要調(diào)用3個(gè)子程序,分別為:</p><p> 實(shí)時(shí)溫度顯示子程序:驅(qū)動(dòng)數(shù)碼管把實(shí)時(shí)溫度值送出在LED數(shù)碼管顯示</p><p> 查詢記錄溫度值子程序:查詢過去
29、存儲(chǔ)的溫度值,最多可查詢10個(gè)值</p><p> 溫度設(shè)定、報(bào)警子程序:設(shè)定報(bào)警溫度值,當(dāng)溫度超過該值時(shí)產(chǎn)生報(bào)警,即驅(qū)動(dòng)蜂鳴器鳴叫、8個(gè)發(fā)光二極管發(fā)光</p><p><b> 主程序流程圖:</b></p><p> 圖12 主程序流程圖</p><p> 5.2 讀溫度值模塊</p><
30、;p> 讀溫度值模塊需要調(diào)用4個(gè)子程序,分別為:</p><p> DS18B20初始化子程序:讓單片機(jī)知道DS18B20在總線上且已準(zhǔn)備好操作</p><p> DS18B20寫字節(jié)子程序:對(duì)DS18B20發(fā)出命令</p><p> DS18B20讀字節(jié)子程序:讀取DS18B20存儲(chǔ)器的數(shù)據(jù)</p><p> 延時(shí)子程序:對(duì)
31、DS18B20操作時(shí)的時(shí)序控制</p><p> 讀溫度值模塊流程圖:</p><p> 圖13 讀溫度值子程序流程圖 </p><p> DS18B20初始化子程序流程圖:</p><p><b> N</b></p><p><b> Y</b><
32、;/p><p> 圖14 DS18B20初始化子程序流程圖</p><p> DS18B20寫字節(jié)和讀字節(jié)子程序流程圖:</p><p> 圖15 DS18B20寫字節(jié)子程序流程圖圖16 DS18B20讀字節(jié)子程序流程圖</p><p><b> 5.3 中斷模塊</b></p><p>
33、 中斷采用T0方式1,初始值定時(shí)為50ms。</p><p> 中斷模塊需調(diào)用兩個(gè)子程序:</p><p> 讀溫度值子程序:定時(shí)讀取溫度值,實(shí)時(shí)更新溫度值</p><p> 記錄溫度值子程序:定時(shí)記錄溫度值,供查詢使用</p><p> 把這兩個(gè)子程序放在中斷的原因是,不會(huì)因?yàn)檎{(diào)整報(bào)警溫度或查詢歷史溫度值而停止更新溫度值和記錄溫度
34、值。</p><p><b> 中斷模塊流程圖:</b></p><p><b> Y</b></p><p><b> N</b></p><p> 圖17中斷模塊流程圖</p><p> 5.4 溫度查詢模塊</p><
35、p> 溫度查詢模塊需要接受按鍵輸入,進(jìn)入查詢界面后,按加減鍵分別查詢上一個(gè)和下一個(gè)歷史溫度值,并驅(qū)動(dòng)數(shù)碼管顯示需要查詢的溫度值。</p><p> 溫度查詢模塊流程圖如下:</p><p><b> N</b></p><p><b> Y</b></p><p><b>
36、 N</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b> N&l
37、t;/b></p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> N</b&
38、gt;</p><p><b> Y</b></p><p> 圖18 溫度查詢模塊流程圖</p><p> 5.5 溫度設(shè)定、報(bào)警模塊</p><p> 此模塊跟溫度查詢模塊類似,需要接受按鍵輸入,進(jìn)入模塊界面后,按加減鍵分別上調(diào)和下調(diào)設(shè)定報(bào)警溫度值,當(dāng)實(shí)時(shí)溫度值超過設(shè)定值時(shí)驅(qū)動(dòng)蜂鳴器發(fā)聲,并點(diǎn)亮8位發(fā)光二極管
39、,實(shí)現(xiàn)聲光報(bào)警。</p><p> 溫度設(shè)定、報(bào)警模塊流程圖如下:</p><p><b> N</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b>&l
40、t;/p><p><b> N</b></p><p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> N</b></p&
41、gt;<p><b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> Y</b></p><p><b> N</b></p>
42、<p><b> N</b></p><p><b> Y</b></p><p> 圖19 溫度設(shè)定、報(bào)警模塊流程圖</p><p> 5.6 數(shù)碼管驅(qū)動(dòng)模塊</p><p> 本設(shè)計(jì)數(shù)碼管通過鎖存器接單片機(jī)P0口,采用動(dòng)態(tài)掃描驅(qū)動(dòng)7段LED數(shù)碼管進(jìn)行顯示,需調(diào)用延時(shí)子程序以穩(wěn)
43、定顯示。</p><p><b> 模塊流程圖如下:</b></p><p> 圖20 數(shù)碼管驅(qū)動(dòng)模塊流程圖</p><p><b> 6 源程序</b></p><p> #include<reg52.h></p><p> #define uchar
44、 unsigned char</p><p> #define uint unsigned int</p><p> /*************************變量定義************************************/</p><p> sbit DQ=P2^2;//ds18b20 端口</p><p>
45、; sbit beep=P2^3;//蜂鳴器使能端</p><p> sbit dula=P2^6;//數(shù)碼管段選使能</p><p> sbit wela=P2^7;//數(shù)碼管位選使能</p><p> sbit add=P3^5;//加鍵</p><p> sbit sub=P3^4;//減鍵</p><p&
46、gt; sbit alarm=P3^6;//設(shè)定報(bào)警功能鍵</p><p> sbit record=P3^7;//查詢溫度記錄功能鍵</p><p> uchar code tabled[]={</p><p> 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, //0~9的七段數(shù)碼管段碼</p&
47、gt;<p> 0x40,0x63,0x39};//- c 的段碼</p><p> uchar code tablew[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};//1~8個(gè)數(shù)碼管的位選碼</p><p> uchar recordtable[10];//存儲(chǔ)過去的十個(gè)溫度值</p><p>
48、uchar temperature;//溫度值</p><p> uchar countsec,recordnum,count;//計(jì)數(shù)變量</p><p> uint countmin;//計(jì)數(shù)變量</p><p> uchar alanum=30;//報(bào)警溫度值,初始值為30攝氏度</p><p> uchar z=65;//消
49、抖延時(shí)函數(shù)入口參數(shù)</p><p> /**********************函數(shù)聲明***************************************/</p><p> void delay1(uchar MS);//動(dòng)態(tài)掃描延時(shí)子程序</p><p> void delay(uchar i);//DS18B20工作延時(shí)子程序 <
50、;/p><p> void Init_DS18B20();//DS18B20初始化子程序</p><p> void WriteOneChar(unsigned char dat);//向DS18B20寫一字節(jié)數(shù)據(jù)</p><p> uchar ReadOneChar(void);//向DS18B20讀一字節(jié)數(shù)據(jù)</p><p> voi
51、d GetTemperature();//由DS18B20產(chǎn)生溫度值</p><p> void Display(uchar wei,uchar duan);//數(shù)碼管驅(qū)動(dòng)子程序</p><p> void Alarm();//溫度報(bào)警</p><p> void Showtemperature(uchar tt);//溫度顯示</p><
52、p> void Keeprecord();//記錄溫度值</p><p> void Showrecord();//顯示記錄的溫度值</p><p> /*********************主函數(shù)*******************************************/</p><p> void main()</p>
53、<p><b> {</b></p><p> TMOD=0x01;//定時(shí)器初始化,定時(shí)器0方式1</p><p> TH0=(65536-50000)/256;//50ms</p><p> TL0=(65536-50000)%256;</p><p> EA=1;//開中斷</p>
54、<p><b> ET0=1;</b></p><p> TR0=1;//啟動(dòng)定時(shí)器</p><p><b> while(1)</b></p><p><b> {</b></p><p> Showtemperature(temperature);/
55、/顯示實(shí)時(shí)溫度</p><p> Alarm();//溫度設(shè)定、報(bào)警</p><p> Showrecord();//查詢溫度記錄值</p><p><b> }</b></p><p><b> }</b></p><p> /******************
56、******動(dòng)態(tài)掃描延時(shí)函數(shù)********************************/</p><p> void delay1(uchar MS)</p><p><b> {</b></p><p><b> int i,j;</b></p><p> for(i=80;i>
57、;0;i--)</p><p> for(j=MS;j>0;j--);</p><p><b> }</b></p><p> /************************DS18B20工作延時(shí)函數(shù)*****************************/</p><p> void delay(u
58、char i)</p><p><b> {</b></p><p> while(i--);</p><p><b> }</b></p><p> /*************************DS18B20初始化函數(shù)******************************/&
59、lt;/p><p> void Init_DS18B20(void)</p><p><b> {</b></p><p> unsigned char x=0;</p><p> DQ = 1; //DQ復(fù)位</p><p> delay(8); //稍做延時(shí)</p>
60、<p> DQ = 0; //單片機(jī)將DQ拉低</p><p> delay(80); //精確延時(shí) 大于 480us</p><p> DQ = 1; //拉高總線</p><p> delay(10);</p><p> x=DQ; //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗&l
61、t;/p><p><b> delay(5);</b></p><p><b> while(!x)</b></p><p><b> {</b></p><p><b> x=DQ;</b></p><p><b>
62、 }</b></p><p><b> }</b></p><p> /*************************讀一個(gè)字節(jié)**************************************/</p><p> uchar ReadOneChar(void)</p><p><
63、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 = 0;
64、 // 給脈沖信號(hào)</p><p><b> dat>>=1;</b></p><p> DQ = 1; // 給脈沖信號(hào)</p><p><b> if(DQ)</b></p><p> dat|=0x80;</p><p><b> del
65、ay(5);</b></p><p><b> }</b></p><p> return(dat);</p><p><b> }</b></p><p> /**************************寫一個(gè)字節(jié)****************************
66、*********/</p><p> void WriteOneChar(unsigned char dat)</p><p><b> {</b></p><p> unsigned char i=0;</p><p> for (i=8; i>0; i--)</p><p>&
67、lt;b> {</b></p><p><b> DQ = 0;</b></p><p> DQ = dat&0x01;</p><p><b> delay(5);</b></p><p><b> DQ = 1;</b></p>
68、;<p><b> dat>>=1;</b></p><p><b> }</b></p><p><b> delay(5);</b></p><p><b> }</b></p><p> /************
69、*************產(chǎn)生溫度值***************************************/</p><p> void GetTemperature()</p><p><b> {</b></p><p> uchar tempL,tempH;//分別為數(shù)據(jù)低位和高位</p><p>
70、 uint temp;</p><p> Init_DS18B20();</p><p> WriteOneChar(0xCC); // 跳過讀序列號(hào)的操作</p><p> WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換</p><p> delay(200);</p><p> Init_DS
71、18B20();</p><p> WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作 </p><p> WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度</p><p> tempL=ReadOneChar();//讀出溫度低位LSB</p><p> tempH=Re
72、adOneChar();//讀出溫度高位MSB</p><p> temp=tempH*16+tempL/16;//tempL右移四位去掉小數(shù)位</p><p> temperature=temp&0xff;//測(cè)量0~50度,只取temp低八位</p><p><b> }</b></p><p> /
73、**********************數(shù)碼管驅(qū)動(dòng)函數(shù)*************************************/</p><p> void Display(uchar wei,uchar duan)</p><p><b> {</b></p><p><b> dula=0;</b><
74、/p><p><b> P0=0xff;</b></p><p><b> wela=1;</b></p><p> P0=tablew[wei];</p><p><b> wela=0;</b></p><p><b> P0=0;&
75、lt;/b></p><p><b> dula=1;</b></p><p> P0=tabled[duan];</p><p><b> dula=0;</b></p><p> delay1(1);</p><p><b> }</b&g
76、t;</p><p> /**********************溫度顯示函數(shù)**************************************/</p><p> void Showtemperature(uchar tt)</p><p><b> {</b></p><p> Display(
77、2,tt/10);//顯示溫度數(shù)值</p><p> Display(3,tt%10);</p><p> Display(4,11);//顯示攝氏度單位</p><p> Display(5,12);</p><p><b> }</b></p><p> /***********
78、*********溫度值設(shè)定、報(bào)警函數(shù)**********************************/</p><p> void Alarm()</p><p><b> {</b></p><p><b> bit flag;</b></p><p> if(alarm==0)&l
79、t;/p><p><b> {</b></p><p> delay1(80);//延時(shí)消抖</p><p> if(alarm==0)</p><p><b> {</b></p><p> flag=1;//第一次按鍵進(jìn)入設(shè)置</p><p&g
80、t;<b> }</b></p><p><b> }</b></p><p> while(flag)</p><p><b> {</b></p><p> if(add==0)</p><p><b> {</b>
81、</p><p> delay1(z);//延時(shí)消抖</p><p> if(add==0)</p><p><b> {</b></p><p> alanum++;//add鍵按下,上調(diào)設(shè)定值</p><p> if(alanum==51)</p><p>&
82、lt;b> {</b></p><p> alanum=0;//最大值為50攝氏度,循環(huán)顯示</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
83、 if(sub==0)</p><p><b> {</b></p><p> delay1(z);//延時(shí)消抖</p><p> if(sub==0)</p><p><b> {</b></p><p> alanum--;//sub鍵按下,下調(diào)設(shè)定值</
84、p><p> if(alanum==255)</p><p><b> {</b></p><p> alanum=50;//最小值為0攝氏度,循環(huán)顯示</p><p><b> }</b></p><p><b> }</b></p>
85、<p><b> }</b></p><p> Showtemperature(alanum);</p><p> Display(0,10);//選中數(shù)碼管的其他空閑位</p><p> Display(1,10);//區(qū)別于實(shí)時(shí)溫度顯示“-- --”</p><p> Display(6,1
86、0);</p><p> Display(7,10);</p><p> if(alarm==0)</p><p><b> {</b></p><p> delay1(80);//延時(shí)消抖</p><p> if(alarm==0)</p><p><
87、b> {</b></p><p> flag=0;//第二次按鍵退出設(shè)置</p><p><b> }</b></p><p><b> }</b></p><p> if(temperature>alanum)//此處設(shè)置報(bào)警可以保證調(diào)整設(shè)定值時(shí)即可及時(shí)報(bào)警<
88、;/p><p><b> {</b></p><p> beep=0;//溫度大于設(shè)定值,聲光報(bào)警</p><p><b> P1=0;</b></p><p><b> }</b></p><p><b> else</b>
89、</p><p><b> {</b></p><p> beep=1;//溫度不大于設(shè)定值即不報(bào)警</p><p><b> P1=0xff;</b></p><p><b> }</b></p><p><b> }</b&
90、gt;</p><p> if(temperature>alanum)//此處設(shè)置報(bào)警即保證即使沒有進(jìn)入設(shè)置界面任然可以報(bào)警</p><p><b> {</b></p><p> beep=0;//溫度大于設(shè)定值,聲光報(bào)警</p><p><b> P1=0;</b></p&g
91、t;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> beep=1;//溫度不大于設(shè)定值即不報(bào)警</p><p><b> P1=0xff;</b>&l
92、t;/p><p><b> }</b></p><p><b> }</b></p><p> /***********************溫度記錄函數(shù)**************************************/</p><p> void Keeprecord()&l
93、t;/p><p><b> {</b></p><p> uchar i=9;</p><p> if(countmin==1200)//1分鐘</p><p><b> {</b></p><p> countmin=0;</p><p>&l
94、t;b> count++;</b></p><p> if(count==10)//10分鐘</p><p><b> {</b></p><p><b> count=0;</b></p><p> recordnum++;//記錄一次加一,最大記錄10個(gè)值</p
95、><p> if(recordnum==10)</p><p><b> {</b></p><p> recordnum=10;</p><p><b> }</b></p><p><b> do</b></p><p&g
96、t;<b> {</b></p><p> recordtable[i]=recordtable[i-1];</p><p> }while(--i);</p><p> recordtable[0]=temperature;//最新值填入第一個(gè)位置</p><p><b> }</b>
97、</p><p><b> }</b></p><p> }/************************查詢記錄的溫度值*************************************/</p><p> void Showrecord()</p><p><b> {</b&
98、gt;</p><p><b> bit flag;</b></p><p><b> uchar a;</b></p><p> if(record==0)</p><p><b> {</b></p><p> delay1(80);//
99、延時(shí)消抖</p><p> if(record==0)</p><p><b> {</b></p><p> flag=1;//record第一次按鍵置位進(jìn)入標(biāo)志</p><p><b> }</b></p><p><b> }</b>&l
100、t;/p><p> while(flag)//進(jìn)入查詢</p><p><b> {</b></p><p> Display(0,recordtable[a]/10);//顯示溫度數(shù)值</p><p> Display(1,recordtable[a]%10);</p><p> Disp
101、lay(2,11);//顯示攝氏度單位</p><p> Display(3,12);</p><p> Display(4,10);//數(shù)碼管第6、7位選中,溫度值與記錄數(shù)之間用--間隔</p><p> Display(5,10);</p><p> Display(6,(a+1)/10);//顯示第幾個(gè)記錄值</p>
102、<p> Display(7,(a+1)%10);</p><p> if(add==0)</p><p><b> {</b></p><p> delay1(z);//延時(shí)消抖</p><p> if(add==0)//add按下,查看下一個(gè)值</p><p><
103、b> {</b></p><p> if(recordnum==0)</p><p><b> {</b></p><p><b> a=0;</b></p><p><b> }</b></p><p><b>
104、 else</b></p><p><b> {</b></p><p><b> a++;</b></p><p> if(a==recordnum)//循環(huán)顯示</p><p><b> {</b></p><p><b&g
105、t; a=0;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(sub=
106、=0)//sub按下,查看上一個(gè)值</p><p><b> {</b></p><p> delay1(z);</p><p> if(sub==0)</p><p><b> {</b></p><p> if(recordnum==0)</p>
107、<p><b> {</b></p><p><b> a=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
108、<p><b> a--;</b></p><p> if(a==255)//循環(huán)顯示</p><p><b> {</b></p><p> a=recordnum-1;</p><p><b> }</b></p><p>&l
109、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(record==0)</p><p><b> {</b></p><p> delay1(80);&
110、lt;/p><p> if(record==0)//record第二次按下,退出查看</p><p><b> {</b></p><p><b> flag=0;</b></p><p><b> }</b></p><p><b>
111、}</b></p><p><b> }</b></p><p><b> }</b></p><p> /***********定時(shí)器中斷0,用于溫度檢測(cè)時(shí)間間隔和記錄數(shù)據(jù)時(shí)間間隔**************/</p><p> void timer0() int
112、errupt 1 </p><p><b> {</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;//50ms</p><p> countsec++;</p><p> countmin++;<
113、/p><p> if(countsec==20)//1s</p><p><b> {</b></p><p> countsec=0;</p><p> GetTemperature();//一秒鐘更新一次溫度值</p><p><b> }</b></p>
114、;<p> Keeprecord();//定時(shí)記錄溫度值</p><p><b> }</b></p><p><b> 7 總結(jié)</b></p><p> 此次課程設(shè)計(jì)中,難點(diǎn)在于DS18B20的使用,即對(duì)它的時(shí)序控制、初始化以及字節(jié)讀寫方法,任何一個(gè)環(huán)節(jié)出錯(cuò)或是時(shí)序控制不到位的話就不能得到正確的數(shù)
115、據(jù)。一旦學(xué)會(huì)了正確的使用方法,就能感覺到它帶來的便利是熱電偶不能比擬的,以后再次使用的話就能很快上手了。</p><p> 軟件設(shè)計(jì)中,把程序按功能分模塊的話能提高編程效率,把問題一一解決,同時(shí)畫流程圖能幫助理清思路,使問題簡單化。定義變量時(shí),盡量定義局部變量,在字符型變量能達(dá)到要求的情況下就不用定義成整形變量了,以節(jié)省內(nèi)存空間。同時(shí)局部變量應(yīng)避免與全局變量取同名,否則全局變量將被屏蔽或與局部變量相沖突而達(dá)不到
116、設(shè)計(jì)的效果。另一方面,取變量名時(shí)也要講究技巧,應(yīng)盡量使其見名知意,同樣地,寫程序時(shí)加注釋確是非常必要的,否則隔一段時(shí)間后,想再改進(jìn)或做擴(kuò)展的話就比較困難了,因?yàn)榧词故亲约簩懙某绦蛞沧兊秒y讀難懂了。在做鍵盤消抖時(shí),延時(shí)的時(shí)間比較重要,一般為10ms左右,延時(shí)太短就會(huì)使按鍵太過靈敏,按一下就使數(shù)字跳變幾次;而延時(shí)過長則可能使按鍵按下了卻無響應(yīng),在外部定義初始化一個(gè)延時(shí)函數(shù)的入口參量則能很方便地調(diào)整延時(shí)時(shí)間,以達(dá)到比較好的效果。另外,如果對(duì)按
117、鍵進(jìn)行釋放判斷的話就能解決長時(shí)間按鍵導(dǎo)致按鍵重復(fù)響應(yīng)的問題。</p><p> 此設(shè)計(jì)中沒有為溫度的單位(攝氏度)準(zhǔn)備專用的數(shù)碼管來顯示,若單獨(dú)用一個(gè)數(shù)碼管顯示“C”來代替“℃”的話,看起來感覺很別扭。偶然想起如若用一個(gè)數(shù)碼管的上半部顯“0”,即a、b、f、g段點(diǎn)亮,來代替“℃”左上角的“度”的話,效果應(yīng)該不錯(cuò),便作了一試,發(fā)現(xiàn)這是確是一個(gè)很好的主意,便在此次設(shè)計(jì)中采用了這個(gè)辦法來顯示溫度單位。另外此次設(shè)計(jì)也考
118、慮了實(shí)時(shí)溫度顯示界面與報(bào)警溫度設(shè)置界面的區(qū)別,即在進(jìn)入報(bào)警溫度設(shè)置界面時(shí),讓其余的數(shù)碼管都顯示出一橫杠,即g段點(diǎn)亮,這樣則不會(huì)讓兩個(gè)界面相互混淆。</p><p> 總的來說,自己從這次獨(dú)立的課程設(shè)計(jì)中收獲了一些知識(shí)與經(jīng)驗(yàn),一些從書本中學(xué)之不來的東西,不是說理論無用,而這恰恰是在理論的土壤中開出的花朵,是在理論的肩膀望見的更寬廣的道路!成功來之不易,自主動(dòng)手動(dòng)腦實(shí)踐,小小的成果亦能帶來碩大的喜悅!</p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)溫度計(jì)課程設(shè)計(jì)--基于ds18b20的溫度計(jì)
- 課程設(shè)計(jì)--基于單片機(jī)的ds18b20數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
- 課程設(shè)計(jì)--ds18b20數(shù)字溫度計(jì)
- 基于單片機(jī)設(shè)計(jì)的溫度計(jì)(ds18b20)課程設(shè)計(jì)
- ds18b20數(shù)字溫度計(jì)設(shè)計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)-基于ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- ds18b20溫度計(jì)課程設(shè)計(jì)
- 基于ds18b20數(shù)字式溫度計(jì)課程設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)----基于c51單片機(jī),ds18b20溫度計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
- 畢業(yè)設(shè)計(jì)--基于c51單片機(jī),ds18b20溫度計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
- ds18b20數(shù)字溫度計(jì)的設(shè)計(jì)
- 畢業(yè)設(shè)計(jì) ----基于c51單片機(jī),ds18b20溫度計(jì)的設(shè)計(jì)與實(shí)現(xiàn)
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)ds18b20課程設(shè)計(jì)報(bào)告
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 基于ds18b20的溫度計(jì)設(shè)計(jì)
- 89c51單片機(jī)和ds18b20數(shù)字溫度計(jì)(外文原文+翻譯)
- 基于ds18b20的數(shù)字溫度計(jì)設(shè)計(jì)與實(shí)現(xiàn)
評(píng)論
0/150
提交評(píng)論