找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11161|回复: 7
打印 上一主题 下一主题
收起左侧

51单片机数码管显示DS18B20温度测量报警控制板

  [复制链接]
跳转到指定楼层
楼主
ID:76686 发表于 2015-4-11 18:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    51单片机数码管显示DS18B20温度测量报警控制板功能简介:K1为进入/退出设置键;K2为增加键;K3为减少键。,温度测量范围0-99.9℃,可设置上限报警温度、下限报警温度(即高于上限值或者低于下限值时蜂鸣器报警),默认上限报警温度为38℃、默认下限报警温度为5℃。报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。电源电压VCC为5V,可以焊一只USB座到板上,然后用相应的USB线连接至电脑,通过电脑USB口供电;DS18B20也可以根据需要用屏蔽电缆引出来。







51单片机数码管显示DS18B20温度测量报警控制板源程序,一共有2个文件:

复制代码
  1. #include <AT89X52.h>

  2. #include "DS18B20.h"   

  3. #define uint unsigned int

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

  5. #define SET  P3_1    //定义调整键

  6. #define DEC  P3_2    //定义减少键

  7. #define ADD  P3_3    //定义增加键

  8. #define BEEP P3_7    //定义蜂鸣器

  9. bit shanshuo_st;    //闪烁间隔标志

  10. bit beep_st;     //蜂鸣器间隔标志

  11. sbit DIAN = P2^7;        //小数点

  12. uchar x=0;      //计数器

  13. signed char m;     //温度值全局变量

  14. uchar n;      //温度值全局变量

  15. uchar set_st=0;     //状态标志

  16. signed char shangxian=38;  //上限报警温度,默认值为38

  17. signed char xiaxian=5;   //下限报警温度,默认值为38

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

  19. /*****延时子程序*****/

  20. void Delay(uint num)

  21. {

  22. while( --num );

  23. }

  24. /*****初始化定时器0*****/

  25. void InitTimer(void)

  26. {

  27.   TMOD=0x1;

  28.   TH0=0x3c;

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

  30. }

  31. /*****定时器0中断服务程序*****/

  32. void timer0(void) interrupt 1

  33. {

  34. TH0=0x3c;

  35. TL0=0xb0;

  36. x++;

  37. }

  38. /*****外部中断0服务程序*****/

  39. void int0(void) interrupt 0

  40. {



  41. EX0=0;      //关外部中断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服务程序*****/

  54. void int1(void) interrupt 2

  55. {

  56. EX1=0;      //关外部中断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;     //计算得到十位数字

  74. b=c/10-a*10;    //计算得到个位数字

  75. m=c/10;      //计算得到整数位

  76. n=c-a*100-b*10;    //计算得到小数位

  77. if(m<0){m=0;n=0;}   //设置温度显示上限

  78. if(m>99){m=99;n=9;}   //设置温度显示上限   

  79. }

  80. /*****显示开机初始化等待画面*****/

  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;         //关闭显示

  93. }

  94. /*****显示温度子程序*****/

  95. Disp_Temperature()     //显示温度

  96. {

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

  98. P1 = 0xf7;

  99. Delay(300);

  100. P2 =LEDData[n];    //显示个位

  101. P1 = 0xfb;

  102. Delay(300);

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

  104. DIAN = 0;         //显示小数点

  105. P1 = 0xfd;

  106. Delay(300);

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

  108. P1 = 0xfe;

  109. Delay(300);

  110. P1 = 0xff;         //关闭显示

  111. }

  112. /*****显示报警温度子程序*****/

  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标示

  126. P1 = 0xfe;

  127. Delay(200);

  128. P1 = 0xff;         //关闭显示

  129. }

  130. /*****报警子程序*****/

  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. /*****主函数*****/

  138. void main(void)

  139. {

  140.     uint z;

  141. InitTimer();    //初始化定时器

  142. EA=1;      //全局中断开关

  143. TR0=1;

  144. ET0=1;      //开启定时器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;    //关闭外部中断0

  165.    EX1=0;    //关闭外部中断1

  166.     check_wendu();

  167.       Disp_Temperature();

  168.    Alarm();   //报警检测

  169.   }

  170.   else if(set_st==1)

  171.   {

  172.    BEEP=1;    //关闭蜂鸣器

  173.    EX0=1;    //开启外部中断0

  174.    EX1=1;    //开启外部中断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;    //关闭蜂鸣器

  181.    EX0=1;    //开启外部中断0

  182.    EX1=1;    //开启外部中断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. /*****延时子程序*****/

  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复位

  202.   Delay_DS18B20(8);    //稍做延时

  203.   DQ = 0;         //单片机将DQ拉低

  204.   Delay_DS18B20(80);   //精确延时,大于480us

  205.   DQ = 1;         //拉高总线

  206.   Delay_DS18B20(14);

  207.   x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

  208.   Delay_DS18B20(20);

  209. }

  210. /*****读一个字节*****/

  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;     // 给脉冲信号

  218.     dat>>=1;

  219.     DQ = 1;     // 给脉冲信号

  220.     if(DQ)

  221.     dat|=0x80;

  222.     Delay_DS18B20(4);

  223.   }

  224.   return(dat);

  225. }

  226. /*****写一个字节*****/

  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);  //跳过读序号列号的操作

  248.   WriteOneChar(0x44);  //启动温度转换

  249.   Init_DS18B20();

  250.   WriteOneChar(0xCC);  //跳过读序号列号的操作

  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. }
复制代码


评分

参与人数 1黑币 +10 收起 理由
send + 10 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:70614 发表于 2015-4-20 20:53 | 只看该作者
谢谢分享 编译不成功有错误
回复

使用道具 举报

板凳
ID:77796 发表于 2015-5-5 00:06 来自手机 | 只看该作者
看看。楼主很不错哟
回复

使用道具 举报

地板
ID:82175 发表于 2015-6-6 10:04 | 只看该作者
make an effort
回复

使用道具 举报

5#
ID:84574 发表于 2015-7-2 14:49 | 只看该作者
感谢楼主啊
回复

使用道具 举报

6#
ID:65730 发表于 2015-8-9 22:38 | 只看该作者
还没看就知道很好,呵呵
回复

使用道具 举报

7#
ID:150982 发表于 2016-11-29 14:48 | 只看该作者
 谢谢分享 编译不成功有错误
回复

使用道具 举报

8#
ID:257097 发表于 2017-12-7 19:57 | 只看该作者
谢谢分享 编译不成功
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表