找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12307|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)數(shù)碼管顯示DS18B20溫度測(cè)量報(bào)警控制板

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:76686 發(fā)表于 2015-4-11 18:16 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
    51單片機(jī)數(shù)碼管顯示DS18B20溫度測(cè)量報(bào)警控制板功能簡(jiǎn)介:K1為進(jìn)入/退出設(shè)置鍵;K2為增加鍵;K3為減少鍵。,溫度測(cè)量范圍0-99.9℃,可設(shè)置上限報(bào)警溫度、下限報(bào)警溫度(即高于上限值或者低于下限值時(shí)蜂鳴器報(bào)警),默認(rèn)上限報(bào)警溫度為38℃、默認(rèn)下限報(bào)警溫度為5℃。報(bào)警值可設(shè)置范圍:最低上限報(bào)警值等于當(dāng)前下限報(bào)警值,最高下限報(bào)警值等于當(dāng)前上限報(bào)警值。將下限報(bào)警值調(diào)為0時(shí)為關(guān)閉下限報(bào)警功能。電源電壓VCC為5V,可以焊一只USB座到板上,然后用相應(yīng)的USB線連接至電腦,通過(guò)電腦USB口供電;DS18B20也可以根據(jù)需要用屏蔽電纜引出來(lái)。







51單片機(jī)數(shù)碼管顯示DS18B20溫度測(cè)量報(bào)警控制板源程序,一共有2個(gè)文件:

