基于51單片機(jī)數(shù)字溫度計(jì)設(shè)計(jì)報(bào)告課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論