找回密码
 立即注册

QQ登录

只需一步,快速开始

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

原创STC15单片机+DS18B20做的温度异常超温报警器

  [复制链接]
跳转到指定楼层
楼主


  1.简介:通过按键可以设定温度上限和温度下限的值,当温度低于温度下限值或者当温度高于上限值时,蜂鸣器发出声音提醒。
   2.元件:STC15W408AS单片机+共阴数码管+有源蜂鸣器+3个按键+DS18B20
   3.设计思路:利用单片机逐点扫描的方式直接驱动三位共阴数码管,通过DS18B20读取温度与设定的温度进行比较,如果温度异常则蜂鸣器发出滴滴的声音提醒,按下K3键则清除报警声(温度恢复正常后再次异常时自动报警)。
   4.使用方法:程序下载后首次使用前需同时按下K2键和K3键(对最初的温度上下限值写入EEPROM中)以后断电自动保存无需进行此操作
   5.按下K1键则进入温度上限设置菜单,可以通过按K2进行加   K3进行减,再次按K1键则进入温度下限报警值的设定界面。设置后5秒无操作则自动保存设定的数据并返回温度显示界面。

所有资料下载:
温度控制超温报警stc15w.rar (80.31 KB, 下载次数: 407)

  1. //2016.10.15编写

  2. /*********************************************************************************************/

  3. //作者:刘海龙
  4. //硬件:三位共阴数码管+stc15单片机+DS18B20温度芯片+蜂鸣器//选择内部12M晶振
  5. #include <STC15W.h>
  6. #include <intrins.h>
  7. #include<4LED_YIN.H>//数码管驱动显示程序
  8. #include<DS18B20.H>//DS18B20温度芯片驱动程序
  9. #include<EEPROM.H>//STC15系列内部EEPROM
  10. bit w=0,q;//报警标志位
  11. sbit beep=P5^4;//蜂鸣器负极连接IO正极接vcc
  12. sbit k1=P1^3;//设置键
  13. sbit k2=P1^4;//        加键
  14. sbit k3=P1^5;//         减键
  15. //sbit led1=P1^6;//
  16. //sbit led2=P1^7;//
  17. unsigned char menu=0,cou,HH,HL,LH,LL;//HH为温度上限高8位HL为温度上限低8位
  18. //LH为温度下限高8位LL为温度下限低8位
  19. unsigned int L,H;//H为温度上限,L为温度下限
  20. /************************************************************************/
  21. void delay1ms (unsigned int a){ // 1ms延时程序
  22.         unsigned int i;
  23.         while( --a != 0){
  24.                 for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629  
  25.         }                                                      
  26. }
  27. /*****************************************************************************/
  28. void disp(unsigned int t){//数码管显示
  29. unsigned int i;
  30. i=        t/100;//第一位数码管显示温度十位
  31. diplay_data (1,disdata);
  32. i=t%100/10;//第二位数码管显示温度个位
  33. diplay_data (2,disdata+0x80);//0x80为个位数后面的小数点
  34. i=t%100%10;//第三位数码管显示温度小数位
  35. diplay_data (3,disdata);
  36. }
  37. /***********************************************/
  38. void di(){//蜂鸣器驱动程序
  39.         beep=0;
  40.         delay1ms(500);
  41.         beep=1;
  42.         delay1ms(500);
  43.         }
  44. /*********************************************************************************************
  45. 函数名:定时/计数器初始化函数
  46. 调  用:T_C_init();
  47. /**********************************************************************************************/
  48. void T_C_init (void){
  49.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  50.         EA = 1;        //中断总开关
  51.         TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
  52.         TL0 = 0xb0; //16位计数寄存器T0低8位
  53.         ET0 = 1; //T/C1中断开关
  54.         TR0 = 0; //T/C1关闭开关        
  55. }
  56. /*********************************************************************************************
  57. 函数名:定时/计数器1中断处理函数
  58. 调  用:[T/C1溢出后中断处理]
  59. /*****************************/
  60. void T_C0 (void) interrupt 1  using 1{ //切换寄存器组到1
  61.     cou++;                      // 软计数器加1   
  62.     if(cou > 99){// 计数值到(5s)
  63.         cou = 0;// 软计数器清零
  64.         IapEraseSector(0x00); //擦除整个扇区
  65.         IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
  66.         IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
  67.         IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
  68.         IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM         
  69.         TR0 = 0; //T/C1停止计数
  70.         menu=0;//返回 主菜单的温度显示界面                 
  71.     }               
  72.         TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
  73.         TL0 = 0xb0; //16位计数寄存器T0低8位
  74. }
  75. /**********************************************************************************************/
  76. /**********************************************************************************************/
  77. void main (void){
  78.         unsigned char i;
  79.         delay1ms(300); //延时待系统稳定
  80.         init();//IO工作方式初始化
  81.         T_C_init();//定时器初始化
  82.         
  83.         ReadTemperature(); //读取温度
  84.         HH = IapReadByte(0x00);//开机时从EEPROM中读取H高8位参数
  85.         HL = IapReadByte(0x01);//开机时从EEPROM中读取H的低8位参数
  86.         H=HH*256+HL;//读出温度上限值
  87.         LH = IapReadByte(0x02);//开机时从EEPROM中读取L高8位参数
  88.         LL = IapReadByte(0x03);//开机时从EEPROM中读取L的低8位参数
  89.         L=LH*256+LL;//读出温度下限值
  90.         while(1){//主循环
  91.                           
  92. /**********************显示温度界面******************************/
  93.                   if(menu==0){
  94.                            for(i=15;i>0;i--){
  95.                            disp(ReadTemperature());}
  96.                           if(tem>=H&&w==0||tem<=L&&w==0){
  97.                             di();//超温或者低温报警
  98.                           q=1;
  99.                             }
  100.                   
  101.                           if(k3==0&&q==1){w=1;}//如果报警时按下K1则关闭报警声
  102.                           if(tem<=H&&tem>=L){w=0;}//如果温度恢复正常把报警标志清除
  103.                         if(k2==0&&k3==0){//k2k3同时按下温度上限下限值恢复出厂设置
  104.                                 delay1ms(10);
  105.                                 if(k2==0&&k3==0){
  106.                                         H=380;//温度上限38度
  107.                                         L=370;//温度下限37度
  108.                                         LL=L;
  109.                                         LH=(L>>8);
  110.                                         HL=H;
  111.                                         HH=(H>>8);
  112.                                         IapEraseSector(0x00); //擦除整个扇区
  113.                                         IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
  114.                                         IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
  115.                                         IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
  116.                                         IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM         
  117.                                         di();
  118.                                 }
  119.                         }        
  120.                    }
  121. /*********************进入调温度上限界面*******************************/
  122.                   if(menu==1){
  123.                          diplay_data (1,disdata[H/100]);
  124.                          diplay_data (2,disdata[H%100/10]+0x80);
  125.                           diplay_data (3,disdata[H%10]);
  126.                          if(k2==0){
  127.                                 delay1ms(10);
  128.                                  if(k2==0){
  129.                                 H++; //按下K1键则温度上限加零点一度
  130.                                  cou=0;//重新计数
  131.                                  TR0 = 1; //T/C1启动开关
  132.                                     
  133.                                  while(!k2);
  134.                                 HL=H;
  135.                                 HH=(H>>8);
  136.                                 }
  137.                           }
  138.                          if(k3==0){
  139.                                 delay1ms(10);
  140.                                  if(k3==0){
  141.                                 H--; //按下K1键则温度上限减零点一度
  142.                                  cou=0;//重新计数
  143.                                  TR0 = 1; //T/C1启动开关
  144.                                     
  145.                                  while(!k3);
  146.                                 HL=H;
  147.                                 HH=(H>>8);
  148.                                 }
  149.                           }
  150.                         
  151.                   }
  152. /*******************进入调温度下限界面****************************/
  153.                    if(menu==2){
  154.                          diplay_data (1,disdata[L/100]);
  155.                          diplay_data (2,disdata[L%100/10]+0x80);
  156.                           diplay_data (3,disdata[L%10]);
  157.                          if(k2==0){
  158.                                 delay1ms(10);
  159.                                  if(k2==0){
  160.                                  cou=0;//重新计数
  161.                                  TR0 = 1; //T/C1启动开关
  162.                                     L++; //按下K1键则温度下限加零点一度
  163.                                  while(!k2);
  164.                                 LL=L;
  165.                                 LH=(L>>8);
  166.                                 }
  167.                          }

  168.                          if(k3==0){
  169.                                 delay1ms(10);
  170.                                  if(k3==0){
  171.                                 cou=0;//重新计数
  172.                                  TR0 = 1; //T/C1启动开关
  173.                                     L--; //按下K1键则温度下限减零点一度
  174.                                  while(!k3);
  175.                                 LL=L;
  176.                                 LH=(L>>8);                                
  177.                              }
  178.                         }
  179.                   }
  180. /*************************按下K1键进入菜单设置界面***************************/
  181.                   if(k1==0){
  182.                          delay1ms(10);
  183.                          if(k1==0){
  184.                          cou=0;//重新计数
  185.                          TR0 = 1; //T/C1启动开关
  186.                             menu++; //按下K1键则菜单加一
  187.                            if(menu>2){menu=0;}
  188.                          while(!k1);
  189.                         }
  190.                    }                                
  191.         }        
  192. }
  193. /*****************************************************************************/
