找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4215|回复: 2
收起左侧

基于18B20的温度报警系统(可调节温度上下限,超温报警)51单片机源程序

[复制链接]
ID:260016 发表于 2017-12-14 20:27 | 显示全部楼层 |阅读模式
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
0.jpg

单片机源程序如下:
  1. #include "reg52.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5.         
  6. //sbit Buzz = P3^2;
  7. sbit Buzz = P1^5;

  8. /*******************************************lcd1602.c函数声明************************************************/
  9. extern void InitLcd1602();                                          //lcd1602初始化函数
  10. extern void DisplayLimit(uchar x,uchar y,char dat);                //在坐标(x,y)显示温度上限或下限
  11. extern void InitMaxMin();                                         //进入温度报警值设置界面
  12. extern void Display_user(uchar x);                               //显示用户自定义的字符“↑”
  13. extern void LcdShowStr(uchar x,uchar y,uchar *str);
  14. extern void LcdShowDat(uchar x,uchar y,uchar num);
  15. extern void Display_laba();
  16. /*******************************************key.c函数声明****************************************************/
  17. extern void KeyDrive();
  18. extern void KeyScan();
  19. /****************************************ds18b20.c函数声明***************************************************/
  20. extern bit        RESET_DS18B20(void);
  21. extern uint Read_DS18B20_TEMP(void);
  22. /*****************************************main.c子函数声明***************************************************/
  23. void Timer1Init(uint ms);                                    //定时器1初始化函数
  24. void SetLimit();                                            //设置报警值函数
  25. void ControlBuzz();                                        //蜂鸣器控制函数
  26. void delay(uint z);
  27. /**********************************************变量定义******************************************************/
  28. extern uchar code buff[];
  29. uchar T1RH=1;                                           //定时器初值
  30. uchar T1RL=1;                                             
  31. bit flagBuzz=0;                                       //蜂鸣器开关标志
  32. bit EBuzz=0;                                         //蜂鸣器使能标志
  33. char High=20;                                       //温度上限  超过限度蜂鸣器开
  34. char Low=10;                                       //温度下限
  35. uchar mode=0;                                     //模式变量
  36. uchar cnt=0;                                     //ESC按键 变量
  37. uchar tflag;                                    //温度正负标志位
  38. /*************************************主函数***************************************/
  39. void main()
  40. {
  41.         EA=1;                                            //开启总中断
  42.         Timer1Init(1);                                   //初始化定时器1
  43.         RESET_DS18B20();                                 //复位18B20
  44.         delay(20);
  45.   InitLcd1602();                                   //初始化lcd1602
  46.         while(1)
  47.         {
  48.                 LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]);           //显示温度值十位
  49.                 LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]);         //显示温度值个位
  50.                 LcdShowStr(12,1,".");                                     //显示小数点
  51.                 LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]);            //显示小数位
  52.                 KeyDrive();                                    //按键驱动
  53.                 SetLimit();                                    //设置报警值
  54.         }
  55. }

  56. /**********************************按键动作函数************************************/
  57. void KeyDown(uchar keycode)
  58. {
  59.         if(keycode==0x0D)                                        //回车键:进入模式设置
  60.         {
  61.                 mode++;
  62.                 if(mode>2)mode=0;
  63.         }
  64.         else if(keycode==0x26)                                   //向上键:模式1 上限值+1   模式2 下限值+1
  65.         {
  66.                 if(mode==1)
  67.                 {
  68.                         High++;
  69.                         if(High>99)High=99;
  70.                 }
  71.                 else if(mode==2)
  72.                 {
  73.                         Low++;
  74.                         if(Low==High)Low=High-1;
  75.                 }
  76.         }
  77.         else if(keycode==0x28)                                   //向下键:模式1 上限值-1   模式2 下限值-1
  78.         {
  79.                 if(mode==1)
  80.                 {
  81.                         High--;
  82.                         if(High==Low)High=Low+1;
  83.                 }
  84.                 else if(mode==2)
  85.                 {
  86.                         Low--;
  87.                         if(Low<0)Low=0;
  88.                 }
  89.         }
  90.         else if(keycode==0x1B)                                   //Esc键:开关蜂鸣器报警
  91.         {
  92.                 if(mode==0)
  93.                 {
  94.                         cnt++;
  95.                   if(cnt>1)cnt=0;
  96.                   if(cnt==1)                                          //蜂鸣器使能开启 显示喇叭图像
  97.                   {
  98.                            EBuzz=1;
  99.                                  Display_laba();
  100.                   }
  101.                   else if(cnt==0)                                     //蜂鸣器使能关闭 不显示喇叭
  102.                   {
  103.                            EBuzz=0;
  104.                                 LcdShowStr(7,0,"  ");
  105.                   }
  106.           }
  107.   }
  108. }

  109. /************************************报警值设置函数*********************************/
  110. void SetLimit()
  111. {
  112.                 if(mode==0);                                             //模式0 正常显示 调用蜂鸣器控制函数
  113.                 {
  114.                         ControlBuzz();
  115.                 }
  116.                
  117.                 if(mode!=0)                                              //模式1 调整温度上限
  118.                 {                                                        //模式2 调整温度下限
  119.                         EBuzz=0;
  120.                         InitMaxMin();
  121.                         while(mode!=0)
  122.                         {
  123.                                 KeyDrive();
  124.                                 if(mode==1)
  125.                                 {
  126.                                         Display_user(3);                                   //显示自定义的 箭头 图像 指向温度上限
  127.                                         DisplayLimit(2,0,High);                            //显示 温度报警值上下限
  128.                 DisplayLimit(12,0,Low);
  129.                                 }
  130.                                 else if(mode==2)
  131.                                 {
  132.                                         Display_user(13);                                  //显示自定义的 箭头 图像 指向温度下限
  133.                                         LcdShowStr(3,1," ");
  134.                                         DisplayLimit(2,0,High);
  135.                 DisplayLimit(12,0,Low);
  136.                                 }
  137.                         }
  138.                         InitLcd1602();
  139.                 }
  140. }

  141. /************************************蜂鸣器控制函数************************************/
  142. void ControlBuzz()
  143. {
  144.         if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))
  145.                 flagBuzz=1;
  146.         else
  147.                 flagBuzz=0;
  148.         if((flagBuzz==1)&&(EBuzz==1))
  149.         {
  150.                 Buzz=~Buzz;
  151.         }
  152. }

  153. void delay(uint z)
  154. {
  155.         uint x,y;
  156.         for(x=z;x>0;x--)               
  157.                 for(y=115;y>0;y--);
  158. }

  159. /**********定时器1初始化函数***********/
  160. void Timer1Init(uint ms)
  161. {
  162.         ulong tmp;                                               //16位长整型变量tmp
  163. ……………………

  164. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码下载:
11.DS18B20温度报警.rar (68.75 KB, 下载次数: 113)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:264406 发表于 2017-12-25 18:29 | 显示全部楼层
怎么设置温度上下限?
刷了一下板子 调不了温度上下限
回复

使用道具 举报

ID:266621 发表于 2017-12-25 20:37 | 显示全部楼层
谁能根据楼主的程序画个仿真图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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