找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2069|回复: 0
收起左侧

基于51单片机的烟雾—温度报警系统程序

[复制链接]
ID:956506 发表于 2021-10-10 14:07 | 显示全部楼层 |阅读模式
看了很多烟雾报警系统,要么就是要钱的,源代码还特别贵,要么就是代码error特别多,于是自己就写了烟雾报警系统,主要功能是测量温度后并在LCD1602上显示温度,测量烟雾浓度,当烟雾浓度低于阀值时蜂鸣器报警,并且亮红灯,(正常时亮蓝灯,烟雾浓度是反着来的,烟雾浓度越大,显示的值越小,我也不知道咋回事,如果有会的大佬还请一起研究指教),并且有六个按键可以控制浓度的阀值。以及温度的上下限,当温度的值在上下限值中时,亮蓝灯,如果大于上限或低于下限亮红灯,蜂鸣器不响,第一次发帖,不知道怎么做,还是想要大佬提点
制作出来的实物图如下:
IMG_20211010_135603.jpg

电路原理图如下:
51hei截图20211010135716.png
部分代码如下:
     #include <REGX52.H>
#include <intrins.h>
#include "LCD1602.h"
#include "DS18B20.h"
#include "key.h"

//宏定义int and char
#define uint unsigned int
#define uchar unsigned char

signed char  up=30;     //上限值
signed char  lay=10;     //下限

//#define BEEP P3_4       //定义蜂鸣器

sbit BEEP=P3^4;          //蜂鸣器


sbit led_h=P2^4;         //蓝灯
sbit led_l=P2^1;         //红灯

sbit ADCS   =  P1^2;
sbit ADCLK  =  P1^4;
sbit ADDI   =  P1^6;
sbit ADDO   =  P1^6;

bit beep_st;             //蜂鸣器间隔标志
uint abc ;               //定义的烟雾浓度显示变量
uchar x=8;               //计数器
uchar  m;                //温度值全局变量
uchar n;                 //温度值全局变量

uchar data disdata[5];
uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};     //摄氏温度符号  12,18,18,12,0,0,0,0



//读取温度值
void check_wendu(void)
{
     uint a,b,c;
         c=ReadTem()-5;      //获取温度值并减去DS18B20的温漂误差
         a=c/100;            //计算得到十位数字
         b=c/10-a*10;         //计算得到个位数字
         m=c/10;              //计算得到整数位
         n=c-a*100-b*10;      //计算得到小数位
        if(m<0){m=0;n=0;}       //设置温度显示夏限
        if(m>99){m=99,n=9;}      //设置温度显示上值
}
//延时程序   延时一毫秒
void delayms(uint ms)
{
      uint i,j;
          for(i=0;i<ms;i++)
            for(j=0;j<100;j++);
}




//报警程序
void Alarm()
{
//     if((m<=up)||(m>=lay)) BEEP=0;        //如果温度大于上限或小于下限,蜂鸣器响
//         else if((m>up)||m<lay) BEEP=1;
     if(abc>=nongdu) BEEP=1;     //&&beep_st==1
     else BEEP=0;
     if(m>top||m<lim)
         {
             led_h=1;
                 led_l=0;
                 BEEP=1;
               
         }
     else
                 if(abc>=nongdu)
         {
             led_h=0;
                 led_l=1;
               
         }                 
         else {led_h=1;led_l=0;}

}
uchar ADC0832(bit mode,bit channel)        //AD装换,返回结果
{
         uchar i,dat,ndat;
         
         ADCS = 0;                            //拉低CS端口
         _nop_();
         _nop_();
         
         ADDI = 1;                           //第一个下降沿为高电平
         ADCLK= 1;                           //拉高时钟端口,即CLK
         _nop_();
         _nop_();
         ADCLK= 0;                           //拉低CLK端口,形成下降沿1;
         _nop_();
         _nop_();
        
         ADDI= mode;                        //低电平为差分模式,高电平为单通道模式
         ADCLK =1;                          //拉高CLK;
         _nop_();
         _nop_();
         ADCLK =0;                            //拉低CLK,形成下降沿2
         _nop_();
         _nop_();
         
         ADDI = channel;                     //低电平为CH0,高电平为CH1
         ADCLK = 1;                          //拉高CLK端口
         _nop_();
         _nop_();
         ADCLK = 0;                          //拉低CLK端,形成下降沿3
         
         ADDI =1;                             //控制命令结束
         dat=0;
         
        //下面开始读取转换后的数据,从最高位开始依次输出(D7~D0);
        
        for(i=0;i<8;i++)
        {
           dat<<= 1;
                ADCLK=1;                        //拉高时钟
                _nop_();
                _nop_();
                ADCLK=0;                        //拉低时钟端形成一次时钟脉冲
                _nop_();
                _nop_();
                dat |= ADDO;
               
        }
        ndat =0;                         //记录D0
        if(ADDO == 1)
        ndat |= 0x80;
        
        //下面开始继续读取反序的数据(D1~D7)
        
        for(i=0;i<7;i++)
        {
            ndat >>=1;
                ADCLK =1;            //拉高时钟端
                _nop_();
                _nop_();
                ADCLK=0;            //拉低时钟端形成一次时钟脉冲
                _nop_();
                _nop_();
                if(ADDO==1)
                ndat |= 0x80;
        }
        
           ADCS =1;            //拉高CS端,结束转换
           ADCLK=0;            //拉高CLK端
           ADDI=1;              //拉高数据端,回到初始状态
           if(dat==ndat)
                   return(dat);
           else
              return 0;
        
}
void display()          //初始化后的显示
{
        LCD_ShowString(1,1,"Smoke:");
        LCD_ShowString(1,10,"T:  . C");
        LCD_ShowString(2,1,"Alarm:");
        LCD_ShowString(2,10,"  -  ");
        LCD_ShowNum(2,7,nongdu,1);
        LCD_ShowNum(2,13,top,2);
        LCD_ShowNum(2,10,lim,2);
        
}

void main()
{

        check_wendu();
        check_wendu();
        LCD_Init();
        delayms(100);
        LCD_Init();
        delayms(100);
        display();
        
        
    while(1)
        {
               checkkey();             //按键检测

                  
                  
                   abc= ADC0832(1,0);       //差分模式,CH0—CH1;
                   abc=abc*19.607843;        //转换为实际电压便于显示
                   abc=abc/1000%10;
                   LCD_ShowNum(1,7,abc,2);
                   LCD_ShowNum(1,12,m,2);
               LCD_ShowNum(1,15,n,1);
                   LCD_ShowNum(2,7,nongdu,1);
               LCD_ShowNum(2,13,top,2);
               LCD_ShowNum(2,10,lim,2);
                   check_wendu();
               
                   Alarm();                   //报警检测
               
               

               
        }
}

IMG_20211010_135623.jpg

烟雾温度报警.zip

161.94 KB, 下载次数: 27

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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