复制代码

评分

参与人数 4黑币 +136 收起 理由
qwe29600 + 8 赞一个!
brave_ruan + 20 感谢大哥的资料分享与细心指导,很给力!
xmd1972 + 8 共享资料的黑币奖励!
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:108868 发表于 2016-10-30 20:38 | 只看该作者
谢谢分享!已制作成功
回复

使用道具 举报

板凳
ID:152422 发表于 2016-12-9 22:38 | 只看该作者
楼主是个有思想的人。赞\
回复

使用道具 举报

地板
ID:158407 发表于 2017-1-1 13:13 | 只看该作者
请教:原创STC15单片机+DS18B20做的温度异常超温报警器,keil显示错误,如何解决?STC15W.h(526): warning C322: unknown identifier
STC15W.h(528): warning C322: unknown identifier
STC15W.h(530): warning C322: unknown identifier
STC15W.h(532): warning C322: unknown identifier
STC15W.h(534): warning C322: unknown identifier
STC15W.h(536): warning C322: unknown identifier
STC15W.h(538): warning C322: unknown identifier
温度控制器.C(64): warning C206: 'IapEraseSector': missing function-prototype
温度控制器.C(64): error C267: 'IapEraseSector': requires ANSI-style prototype
温度控制器.c - 1 Error(s), 8 Warning(s).
回复

