版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 題: 基于51單片機(jī)的交通燈設(shè)計(jì)</p><p> 專(zhuān) 業(yè): 機(jī)械設(shè)計(jì)制造及其自動(dòng)化</p><p><b> 學(xué) 號(hào):</b></p><p> 指導(dǎo)教師: </p><p> 設(shè)計(jì)日期:2017/12/18</p><p&
2、gt;<b> 成 績(jī):</b></p><p> 基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告</p><p><b> 一、設(shè)計(jì)目的作用</b></p><p> 本設(shè)計(jì)是一款簡(jiǎn)單實(shí)用的小型數(shù)字溫度計(jì),所采用的主要元件有傳感器DS18B20,單片機(jī)AT89C52,,四位共陰極數(shù)碼管一個(gè),電容電阻若干。DS18B20支
3、持“一線(xiàn)總線(xiàn)”接口,測(cè)量溫度范圍-55°C~+125°C。在-10~+85°C范圍內(nèi),精度為±0.5°C。18B20的精度較差,為± 2°C 。現(xiàn)場(chǎng)溫度直接以“一線(xiàn)總線(xiàn)”的數(shù)字方式傳輸,大大提高了系統(tǒng)的抗干擾性。適合于惡劣環(huán)境的現(xiàn)場(chǎng)溫度測(cè)量,如:環(huán)境控制、設(shè)備或過(guò)程控制、測(cè)溫類(lèi)消費(fèi)電子產(chǎn)品等。</p><p> 本次數(shù)字溫度計(jì)的設(shè)計(jì)共分為五部
4、分,主控制器,LED顯示部分,傳感器部分,復(fù)位部分,按鍵設(shè)置部分,時(shí)鐘電路。主控制器即單片機(jī)部分,用于存儲(chǔ)程序和控制電路;LED顯示部分是指四位共陰極數(shù)碼管,用來(lái)顯示溫度;傳感器部分,即溫度傳感器,用來(lái)采集溫度,進(jìn)行溫度轉(zhuǎn)換;復(fù)位部分,即復(fù)位電路,按鍵部分用來(lái)設(shè)置上下限報(bào)警溫度。測(cè)量的總過(guò)程是,傳感器采集到外部環(huán)境的溫度,并進(jìn)行轉(zhuǎn)換后傳到單片機(jī),經(jīng)過(guò)單片機(jī)處理判斷后將溫度傳遞到數(shù)碼管顯示。 </p><p>&l
5、t;b> 二、設(shè)計(jì)要求</b></p><p> ?。?).利用DS18B20傳感器實(shí)時(shí)檢測(cè)溫度并顯示。</p><p> ?。?).利用數(shù)碼管實(shí)時(shí)顯示溫度。</p><p> ?。?).當(dāng)溫度超過(guò)或者低于設(shè)定值時(shí)蜂鳴器報(bào)警,LED閃爍指示。</p><p> (4).能夠手動(dòng)設(shè)置上限和下限報(bào)警溫度。</p>
6、<p><b> 三、設(shè)計(jì)的具體實(shí)現(xiàn)</b></p><p><b> 1、系統(tǒng)概述</b></p><p> 方案一: 由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類(lèi)的器件利用其感溫效應(yīng),在將隨被測(cè)溫度變化的電壓或電流采集過(guò)來(lái),進(jìn)行A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)行數(shù)據(jù)的處理,在顯示電路上,就可以將被測(cè)溫度顯示出來(lái),這種設(shè)計(jì)需要用
7、到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。</p><p><b> 方案設(shè)計(jì)框圖如下:</b></p><p> 方案二:考慮到用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測(cè)溫度值,進(jìn)行轉(zhuǎn)換,就可以滿(mǎn)足設(shè)計(jì)要求。</p><p> 從以上
8、兩種方案,很容易看出,采用方案二,電路比較簡(jiǎn)單,軟件設(shè)計(jì)也比較簡(jiǎn)單,故采用了方案二。</p><p> 2、 單元電路設(shè)計(jì)與分析</p><p><b> 1、硬件設(shè)計(jì)</b></p><p> 按照系統(tǒng)設(shè)計(jì)功能的要求,確定系統(tǒng)由3個(gè)模塊組成:主控制器、測(cè)溫電路和顯示電路。</p><p> 數(shù)字溫度計(jì)
9、總體電路結(jié)構(gòu)框圖所示:</p><p><b> 單片機(jī)的選擇</b></p><p> 單片機(jī)AT89S52具有低電壓供電和體積小等特點(diǎn),四個(gè)端口只需要兩個(gè)口就能滿(mǎn)足電路系統(tǒng)的設(shè)計(jì)需要,很適合便攜手持式產(chǎn)品的設(shè)計(jì)使用系統(tǒng)可用二節(jié)電池供電。由于器件問(wèn)題,我們使用了通用的手機(jī)5V充電器接口。</p><p><b> 復(fù)位電路模塊
10、</b></p><p> 單片機(jī)系統(tǒng)的復(fù)位電路在這里使用的是上電+按鈕的復(fù)位電路模式,其中電阻R采用的是10KΩ的阻值,電容采用電容值為10uF的電解電容,電路圖如下:</p><p><b> 溫度顯示模塊</b></p><p> 四位共陰極數(shù)碼管,能夠顯示小數(shù)。列掃描用P2.4~P2.7口來(lái)實(shí)現(xiàn),列驅(qū)動(dòng)直接51接單片機(jī)
11、驅(qū)動(dòng)。電路圖如下:</p><p><b> 溫度傳感器模塊</b></p><p> DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過(guò)簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。電路圖如下:</p><p><b>
12、 按鍵模塊</b></p><p> 按鍵是用來(lái)設(shè)置報(bào)警的上下限溫。K1是用 來(lái)進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動(dòng)退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能, K1是實(shí)現(xiàn)減1功能,K3是用來(lái)設(shè)
13、定上下限溫度正負(fù)的。</p><p><b> 2、軟件設(shè)計(jì)</b></p><p> 主要包括主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序和現(xiàn)實(shí)數(shù)據(jù)刷新子程序等。</p><p> 主程序 主程序的主要功能是負(fù)責(zé)溫度的實(shí)時(shí)顯示、讀出并處理DS18B20的測(cè)量溫度值。溫度測(cè)量每1S進(jìn)行一次。主流程圖如下:</p>
14、;<p><b> 讀出溫度子程序 </b></p><p> 讀出溫度子程序的主要功能是讀出RAM中的9字節(jié)。在讀出時(shí)須進(jìn)行CRC校驗(yàn),校驗(yàn)有錯(cuò)時(shí)不進(jìn)行溫度數(shù)據(jù)的改寫(xiě)。流程圖如下:</p><p> 溫度轉(zhuǎn)換命令子程序 溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開(kāi)始命令。當(dāng)采用12位分辨率時(shí),轉(zhuǎn)換時(shí)間約為750ms。在本程序設(shè)計(jì)中,采用1s顯示程序延
15、時(shí)法等待轉(zhuǎn)換的完成。流程圖如下:</p><p> 顯示數(shù)據(jù)刷新子程序 顯示數(shù)據(jù)刷新子程序主要是對(duì)顯示緩沖器中的顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高數(shù)據(jù)顯示位為0時(shí),將符號(hào)顯示位移入下一位。</p><p> 系統(tǒng)的調(diào)試及性能分析:</p><p> 硬件調(diào)試,首先檢查電感的焊接是否正確,然后可用萬(wàn)用表測(cè)試或通電檢測(cè)。</p><p> 軟
16、件調(diào)試可以先編寫(xiě)顯示程序并進(jìn)行硬件的正確性檢驗(yàn),然后分別進(jìn)行主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序和現(xiàn)實(shí)數(shù)據(jù)刷新子程序等的編程及調(diào)試</p><p> 由于DS18B20與單片機(jī)采用串行數(shù)據(jù)傳送,因此,對(duì)DS18B20進(jìn)行讀/寫(xiě)編程時(shí)必須嚴(yán)格地保證讀/寫(xiě)時(shí)序;否則將無(wú)法讀取測(cè)量結(jié)果。本程序采用單片機(jī)匯編或C語(yǔ)言編寫(xiě)用 Keil C51編譯器編程調(diào)試。</p><p>
17、 軟件調(diào)試到能顯示溫度值,并且在有溫度變化時(shí)顯示溫度能改變,就基本完成。</p><p> 性能測(cè)試可用制作的溫度計(jì)和已有的成品溫度計(jì)同時(shí)進(jìn)行測(cè)量比較。由于DS18B20的精度很高,所以誤差指標(biāo)可以限制在0.5℃以?xún)?nèi)。另外,-55~+125℃的測(cè)溫范圍使得該溫度計(jì)完全適合一般的應(yīng)用場(chǎng)合,其低電壓供電特性可做成用電池供電的手持溫度計(jì)。</p><p><b> 四、總結(jié)<
18、;/b></p><p> 本次的課程設(shè)計(jì)使我們進(jìn)一步鞏固了書(shū)本上的知識(shí),做到了學(xué)以致用。這是我們第二次自己動(dòng)手設(shè)計(jì)的電路,通過(guò)系統(tǒng)仿真軟件Proteus和編譯軟件Keil,使我們進(jìn)一步了解了單片機(jī)的設(shè)計(jì)制作過(guò)程,其中最為困難的是軟件部分,即編程部分,我們上網(wǎng)找了好多資料,雖然經(jīng)過(guò)自己的修改,但還是有很多功能不能實(shí)現(xiàn),如溫度上下限設(shè)置。由于Proteus并不是很熟練,在使用的過(guò)程中有很多原件的名稱(chēng)不知道,
19、從而花費(fèi)了大量的時(shí)間在網(wǎng)上查找,今后應(yīng)該在這方面多多努力。最后一步的焊接硬件也遇到了不少麻煩??偨Y(jié)經(jīng)驗(yàn)的時(shí)候我們得出這樣的結(jié)論,學(xué)習(xí)應(yīng)該學(xué)以致用,有目的的去學(xué)習(xí),如果學(xué)了不用等于沒(méi)學(xué)。其次,要學(xué)以致用,理論聯(lián)系實(shí)際,這樣才會(huì)取得事半功倍的效果。</p><p><b> 五、附錄</b></p><p><b> 附錄一:元件清單</b>&l
20、t;/p><p> 附錄二:完整電路原理圖</p><p><b> 附錄三:焊接實(shí)物圖</b></p><p><b> 附錄四:源程序</b></p><p> /****************************************************************
21、****</p><p> * 程序名; 基于51單片機(jī)的溫度計(jì)</p><p> * 功 能: 實(shí)時(shí)測(cè)量溫度,超過(guò)上下限報(bào)警,報(bào)警溫度可手動(dòng)調(diào)整。K1是用來(lái)</p><p> * 進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限</p><p> * 調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯
22、示1s左右自動(dòng)</p><p> * 退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動(dòng)退出;按一下K4消除</p><p> * 按鍵音,再按一下啟動(dòng)按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實(shí)現(xiàn)加1功能,</p><p> * K1是實(shí)現(xiàn)減1功能,K3是用來(lái)設(shè)定上下限溫度正負(fù)的。 </p><p> * 編程者:
23、 彭明闖</p><p> * 編程時(shí)間:2014/05/30 </p><p> *********************************************************************/</p><p> #include<reg52.h> </p><p> #
24、include<intrins.h> //將intrins.h頭文件包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時(shí))</p><p> #define uint unsigned int </p><p> #define uchar unsigned char </p><p> uchar max=0x0
25、0,min=0x00; //max是上限報(bào)警溫度,min是下限報(bào)警溫度</p><p> bit s=0; //s是調(diào)整上下限溫度時(shí)溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右</p><p> bit s1=0; //s1標(biāo)志位用于上下限查看時(shí)的顯示</p><p> void
26、display1(uint z); //聲明display1()函數(shù)(display.h頭文件中的函數(shù),ds18b20.h要用應(yīng)先聲明)</p><p> #include"ds18b20.h" </p><p> #include"keyscan.h" </p><p> #incl
27、ude"display.h" </p><p> /******************************************************/</p><p> /*主函數(shù)/</p><p> /*********************************
28、********************/</p><p> void main()</p><p><b> {</b></p><p> beer=1; //關(guān)閉蜂鳴器</p><p> led=1; //關(guān)閉LED燈</p><p> timer1_i
29、nit(0); //初始化定時(shí)器1(未啟動(dòng)定時(shí)器1)</p><p> get_temperature(1); //首次啟動(dòng)DS18B20獲取溫度(DS18B20上電后自動(dòng)將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器)</p><p> while(1) </p><p><b> { </b>&
30、lt;/p><p> keyscan(); </p><p> get_temperature(0); </p><p> display(temp,temp_d*0.625);</p><p> alarm(); </p><p><b> }</b><
31、;/p><p><b> } </b></p><p> /********************************************************************</p><p> * 程序名; DS18B20頭文件 </p><p><b> * 編程
32、者:彭明闖</b></p><p> * 編程時(shí)間:2014/5/30 </p><p> * 說(shuō) 明:用到的全局變量是:無(wú)符號(hào)字符型變量temp(測(cè)得的溫度整數(shù)部分),temp_d </p><p> * (測(cè)得的溫度小數(shù)部分),標(biāo)志位f(測(cè)量溫度的標(biāo)志位‘0’表示“正溫度”‘1’表</p><p> * 示“負(fù)溫度”
33、),標(biāo)志位f_max(上限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表</p><p> * 示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表</p><p> * 示“負(fù)溫度”),標(biāo)志位w(報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警)。 </p><p> **********************************
34、***********************************/</p><p> #ifndef __ds18b20_h__ //定義頭文件</p><p> #define __ds18b20_h__</p><p> #define uint unsigned int </p><p> #def
35、ine uchar unsigned char </p><p> sbit DQ= P2^3; //DS18B20接口</p><p> sbit beer=P1^0; //用beer表示P1.0</p><p> sbit led=P1^1; //用led表示P1.1</p>
36、;<p> uchar temp=0; //測(cè)量溫度的整數(shù)部分</p><p> uchar temp_d=0; //測(cè)量溫度的小數(shù)部分</p><p> bit f=0; //測(cè)量溫度的標(biāo)志位,0’表示“正溫度” ‘1’表示“負(fù)溫度”)</p><p> bit
37、 f_max=0; //上限溫度的標(biāo)志位‘0’表示“正溫度” ‘1’表示“負(fù)溫度”)</p><p> bit f_min=0; //下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表示“負(fù)溫度”)</p><p> bit w=0; //報(bào)警標(biāo)志位‘1’啟動(dòng)報(bào)警‘0’關(guān)閉報(bào)警</p><p> /*
38、*****************************************************/</p><p> /*延時(shí)子函數(shù)/</p><p> /*****************************************************/</p><p> void ds18b20_
39、delayus(uint t) //延時(shí)幾μs</p><p><b> {</b></p><p> while(t--);</p><p><b> }</b></p><p> void ds18b20_delayms(uint t) //延時(shí)1ms左右<
40、/p><p><b> {</b></p><p><b> uint i,j;</b></p><p> for(i=t;i>0;i--)</p><p> for(j=120;j>0;j--);</p><p><b> }</b>
41、</p><p> /******************************************************/</p><p> /*DS18B20初始化函數(shù)/</p><p> /*****************************************************/</p&
42、gt;<p> void ds18b20_init() </p><p><b> { </b></p><p> uchar c=0; </p><p><b> DQ=1;</b></p><p> DQ=0; //控制器向DS18B2
43、0發(fā)低電平脈沖</p><p> ds18b20_delayus(80); //延時(shí)15-80μs</p><p> DQ=1;//控制器拉高總線(xiàn),</p><p> while(DQ); //等待DS18B20拉低總線(xiàn),在60-240μs之間</p><p> ds18b20_del
44、ayus(150);//延時(shí),等待上拉電阻拉高總線(xiàn)</p><p> DQ=1; //拉高數(shù)據(jù)線(xiàn),準(zhǔn)備數(shù)據(jù)傳輸;</p><p><b> }</b></p><p> /******************************************************/</p><
45、p> /*DS18B20字節(jié)讀函數(shù) /</p><p> /*****************************************************/</p><p> uchar ds18b20_read() </p><p><b> {</b></p>
46、<p><b> uchar i;</b></p><p> uchar d=0;</p><p> DQ = 1;//準(zhǔn)備讀;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p&g
47、t; d >>= 1; //低位先發(fā);</p><p> DQ = 0;</p><p><b> _nop_();</b></p><p> _nop_();</p><p> DQ = 1;//必須寫(xiě)1,否則讀出來(lái)的將是不預(yù)期的數(shù)據(jù);</p&
48、gt;<p> if(DQ)//在12us處讀取數(shù)據(jù);</p><p> d |= 0x80;</p><p> ds18b20_delayus(10);</p><p><b> }</b></p><p> return d; //返回讀取的值</p>
49、<p><b> }</b></p><p> /******************************************************/</p><p> /*DS18B20字節(jié)寫(xiě)函數(shù) /</p><p> /****************************
50、*************************/</p><p> void ds18b20_write(uchar d)</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=8;i>0;i--)</
51、p><p><b> { </b></p><p><b> DQ=0;</b></p><p> DQ=d&0x01;</p><p> ds18b20_delayus(5);</p><p><b> DQ=1;</b>
52、</p><p> d >>= 1; </p><p><b> }</b></p><p><b> }</b></p><p> /******************************************************/</p>
53、;<p> /*獲取溫度函數(shù) /</p><p> /*****************************************************/</p><p> void get_temperature(bit flag)</p><p><b> {</b>
54、;</p><p> uchar a=0,b=0,c=0,d=0;</p><p><b> uint i;</b></p><p> ds18b20_init(); </p><p> ds18b20_write(0xcc);//向DS18B20發(fā)跳過(guò)讀ROM命令</p>&
55、lt;p> ds18b20_write(0x44);//寫(xiě)啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM</p><p> if(flag==1)</p><p> {//首次啟動(dòng)DS18B20進(jìn)行溫度轉(zhuǎn)換需要500ms,若轉(zhuǎn)換時(shí)間不夠就出錯(cuò),讀出的是85度的錯(cuò)誤值。</p><p> display1(1);
56、//用開(kāi)機(jī)動(dòng)畫(huà)耗時(shí)</p><p><b> }</b></p><p><b> else</b></p><p> ds18b20_delayms(1);</p><p> ds18b20_init(); </p><p>
57、 ds18b20_write(0xcc); </p><p> ds18b20_write(0xbe);</p><p> a=ds18b20_read();//讀內(nèi)部RAM (LSB)</p><p> b=ds18b20_read();//讀內(nèi)部RAM (MSB)</p><p> if(fla
58、g==1)//局部位變量f=1時(shí)讀上下線(xiàn)報(bào)警溫度</p><p><b> {</b></p><p> max=ds18b20_read(); //讀內(nèi)部RAM (TH)</p><p> min=ds18b20_read(); //讀內(nèi)部RAM (Tl)</p><p>&l
59、t;b> }</b></p><p> if((max&0x80)==0x80) //若讀取的上限溫度的最高位(符號(hào)位)為‘1’表明是負(fù)溫度</p><p> {f_max=1;max=(max-0x80);} //將上限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將上限溫度裝換成無(wú)符號(hào)數(shù)。</p><p> if((m
60、in&0x80)==0x80) //若讀取的下限溫度的最高位(符號(hào)位)為‘1’表明是負(fù)溫度</p><p> {f_min=1;min=(min-0x80);} //將下限溫度符號(hào)標(biāo)志位置‘1’表示負(fù)溫度,將下限溫度裝換成無(wú)符號(hào)數(shù)。</p><p><b> i=b;</b></p><p><b&g
61、t; i>>=4;</b></p><p><b> if (i==0)</b></p><p><b> {</b></p><p> f=0; //i為0,正溫度,設(shè)立正溫度標(biāo)記</p><p> temp=((a>>4)|(b<
62、;<4));//整數(shù)部分</p><p> a=(a&0x0f);</p><p> temp_d=a;//小數(shù)部分</p><p><b> }</b></p><p><b> else</b></p><p><b> {
63、</b></p><p> f=1; //i為1,負(fù)溫度,設(shè)立負(fù)溫度標(biāo)記</p><p><b> a=~a+1;</b></p><p><b> b=~b;</b></p><p> temp=((a>>4)|(b<<4));
64、//整數(shù)部分</p><p> a=(a&0x0f);//小數(shù)部分</p><p><b> temp_d=a;</b></p><p><b> }</b></p><p><b> }</b></p><p> /****
65、**************************************************/</p><p> /*存儲(chǔ)極限溫度函數(shù) /</p><p> /*****************************************************/</p><p> void store_t()
66、</p><p><b> {</b></p><p> if(f_max==1) //若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)(最高位為1是負(fù),為0是正)</p><p> max=max+0x80;</p><p> if(f_min==1) //若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號(hào)數(shù)&
67、lt;/p><p> min=min+0x80; </p><p> ds18b20_init(); </p><p> ds18b20_write(0xcc); </p><p> ds18b20_write(0x4e); //向DS18B20發(fā)寫(xiě)字節(jié)至?xí)捍嫫?和3(TH和TL)命令</p>
68、<p> ds18b20_write(max); //向暫存器TH(上限溫度暫存器)寫(xiě)溫度</p><p> ds18b20_write(min); //向暫存器TL(下限溫度暫存器)寫(xiě)溫度</p><p> ds18b20_write(0xff); //向配置寄存器寫(xiě)命令,進(jìn)行溫度值分辨率設(shè)置</p><p>
69、 ds18b20_init(); </p><p> ds18b20_write(0xcc); </p><p> ds18b20_write(0x48); //向DS18B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫(xiě)入EEPROM</p><p> } //DS18B20上電后會(huì)自動(dòng)將EEPROM中的上下
70、限溫度拷貝到TH、TL暫存器</p><p> /******************************************************/</p><p> /*溫度超限報(bào)警函數(shù) /</p><p> /************************************************
71、*****/</p><p> void alarm()</p><p> { //若上限值是正值</p><p> if(f_max==0)</p><p><b> {</b></p><p> if(f_min==0) //若下限值是正值</p>
72、;<p><b> {</b></p><p> if(f==0) //若測(cè)量值是正值</p><p><b> {</b></p><p> if(temp<=min||temp>=max)</p><p> {w=1;TR1=1;} //當(dāng)測(cè)量值小
73、于最小值或大于最大值時(shí)報(bào)警</p><p> if((temp<max)&&(temp>min))</p><p> {w=0;} //當(dāng)測(cè)量值大于最小值且小于最大值時(shí)不報(bào)警</p><p><b> }</b></p><p> if(f==1){w=1;TR1=1;} /
74、/若測(cè)量值是負(fù)值時(shí)報(bào)警</p><p><b> } </b></p><p> if(f_min==1) //若下限值是負(fù)值</p><p><b> {</b></p><p> if(f==0) //若測(cè)量值是正值</p><p><b&g
75、t; {</b></p><p> if(temp>=max)//當(dāng)測(cè)量值大于最大值時(shí)報(bào)警</p><p> {w=1;TR1=1;}</p><p> if(temp<max )//當(dāng)測(cè)量值小于最大值時(shí)不報(bào)警</p><p><b> {w=0;}</b></p><
76、;p><b> }</b></p><p> if(f==1) //若測(cè)量值是負(fù)值</p><p><b> {</b></p><p> if(temp>=min)//當(dāng)測(cè)量值大于最小值時(shí)報(bào)警</p><p> {w=1;TR1=1;}</p><
77、p> if(temp<min)//當(dāng)測(cè)量值小于最小值時(shí)不報(bào)警</p><p><b> {w=0;}</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p
78、><p> if(f_max==1) //若下限值是負(fù)值</p><p><b> {</b></p><p> if(f_min==1) //若下限值是負(fù)值</p><p><b> {</b></p><p> if(f==1) //若測(cè)量
79、值是負(fù)值</p><p><b> {</b></p><p> if((temp<=max)||(temp>=min))</p><p> {w=1;TR1=1;} //當(dāng)測(cè)量值小于最大值或大于最小值時(shí)報(bào)警</p><p> if((temp<min)&&(temp>
80、max))</p><p> {w=0;} //當(dāng)測(cè)量值小于最小值且大于最大值時(shí)不報(bào)警</p><p><b> }</b></p><p> if(f==0){w=1;TR1=1;} //若測(cè)量值是正值時(shí)報(bào)警</p><p><b> } </b></p><
81、p><b> } </b></p><p><b> }</b></p><p><b> #endif</b></p><p> /**********************************************************************</
82、p><p> * 程序名; ds18b20keyscan函數(shù)</p><p> * 功 能: 通過(guò)鍵盤(pán)設(shè)定設(shè)定上下限報(bào)警溫度</p><p> * 編程者: 彭明闖</p><p> * 編程時(shí)間:2014/5/30 </p><p> *******************************
83、***************************************/</p><p> #ifndef __keyscan_H__//定義頭文件</p><p> #define __keyscan_H__</p><p> sbit key1=P2^2; </p><p> sbit key2=P2
84、^1; </p><p> sbit key3=P2^0;</p><p> sbit key4=P3^3;</p><p> uchar i=0;//定義全局變量i用于不同功能模式的選擇,‘0’正常模式,‘1’上限調(diào)節(jié)模式,‘2’下限調(diào)節(jié)模式</p><p> uchar a=0;
85、 //定義全局變量a用于不同模式下數(shù)碼管顯示的選擇</p><p> bit k4=0;//K4按鍵雙功能選擇位,k4=0時(shí)K4按鍵選擇消按鍵音的功能,k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能</p><p> bit v=0;//K2、K3按鍵雙功能選擇位,v=0時(shí)選擇上下限查看功能,v=1時(shí)選擇上下限溫度加減功能</p>
86、<p> bit v1=0;//v1=1時(shí)定時(shí)1250ms時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能</p><p> bit v2=0; //消按鍵音功能調(diào)整位,為‘0’時(shí)開(kāi)按鍵音,為‘1’時(shí)關(guān)按鍵音</p><p> /**************************************************
87、****/</p><p> /*讀鍵盤(pán)延時(shí)子函數(shù)/</p><p> /*****************************************************/</p><p> void keyscan_delay(uint z)//延時(shí)1ms左右</p><p><
88、;b> {</b></p><p><b> uint i,j;</b></p><p> for(i=z;i>0;i--)</p><p> for(j=120;j>0;j--);</p><p><b> }</b></p><p>
89、; /******************************************************/</p><p> /*溫度調(diào)節(jié)函數(shù) /</p><p> /*****************************************************/</p><p> int tem
90、p_change(int count,bit f)//上下限溫度調(diào)整</p><p><b> {</b></p><p> if(key2==0)//判斷K2是否按下</p><p><b> {</b></p><p> if(v2==0)beer=0;
91、//v2=0開(kāi)按鍵音,否則消按鍵音</p><p> keyscan_delay(10);//延時(shí)10ms</p><p> if(key2==0)//再次判斷K2是否按下(實(shí)現(xiàn)按按鍵時(shí)消抖)</p><p><b> { </b></p><p> beer=1;//K2按下
92、關(guān)按鍵音</p><p> if(f==0)//若溫度為正</p><p><b> { </b></p><p> count++;//每按一下K2溫度上調(diào)1</p><p> if(a==1){if(count>125) count=125;}//當(dāng)溫度值大于125時(shí)不上調(diào)</
93、p><p> if(a==2){if(count>125) count=125;}</p><p><b> }</b></p><p> if(f!=0)//若溫度為負(fù)</p><p><b> { </b></p><p> count
94、++;//每按一下K2溫度下調(diào)1</p><p> if(a==1){if(count>55) count=55;}//當(dāng)溫度值小于-55時(shí)不再下調(diào)</p><p> if(a==2){if(count>55) count=55;}</p><p><b> }</b></p><p><
95、b> }</b></p><p> while(key2==0);//K2松開(kāi)按鍵時(shí)消抖</p><p> keyscan_delay(10);</p><p><b> }</b></p><p> if(key3==0)</p><p><b>
96、 {</b></p><p> if(v2==0)beer=0;</p><p> keyscan_delay(10);</p><p> if(key3==0) //K3按按鍵時(shí)消抖</p><p><b> {</b></p><p><b> b
97、eer=1;</b></p><p> count--;//每按一下K3溫度為正時(shí)下調(diào)1,為負(fù)時(shí)上調(diào)1</p><p> if(a==1){if(count<0) count=0;}//當(dāng)溫度值達(dá)到0時(shí)不再調(diào)</p><p> if(a==2){if(count<0) count=0;}</p><p>
98、;<b> }</b></p><p> while(key3==0);</p><p> keyscan_delay(10);//K3松開(kāi)按鍵時(shí)消抖</p><p><b> }</b></p><p> return count;</p><p><
99、b> }</b></p><p> /******************************************************/</p><p> /*讀鍵盤(pán)函數(shù) /</p><p> /********************************************
100、*********/</p><p> void keyscan()</p><p><b> {</b></p><p> if(key1==0)</p><p><b> {</b></p><p> if(v2==0)beer=0;</p>&l
101、t;p> keyscan_delay(10);</p><p> if(key1==0)//K1按按鍵時(shí)消抖</p><p><b> {</b></p><p><b> beer=1;</b></p><p> TR1=1; //開(kāi)定時(shí)器1,通過(guò)s標(biāo)志位的
102、變化,實(shí)現(xiàn)在上下限溫度調(diào)整時(shí)溫度顯示時(shí)閃爍的功能 </p><p> k4=1;//在上下溫度調(diào)節(jié)功能模式下選擇K4的調(diào)整上下限溫度正負(fù)的功能</p><p> v=1;//在上下溫度調(diào)節(jié)功能模式下選擇K2、K3的溫度加減功能</p><p> i++; //K1按一下i加1,i=‘0’進(jìn)入正常模式,i=‘1’進(jìn)入
103、調(diào)上限模式,i=‘2’進(jìn)入調(diào)下限模式</p><p> if(i>2)//K1按下三次后退出調(diào)節(jié)模式</p><p><b> {</b></p><p> i=0;//進(jìn)入正常模式</p><p> TR1=0;//關(guān)定時(shí)器1</p><p> k4=
104、0;//在正常模式下選擇K4的消按鍵音功能</p><p> v=0;//在正常模式下選擇K2、K3的查看上下限報(bào)警溫度功能</p><p> store_t();//存儲(chǔ)調(diào)整后的上下限報(bào)警溫度</p><p><b> } </b></p><p> switch(i)/
105、/顯示選擇</p><p><b> {</b></p><p> case 0:a=0;break;//a=0選擇顯示測(cè)得的溫度</p><p> case 1:a=1;break; //a=1選擇顯示上限溫度</p><p> case 2:a=2;break; //a=2選擇顯示下限溫度<
106、;/p><p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p> while(key1==0);//K1松按鍵時(shí)消抖</p><p> keyscan_delay(10);</p&
107、gt;<p><b> }</b></p><p> if(a==1&&v==1)//a=1選擇顯示上限溫度且v=1時(shí)選擇上下限溫度加功能</p><p> {led=0;max=temp_change(max,f_max);}//顯示上限溫度</p><p> else if(a==2&
108、&v==1)//a=2選擇顯示下限溫度且v=1時(shí)選擇上下限溫度減功能</p><p> {led=1;min=temp_change(min,f_min);}</p><p><b> else;</b></p><p> if(k4==1)//k4=1時(shí)K4按鍵選擇正負(fù)溫度設(shè)定功能</p>&l
109、t;p><b> {</b></p><p> if(key4==0)</p><p><b> {</b></p><p> if(v2==0)beer=0;</p><p> keyscan_delay(5);</p><p> if(key4==0)&
110、lt;/p><p><b> {</b></p><p><b> beer=1;</b></p><p><b> if(a==1)</b></p><p> {if(max>55) f_max=0;else f_max=~f_max;}//當(dāng)溫度大于55度時(shí),只能
111、設(shè)定為正溫度</p><p><b> if(a==2)</b></p><p> {if(min>55) f_max=0;else f_min=~f_min;}//當(dāng)溫度大于55度時(shí),只能設(shè)定為正溫度 </p><p><b> }</b></p><p> while(
112、key4==0);</p><p> keyscan_delay(10);</p><p><b> }</b></p><p><b> }</b></p><p> if(v==0) //v=0時(shí)選擇上下限查看功能</p><p><b>
113、 {</b></p><p> if(key2==0)</p><p><b> {</b></p><p> if(v2==0)beer=0;</p><p> keyscan_delay(10);</p><p> if(key2==0)</p><p
114、><b> {</b></p><p><b> beer=1;</b></p><p> a=1;//選擇上限顯示</p><p> TR1=1;//開(kāi)定時(shí)器1開(kāi)始定時(shí)一分鐘左右</p><p> s1=1; //上限顯示不閃爍,顯示一分鐘左右自動(dòng)退出
115、</p><p><b> }</b></p><p> while(key2==0);</p><p> keyscan_delay(10);</p><p><b> }</b></p><p> if(key3==0)</p><p>
116、<b> {</b></p><p> if(v2==0)beer=0;</p><p> keyscan_delay(10);</p><p> if(key3==0)</p><p><b> {</b></p><p><b> beer=1;&l
117、t;/b></p><p> a=2;//選擇下限顯示</p><p> TR1=1;//開(kāi)定時(shí)器1開(kāi)始定時(shí)1s</p><p> s1=1; //下限顯示不閃爍,顯示1s自動(dòng)退出 </p><p><b> }</b></p><p> w
118、hile(key3==0);</p><p> keyscan_delay(10);</p><p><b> }</b></p><p> if(v1==1) //v1=1時(shí)定時(shí)1s時(shí)間到自動(dòng)關(guān)閉報(bào)警上下限查看功能</p><p> {a=0;v1=0;TR1=0;} //a=0顯示實(shí)測(cè)溫度
119、,v1清零,關(guān)定時(shí)器1</p><p> if(k4==0) //k4=0時(shí)K4按鍵選擇消按鍵音的功能</p><p> { </p><p> if(key4==0)</p><p><b> {</b></p><p> if(v2==0)beer=0;&
120、lt;/p><p> keyscan_delay(10);</p><p> if(key4==0)</p><p><b> {</b></p><p><b> beer=1;</b></p><p> v2=~v2;//為‘0’時(shí)開(kāi)按鍵音,為‘1’時(shí)關(guān)按鍵音
121、 </p><p><b> }</b></p><p> while(key4==0);</p><p> keyscan_delay(10);</p><p><b> }</b></p><p><b> }</b>
122、</p><p><b> } </b></p><p><b> }</b></p><p><b> #endif</b></p><p> /******************************************************
123、****************</p><p> * 程序名; ds18b20數(shù)碼管動(dòng)態(tài)顯示頭文件</p><p> * 功 能: 通過(guò)定時(shí)器0延時(shí)是數(shù)碼管動(dòng)態(tài)顯示</p><p> * 編程者: 彭明闖</p><p> * 編程時(shí)間:2014/5/30 </p><p> ********
124、**************************************************************/</p><p> #ifndef __ds18b20_display_H__ </p><p> #define __ds18b20_display_H__</p><p> #define uint unsigned int
125、 //變量類(lèi)型宏定義,用uint表示無(wú)符號(hào)整形(16位)</p><p> #define uchar unsigned char //變量類(lèi)型宏定義,用uchar表示無(wú)符號(hào)字符型(8位)</p><p> sbit wei1=P2^4; //可位尋址變量定義,用wei1表示P2.4口</p><p> sbit wei2=P2^5
126、; //用wei2表示P2.5口</p><p> sbit wei3=P2^6; //用wei3表示P2.6口</p><p> sbit wei4=P2^7; //用wei4表示P2.7口</p><p> uchar num=0; //定義num為全局無(wú)符號(hào)字符型變量,賦初值為‘0’</p>
127、;<p> uchar code temperature1[]={ 0x3f,0x06,0x5b,0x4f,0x66,</p><p> 0x6d,0x7d,0x07,0x7f,0x6f};//定義顯示碼表0~9</p><p> uchar code temperature2[]={ 0xbf,0x86,0xdb,0xcf,0xe6,</p><
128、p> 0xed,0xfd,0x87,0xff,0xef};//帶小數(shù)點(diǎn)的0~9.</p><p> uchar code temperature3[]={ 0x00,0x80,0x40,0x76,0x38};//依次是‘不顯示’‘.’‘-’‘H’‘L’</p><p> /***************************************************
129、***/</p><p> /*延時(shí)子函數(shù)/</p><p> /*****************************************************/</p><p> void display_delay(uint t) //延時(shí)1ms左右</p><p>
130、<b> {</b></p><p><b> uint i,j;</b></p><p> for(i=t;i>0;i--)</p><p> for(j=120;j>0;j--);</p><p><b> }</b></p><p
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 數(shù)字溫度計(jì)課程設(shè)計(jì)---基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告課程設(shè)計(jì)
- 51單片機(jī)課程設(shè)計(jì)數(shù)字溫度計(jì)報(bào)告
- 基于51單片機(jī)的數(shù)字溫度計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于51單片機(jī)的數(shù)字溫度計(jì)的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---數(shù)字溫度計(jì)設(shè)計(jì)
- 基于51單片機(jī)的溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)報(bào)告---基于單片機(jī)的數(shù)字溫度計(jì)設(shè)計(jì)
- 基于單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 課程設(shè)計(jì)--基于單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)--數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)-數(shù)字溫度計(jì)
- 單片機(jī)課程設(shè)計(jì)—數(shù)字溫度計(jì)
- 單片機(jī)數(shù)字溫度計(jì)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---數(shù)字溫度計(jì)
評(píng)論
0/150
提交評(píng)論