版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 溫度傳感器設(shè)計</b></p><p><b> 總體設(shè)計框圖</b></p><p> 本方案設(shè)計的系統(tǒng)由單片機系統(tǒng)、數(shù)字溫度傳感器、數(shù)碼管顯示模塊組成,其總體架構(gòu)如下圖。</p><p><b> 單片機系統(tǒng)</b></p><p>
2、本設(shè)計采用STC89C52單片機作為控制器,完成所有功能的控制,包括:</p><p> DS18B20數(shù)字溫度傳感器的初始化和讀取溫度值</p><p> LED數(shù)碼管顯示驅(qū)動與控制</p><p><b> 數(shù)字溫度傳感器模塊</b></p><p><b> DS18B20性能</b>
3、</p><p> 測溫范圍-55~+125℃,以0.5℃遞增</p><p> 可編程的分辨率為9~12位,對應(yīng)的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃</p><p> 溫度數(shù)字量轉(zhuǎn)換時間200ms,12位分辨率時最多在750ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字</p><p> DS18B20外形及引腳說明<
4、/p><p> DS18B20外形及引腳</p><p><b> GND:地</b></p><p> DQ:單線運用的數(shù)據(jù)輸入/輸出引腳</p><p> VD:可選的電源引腳</p><p><b> 軟件設(shè)計</b></p><p>&l
5、t;b> 主程序模塊</b></p><p> 主程序需要調(diào)用1個子程序為:</p><p> 實時溫度顯示子程序:驅(qū)動數(shù)碼管把實時溫度值送出在LED數(shù)碼管顯示</p><p><b> 讀溫度值模塊</b></p><p> 讀溫度值模塊需要調(diào)用4個子程序,分別為:</p>&
6、lt;p> DS18B20初始化子程序:讓單片機知道DS18B20在總線上且已準備好操作</p><p> DS18B20寫字節(jié)子程序:對DS18B20發(fā)出命令</p><p> DS18B20讀字節(jié)子程序:讀取DS18B20存儲器的數(shù)據(jù)</p><p> 延時子程序:對DS18B20操作時的時序控制</p><p> DS1
7、8B20測溫流程</p><p> 按照此步驟,程序設(shè)計時首先就要執(zhí)行初始程序化程序 INI10,其次將要跳過ROM匹配命令(代碼CCH)寫入到DS18B20中,此時需根據(jù)數(shù)字溫度傳感器寫時序編寫對DS18B20一個寫入字節(jié)程序WRITE,將跳過ROM匹配命令寫入DS18B20。為了完成溫度啟動轉(zhuǎn)換,需要將啟動轉(zhuǎn)換命令寫入DS18B20中。用延時750ms等待轉(zhuǎn)換完成。隨后再按照初始化時序執(zhí)行初始化程序INI1
8、0,用寫入一個字節(jié)程序?qū)⑵ヅ銻OM命令(代碼為55h)寫入到DS18B20中。為了完成讀便箋式存儲器操作,需要先結(jié)合數(shù)字溫度傳感器寫時序?qū)⒆x便箋式存儲器命令(代碼為BEH)寫入到DS18B20中,再用溫度傳感器讀時序編寫的每一個字節(jié)程序READ,連續(xù)讀取DS18B20便箋式存儲器中9個字節(jié)的內(nèi)容。由此可見。結(jié)合上述所介紹的初始化時序,溫度傳感器寫時序和溫度傳感器讀時序,才可以將所需的命令寫入與讀出,完成溫度的正確讀取。</p>
9、;<p><b> 軟件程序</b></p><p> 數(shù)碼管顯示溫度程序:</p><p><b> //頭文件:</b></p><p> #include "reg51.h"</p><p> #include "ds18b20.h&quo
10、t;//引入DS18B20頭文件</p><p><b> //變量定義:</b></p><p> unsigned char ly_dis[4];//定義顯示緩沖區(qū)</p><p> code unsigned char table[]=</p><p> {0xc0,0xf9,0xa4,0xb0,0x99
11、,0x92,0x82,0xf8,0x80,0x90};</p><p> //表:共陽數(shù)碼管 0-9 </p><p> unsigned char l_posit=0;//顯示位置</p><p><b> //引腳定義:</b></p><p> sbitSMG_q = P1^0;//定義數(shù)碼管陽級控
12、制腳(千位)</p><p> sbitSMG_b = P1^1;//定義數(shù)碼管陽級控制腳(百位)</p><p> sbit SMG_s = P1^2;//定義數(shù)碼管陽級控制腳(十位)</p><p> sbitSMG_g = P1^3;//定義數(shù)碼管陽級控制腳(個位)</p><p><b> //函數(shù)聲明:<
13、;/b></p><p> void display(void);//顯示函數(shù),顯示緩沖區(qū)內(nèi)容</p><p> void delay(void); </p><p> //主函數(shù),C語言的入口函數(shù):</p><p> void main()</p><p><b> {</b>
14、</p><p> unsignedinti=0;</p><p><b> floattt;</b></p><p><b> intltemp;</b></p><p><b> while(1){</b></p><p><b>
15、 if(i==0)</b></p><p> tmpchange(); //溫度轉(zhuǎn)換</p><p> if(i==100){</p><p> tt=tmp()*0.0625; //得到真實十進制溫度值,因為DS18B20</p><p> //可以精確到0.0625度,所以讀回數(shù)據(jù)的最低位代表的是0.
16、0625度。</p><p> ltemp=tt*10+0.5; //放大十倍,這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字,同時進行一個四舍五入操作。</p><p> if(ltemp<0){//判斷第一位顯示整數(shù)還是負號</p><p> ly_dis[0]=0xbf;</p><p> ltemp=0-lte
17、mp;</p><p><b> }</b></p><p><b> else</b></p><p> ly_dis[0]=ltemp/1000;//顯示百位值</p><p> ltemp=ltemp%1000;</p><p> ly_dis[1]=lte
18、mp/100;//顯示溫度十位值</p><p> ltemp=ltemp%100;</p><p> ly_dis[2]=ltemp/10;//顯示溫度個位值</p><p> ly_dis[3]=ltemp%10;//顯示小數(shù)點后一位</p><p><b> }</b></p>&l
19、t;p><b> i++;</b></p><p> if(i==3000)</p><p><b> i=0;</b></p><p> display();//調(diào)用顯示</p><p> delay();</p><p><b>
20、}</b></p><p> }//顯示函數(shù),參數(shù)為顯示內(nèi)容</p><p> void display()</p><p><b> {</b></p><p> P0=0XFF;//</p><p> switch(l_posit){</p><
21、;p> case 0://選擇千位數(shù)碼管,關(guān)閉其它位</p><p><b> SMG_q=0;</b></p><p><b> SMG_b=1;</b></p><p> SMG_s=1;</p><p><b> SMG_g=1;</b><
22、/p><p> P0=table[ly_dis[0]];//輸出顯示內(nèi)容</p><p><b> break;</b></p><p> case 1://選擇百位數(shù)碼管,關(guān)閉其它位</p><p><b> SMG_q=1;</b></p><p><b&
23、gt; SMG_b=0;</b></p><p> SMG_s=1;</p><p><b> SMG_g=1;</b></p><p> P0=table[ly_dis[1]];</p><p><b> break;</b></p><p>
24、 case 2://選擇十位數(shù)碼管,關(guān)閉其它位</p><p><b> SMG_q=1;</b></p><p><b> SMG_b=1;</b></p><p> SMG_s=0;</p><p><b> SMG_g=1;</b></p>
25、<p> P0=table[ly_dis[2]]&0x7f;</p><p><b> break;</b></p><p> case 3://選擇個位數(shù)碼管,關(guān)閉其它位</p><p><b> SMG_q=1;</b></p><p><b> SM
26、G_b=1;</b></p><p> SMG_s=1;</p><p><b> SMG_g=0;</b></p><p> P0=table[ly_dis[3]];</p><p><b> break;</b></p><p><b>
27、; }</b></p><p> l_posit++;//每調(diào)用一次將輪流顯示一位</p><p> if(l_posit>3)</p><p> l_posit=0;</p><p><b> }</b></p><p> //延時子函數(shù),短暫延時</p
28、><p> void delay(void){</p><p> unsigned char i=10;</p><p> while(i--);</p><p><b> }</b></p><p><b> 讀溫度值模塊程序:</b></p>&l
29、t;p> /****DS18B20.H****/</p><p> /********宏定義******************************************************/</p><p> #define uchar unsigned char</p><p> #define uint unsigned int<
30、/p><p> /********IO引腳定義***********************************************/</p><p> sbit DS=P3^2; //定義DS18B20接口</p><p> /*************延時子函數(shù) ***********************************
31、******/</p><p> voiddelayb(uint count)</p><p><b> {</b></p><p><b> uinti;</b></p><p> while(count)</p><p><b> {</b>
32、;</p><p><b> i=200;</b></p><p> while(i>0)</p><p><b> i--;</b></p><p><b> count--;</b></p><p><b> }</b
33、></p><p> }/*************DS18B20初始化************************************/</p><p> voiddsreset(void)</p><p><b> {</b></p><p><b> uinti; </b>
34、;</p><p><b> DS=0;</b></p><p><b> i=103;</b></p><p> while(i>0)i--;</p><p><b> DS=1;</b></p><p><b> i=4;&
35、lt;/b></p><p> while(i>0)i--;</p><p> }/*************讀一位*******************************************/</p><p> bittmpreadbit(void)</p><p><b> {</b>&
36、lt;/p><p><b> uinti;</b></p><p><b> bitdat;</b></p><p><b> DS=0;</b></p><p> i++; //小延時一下</p><p><b> D
37、S=1;</b></p><p><b> i++;i++;</b></p><p><b> dat=DS;</b></p><p><b> i=8;</b></p><p> while(i>0)i--;</p><p>
38、 return (dat);</p><p> }/*************讀一個字節(jié)*****************************************/</p><p> uchartmpread(void)</p><p><b> {</b></p><p> uchari,j,dat;
39、</p><p><b> dat=0;</b></p><p> for(i=1;i<=8;i++)</p><p><b> {</b></p><p> j=tmpreadbit();</p><p> dat=(j<<7)|(dat>
40、>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好//一個字節(jié)在DAT里</p><p><b> }</b></p><p> return(dat); //將一個字節(jié)數(shù)據(jù)返回</p><p> }/*************寫一個字節(jié)***********************************
41、**********/</p><p> voidtmpwritebyte(uchardat)</p><p><b> {</b></p><p><b> uinti;</b></p><p><b> uchar j;</b></p><p&g
42、t;<b> bittestb;</b></p><p> for(j=1;j<=8;j++)</p><p><b> {</b></p><p> testb=dat&0x01;</p><p> dat=dat>>1;</p><p>
43、; if(testb) // 寫1部分</p><p><b> {</b></p><p><b> DS=0;</b></p><p><b> i++;i++;</b></p><p><b> DS=1;</b></p>
44、;<p><b> i=8;</b></p><p> while(i>0)i--;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
45、<p> DS=0; //寫0部分</p><p><b> i=8;</b></p><p> while(i>0)i--;</p><p><b> DS=1;</b></p><p><b> i++;i++;</b></p&
46、gt;<p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /***********發(fā)送溫度轉(zhuǎn)換命令********************************************/</p>
47、<p> voidtmpchange(void)</p><p><b> {</b></p><p> dsreset(); //初始化DS18B20</p><p> delayb(1); //延時</p><p> tmpwritebyte(0
48、xcc); // 跳過序列號命令</p><p> tmpwritebyte(0x44); //發(fā)送溫度轉(zhuǎn)換命令</p><p> }/***********獲得溫度******************************************/</p><p><b> inttmp()</b></p><
49、p><b> {</b></p><p><b> int temp;</b></p><p><b> uchara,b;</b></p><p> dsreset();</p><p> delayb(1);</p><p> tm
50、pwritebyte(0xcc); </p><p> tmpwritebyte(0xbe); //發(fā)送讀取數(shù)據(jù)命令</p><p> a=tmpread(); //連續(xù)讀兩個字節(jié)數(shù)據(jù)</p><p> b=tmpread();</p><p><b> temp=b;</b></p
51、><p><b> temp<<=8;</b></p><p> temp=temp|a; //兩字節(jié)合成一個整型變量。</p><p> return temp; //返回溫度值</p><p> }/*******讀取溫度傳感器的序列號********************
52、*********</p><p> void readrom()//本程序中沒有用到此函數(shù)</p><p> {uchar sn1,sn2;</p><p> dsreset();</p><p> delayb(1);</p><p> tmpwritebyte(0x33);</p>&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論