使用道具 举报

5#
ID:123732 发表于 2017-1-3 21:32 | 只看该作者
bpdy168 发表于 2017-1-1 13:13
请教:原创STC15单片机+DS18B20做的温度异常超温报警器,keil显示错误,如何解决?STC15W.h(526): warning  ...

IapEraseSector这个函数在编译时无法获取其原型。
要么把IapEraseSector()函数体放在调用它的函数前面,要么在前面添加IapEraseSector()函数的原型声明。
回复

使用道具 举报

6#
ID:160399 发表于 2017-1-6 12:20 | 只看该作者
给一下ds18b20的初始化函数啊
回复

使用道具 举报

7#
ID:146603 发表于 2017-4-13 11:10 | 只看该作者
不错不错,需要下载才能看到其他文件的。
回复

使用道具 举报

8#
ID:207298 发表于 2017-6-3 09:21 | 只看该作者
怎么无法下载啊
回复

使用道具 举报

9#
ID:203336 发表于 2017-6-8 22:33 | 只看该作者
好资料~模块很清晰非常好用~谢谢
回复

使用道具 举报

10#
ID:168444 发表于 2017-6-16 11:07 | 只看该作者
 谢谢分享!已制作成功
回复

使用道具 举报

11#
ID:168444 发表于 2017-6-16 11:27 | 只看该作者
楼主,Delay_us();微秒延时怎么写?
回复

使用道具 举报

12#
ID:220402 发表于 2017-7-17 21:02 | 只看该作者
不错不错,感谢分享
回复

使用道具 举报

13#
ID:159139 发表于 2017-8-8 21:28 来自触屏版 | 只看该作者
谢谢分享,学习一下EEPROM的操作。
回复