復(fù)制代碼
  1. #include <AT89X52.h>

  2. #include "DS18B20.h"   

  3. #define uint unsigned int

  4. #define uchar unsigned char   //宏定義

  5. #define SET  P3_1    //定義調(diào)整鍵

  6. #define DEC  P3_2    //定義減少鍵

  7. #define ADD  P3_3    //定義增加鍵

  8. #define BEEP P3_7    //定義蜂鳴器

  9. bit shanshuo_st;    //閃爍間隔標(biāo)志

  10. bit beep_st;     //蜂鳴器間隔標(biāo)志

  11. sbit DIAN = P2^7;        //小數(shù)點(diǎn)

  12. uchar x=0;      //計(jì)數(shù)器

  13. signed char m;     //溫度值全局變量

  14. uchar n;      //溫度值全局變量

  15. uchar set_st=0;     //狀態(tài)標(biāo)志

  16. signed char shangxian=38;  //上限報(bào)警溫度,默認(rèn)值為38

  17. signed char xiaxian=5;   //下限報(bào)警溫度,默認(rèn)值為38

  18. uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};

  19. /*****延時(shí)子程序*****/

  20. void Delay(uint num)

  21. {

  22. while( --num );

  23. }

  24. /*****初始化定時(shí)器0*****/

  25. void InitTimer(void)

  26. {

  27.   TMOD=0x1;

  28.   TH0=0x3c;

  29.   TL0=0xb0;     //50ms(晶振12M)

  30. }

  31. /*****定時(shí)器0中斷服務(wù)程序*****/

  32. void timer0(void) interrupt 1

  33. {

  34. TH0=0x3c;

  35. TL0=0xb0;

  36. x++;

  37. }

  38. /*****外部中斷0服務(wù)程序*****/

  39. void int0(void) interrupt 0

  40. {



  41. EX0=0;      //關(guān)外部中斷0

  42. if(DEC==0&&set_st==1)

  43. {

  44.   shangxian--;

  45.   if(shangxian<xiaxian)shangxian=xiaxian;

  46. }

  47. else if(DEC==0&&set_st==2)

  48. {

  49.   xiaxian--;

  50.   if(xiaxian<0)xiaxian=0;

  51. }

  52. }

  53. /*****外部中斷1服務(wù)程序*****/

  54. void int1(void) interrupt 2

  55. {

  56. EX1=0;      //關(guān)外部中斷1

  57. if(ADD==0&&set_st==1)

  58. {

  59.   shangxian++;

  60.   if(shangxian>99)shangxian=99;

  61. }

  62. else if(ADD==0&&set_st==2)

  63. {

  64.   xiaxian++;

  65.   if(xiaxian>shangxian)xiaxian=shangxian;

  66. }  

  67. }

  68. /*****讀取溫度*****/

  69. void check_wendu(void)

  70. {

  71. uint a,b,c;

  72. c=ReadTemperature()-5;  //獲取溫度值并減去DS18B20的溫漂誤差

  73. a=c/100;     //計(jì)算得到十位數(shù)字

  74. b=c/10-a*10;    //計(jì)算得到個(gè)位數(shù)字

  75. m=c/10;      //計(jì)算得到整數(shù)位

  76. n=c-a*100-b*10;    //計(jì)算得到小數(shù)位

  77. if(m<0){m=0;n=0;}   //設(shè)置溫度顯示上限

  78. if(m>99){m=99;n=9;}   //設(shè)置溫度顯示上限   

  79. }

  80. /*****顯示開(kāi)機(jī)初始化等待畫(huà)面*****/

  81. Disp_init()   

  82. {

  83. P2 = 0xbf;      //顯示-

  84. P1 = 0xf7;

  85. Delay(200);

  86. P1 = 0xfb;

  87. Delay(200);   

  88. P1 = 0xfd;

  89. Delay(200);

  90. P1 = 0xfe;

  91. Delay(200);

  92. P1 = 0xff;         //關(guān)閉顯示

  93. }

  94. /*****顯示溫度子程序*****/

  95. Disp_Temperature()     //顯示溫度

  96. {

  97. P2 =0xc6;      //顯示C

  98. P1 = 0xf7;

  99. Delay(300);

  100. P2 =LEDData[n];    //顯示個(gè)位

  101. P1 = 0xfb;

  102. Delay(300);

  103. P2 =LEDData[m%10];    //顯示十位

  104. DIAN = 0;         //顯示小數(shù)點(diǎn)

  105. P1 = 0xfd;

  106. Delay(300);

  107. P2 =LEDData[m/10];    //顯示百位

  108. P1 = 0xfe;

  109. Delay(300);

  110. P1 = 0xff;         //關(guān)閉顯示

  111. }

  112. /*****顯示報(bào)警溫度子程序*****/

  113. Disp_alarm(uchar baojing)

  114. {

  115. P2 =0xc6;      //顯示C

  116. P1 = 0xf7;

  117. Delay(200);

  118. P2 =LEDData[baojing%10]; //顯示十位

  119. P1 = 0xfb;

  120. Delay(200);

  121. P2 =LEDData[baojing/10]; //顯示百位

  122. P1 = 0xfd;

  123. Delay(200);

  124. if(set_st==1)P2 =0x89;

  125. else if(set_st==2)P2 =0xc7; //上限H、下限L標(biāo)示

  126. P1 = 0xfe;

  127. Delay(200);

  128. P1 = 0xff;         //關(guān)閉顯示

  129. }

  130. /*****報(bào)警子程序*****/

  131. void Alarm()

  132. {

  133. if(x>=10){beep_st=~beep_st;x=0;}

  134. if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;

  135. else BEEP=1;

  136. }

  137. /*****主函數(shù)*****/

  138. void main(void)

  139. {

  140.     uint z;

  141. InitTimer();    //初始化定時(shí)器

  142. EA=1;      //全局中斷開(kāi)關(guān)

  143. TR0=1;

  144. ET0=1;      //開(kāi)啟定時(shí)器0

  145. IT0=1;        

  146. IT1=1;

  147. check_wendu();

  148. check_wendu();

  149. for(z=0;z<300;z++)

  150. {

  151.   Disp_init();        

  152.   }

  153. while(1)

  154.   {

  155.   if(SET==0)

  156.   {

  157.    Delay(2000);

  158.    do{}while(SET==0);

  159.    set_st++;x=0;shanshuo_st=1;

  160.    if(set_st>2)set_st=0;

  161.   }

  162.   if(set_st==0)

  163.   {

  164.    EX0=0;    //關(guān)閉外部中斷0

  165.    EX1=0;    //關(guān)閉外部中斷1

  166.     check_wendu();

  167.       Disp_Temperature();

  168.    Alarm();   //報(bào)警檢測(cè)

  169.   }

  170.   else if(set_st==1)

  171.   {

  172.    BEEP=1;    //關(guān)閉蜂鳴器

  173.    EX0=1;    //開(kāi)啟外部中斷0

  174.    EX1=1;    //開(kāi)啟外部中斷1

  175.    if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

  176.    if(shanshuo_st) {Disp_alarm(shangxian);}

  177.   }

  178.   else if(set_st==2)

  179.   {

  180.    BEEP=1;    //關(guān)閉蜂鳴器

  181.    EX0=1;    //開(kāi)啟外部中斷0

  182.    EX1=1;    //開(kāi)啟外部中斷1

  183.    if(x>=10){shanshuo_st=~shanshuo_st;x=0;}

  184.    if(shanshuo_st) {Disp_alarm(xiaxian);}

  185.   }

  186.     }

  187. }

  188. /*****END*****/













  189. DS18B20.h:

  190. #include <AT89X52.h>

  191. #define  DQ  P3_6     //定義DS18B20總線I/O

  192. /*****延時(shí)子程序*****/

  193. void Delay_DS18B20(int num)

  194. {

  195.   while(num--) ;

  196. }

  197. /*****初始化DS18B20*****/

  198. void Init_DS18B20(void)

  199. {

  200.   unsigned char x=0;

  201.   DQ = 1;         //DQ復(fù)位

  202.   Delay_DS18B20(8);    //稍做延時(shí)

  203.   DQ = 0;         //單片機(jī)將DQ拉低

  204.   Delay_DS18B20(80);   //精確延時(shí),大于480us

  205.   DQ = 1;         //拉高總線

  206.   Delay_DS18B20(14);

  207.   x = DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗

  208.   Delay_DS18B20(20);

  209. }

  210. /*****讀一個(gè)字節(jié)*****/

  211. unsigned char ReadOneChar(void)

  212. {

  213.   unsigned char i=0;

  214.   unsigned char dat = 0;

  215.   for (i=8;i>0;i--)

  216.   {

  217.     DQ = 0;     // 給脈沖信號(hào)

  218.     dat>>=1;

  219.     DQ = 1;     // 給脈沖信號(hào)

  220.     if(DQ)

  221.     dat|=0x80;

  222.     Delay_DS18B20(4);

  223.   }

  224.   return(dat);

  225. }

  226. /*****寫(xiě)一個(gè)字節(jié)*****/

  227. void WriteOneChar(unsigned char dat)

  228. {

  229.   unsigned char i=0;

  230.   for (i=8; i>0; i--)

  231.   {

  232.     DQ = 0;

  233.     DQ = dat&0x01;

  234.     Delay_DS18B20(5);

  235.     DQ = 1;

  236.     dat>>=1;

  237.   }

  238. }

  239. /*****讀取溫度*****/

  240. unsigned int ReadTemperature(void)

  241. {

  242.   unsigned char a=0;

  243.   unsigned char b=0;

  244.   unsigned int t=0;

  245.   float tt=0;

  246.   Init_DS18B20();

  247.   WriteOneChar(0xCC);  //跳過(guò)讀序號(hào)列號(hào)的操作

  248.   WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換

  249.   Init_DS18B20();

  250.   WriteOneChar(0xCC);  //跳過(guò)讀序號(hào)列號(hào)的操作

  251.   WriteOneChar(0xBE);  //讀取溫度寄存器

  252.   a=ReadOneChar();     //讀低8位

  253.   b=ReadOneChar();    //讀高8位

  254.   t=b;

  255.   t<<=8;

  256.   t=t|a;

  257.   tt=t*0.0625;

  258.   t= tt*10+0.5;     //放大10倍輸出并四舍五入

  259.   return(t);

  260. }
復(fù)制代碼


評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
send + 10 很給力!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:70614 發(fā)表于 2015-4-20 20:53 | 只看該作者
謝謝分享 編譯不成功有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

板凳
ID:77796 發(fā)表于 2015-5-5 00:06 來(lái)自手機(jī) | 只看該作者
看看。樓主很不錯(cuò)喲
回復(fù)

使用道具 舉報(bào)

地板
ID:82175 發(fā)表于 2015-6-6 10:04 | 只看該作者
make an effort
回復(fù)

使用道具 舉報(bào)

5#
ID:84574 發(fā)表于 2015-7-2 14:49 | 只看該作者
感謝樓主啊
回復(fù)

使用道具 舉報(bào)

6#
ID:65730 發(fā)表于 2015-8-9 22:38 | 只看該作者
還沒(méi)看就知道很好,呵呵
回復(fù)

使用道具 舉報(bào)

7#
ID:150982 發(fā)表于 2016-11-29 14:48 | 只看該作者
 謝謝分享 編譯不成功有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

8#
ID:257097 發(fā)表于 2017-12-7 19:57 | 只看該作者
謝謝分享 編譯不成功
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表