使用道具 举报

14#
ID:226801 发表于 2017-8-11 01:39 | 只看该作者

谢谢分享,学习一下18B20的写法
回复

使用道具 举报

15#
ID:233015 发表于 2017-9-20 08:47 | 只看该作者
制作成功了,在制作过程中犯了一些低级小错误,最后请教了楼主南瓜大哥,感谢南瓜大哥的昨天细心指导与分析,谢谢,很给力。
回复

使用道具 举报

16#
ID:233015 发表于 2017-9-20 08:48 | 只看该作者
感谢南瓜大哥的分享与指导,很给力,  谢谢
回复

使用道具 举报

17#
ID:240443 发表于 2017-10-18 05:52 | 只看该作者
试试看看,正需要
回复

使用道具 举报

18#
ID:226801 发表于 2017-12-13 10:26 | 只看该作者
正在使用楼主的程序,改在我的学习板上,谢谢楼主的程序
回复

使用道具 举报

19#
ID:254251 发表于 2018-6-7 00:10 | 只看该作者
刘海龙老师这里什么改

1.png (22.37 KB, 下载次数: 145)

1.png
回复

使用道具 举报

20#
ID:254251 发表于 2018-6-7 00:12 | 只看该作者

回复

使用道具 举报

21#
ID:346614 发表于 2018-6-7 01:22 | 只看该作者
谢谢,写的很实用,亨给利
回复

使用道具 举报

22#
ID:352183 发表于 2018-6-14 23:12 | 只看该作者
谢谢,写的很实用
回复

使用道具 举报

23#
ID:233214 发表于 2018-6-16 14:48 | 只看该作者
谢谢分享,不错
回复

使用道具 举报

24#
ID:343102 发表于 2018-6-17 10:50 | 只看该作者
谢谢分享,下来学习学习
回复

使用道具 举报

25#
ID:72576 发表于 2018-12-2 10:22 | 只看该作者
好资料~模块很清晰非常好用~谢谢
回复

使用道具 举报

26#
ID:350104 发表于 2018-12-2 23:01 | 只看该作者
不错 很喜欢楼主的设计 有实用性
回复

使用道具 举报

27#
ID:63317 发表于 2018-12-3 05:55 | 只看该作者
谢谢分享资料
回复

使用道具 举报

28#
ID:441855 发表于 2018-12-13 13:39 | 只看该作者
大佬这个程序可以用单片机编程吗
回复

使用道具 举报

29#
ID:378706 发表于 2019-6-18 11:06 | 只看该作者
不错 很喜欢楼主的设计 有实用性
回复

使用道具 举报

30#
ID:1051901 发表于 2022-11-14 15:06 | 只看该作者
刘海龙 发表于 2017-1-3 21:32
IapEraseSector这个函数在编译时无法获取其原型。
要么把IapEraseSector()函数体放在调用它的函数前面, ...

今天做了很多次,时序总是不对,只有请教高手了
回复

使用道具 举报

31#
ID:1051901 发表于 2022-11-14 15:08 | 只看该作者
代码真的很好,借鉴了
回复

使用道具 举报

32#
ID:1051661 发表于 2022-11-18 21:40 | 只看该作者
Animals 发表于 2016-10-30 20:38
谢谢分享!已制作成功

请问程序怎么烧录呀
回复

使用道具 举报

33#
ID:262 发表于 2022-11-18 22:15 | 只看该作者
liziwen 发表于 2022-11-18 21:40
请问程序怎么烧录呀

给你做好的板子通电,用串口线连接好电脑,打开stcisp软件,载入hex文件,点击下载程序,按提示冷启动即可
回复

使用道具 举报

34#
ID:1001745 发表于 2023-2-8 19:20 | 只看该作者
大师,请问数码管有笔画暗是什么原因?数码管没有问题,已经全部点亮看过的。
回复

使用道具 举报

35#
ID:894868 发表于 2023-2-10 15:06 | 只看该作者
我只是来点赞一下,支持一下作者··
回复

使用道具 举报

36#
ID:1077165 发表于 2023-5-12 23:19 | 只看该作者
DS18B20做的温度
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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