单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机环境监测系统消防报警装置

[复制链接]
梁光阳 发表于 2019-3-10 09:56 | 显示全部楼层 |阅读模式
基于51单片机STC12C5A60S2环境监测报警装置作者阿阳QQ:113703571

功能:
检测并报警,温度,烟雾报警值上下限可调,所有数据串口输出,可用电脑或手机串口助手实时检测。
硬件:
STC12C5A60S2单片机最小系统
12864黑白屏---------显示
18B20-----------------温度检测
BH1750---------------光照度检测
MQ-2------------------烟雾可燃气体检测
蜂鸣器----------------报警

IMG_4449.JPG



#include <stc15xx.H>
#include "hj12864.h"
#include "AD.H"
#include "DS18B20.h"
#include "BH1750.H"               
#include "PWM12.H"       
#include "usart.h"
#include "EEPROM.h"
sbit jia=P3^2;
sbit jian=P3^3;
sbit shezhi=P3^4;
sbit queren=P3^5;
sbit fmq=P1^6;//蜂鸣器
sbit jdq=P1^7;//继电器风扇输出
int wdsx,wdxx,ywsx,ywxx;
int mod=1;
void hanzi1616x(int x,y,unsigned char *dp)
{
display_graphic_16x16(1,x,y+16*0,dp+32*0);//汉字1616
display_graphic_16x16(1,x,y+16*1,dp+32*1);//汉字1616       
display_graphic_16x16(1,x,y+16*2,dp+32*2);//汉字1616
display_graphic_16x16(1,x,y+16*3,dp+32*3);//汉字1616       
}
void shuzi168(int x,y,k)
{
        display_8x16num(1,x,y+8*0,k/100);
        display_8x16num(1,x,y+8*1,k%100/10);
        display_8x16num(1,x,y+8*2,k%100%10%10);

}
void Delay10ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 108;
        j = 144;
        do
        {
                while (--j);
        } while (--i);
}

void Delay200ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 9;
        j = 104;
        k = 139;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay20000ms()                //@11.0592MHz
{
        unsigned char i, j, k;
        i = 73;
        j = 117;
        k = 62;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void dismod()
{
        if(mod==0)
        {
                hanzi1616x(3,5,chanshu+32*16);//空白
          hanzi1616x(3,5+16*4,chanshu+32*16);//空白
        }
        if(mod==1)
        {
                hanzi1616x(3,5,chanshu);//温度上限
                shuzi168(3,5+16*4+8,wdsx);
        }
        if(mod==2)
        {
                hanzi1616x(3,5,chanshu+32*4);//温度下限
                shuzi168(3,5+16*4+8,wdxx);
        }
        if(mod==3)
        {
                hanzi1616x(3,5,chanshu+32*8);//烟雾上限
                shuzi168(3,5+16*4+8,ywsx);
        }
        if(mod==4)
        {
                hanzi1616x(3,5,chanshu+32*12);//烟雾下限
                shuzi168(3,5+16*4+8,ywxx);
        }
}
void keyscan()
{
        if(shezhi==0)
        {
                Delay10ms();
                if(shezhi==0)
                {
                        mod++;
                        if(mod==5)
                        mod=1;
                        while(shezhi==0);
                }       
        }
        if(jia==0&&mod==1)
        {
                Delay10ms();
                if(jia==0&&mod==1)
                {
                        if(wdsx!=800)
                        wdsx+=10;
                        xieru();
                        while(jia==0&&mod==1);  
                }       
        }
        if(jian==0&&mod==1)
        {
                Delay10ms();
                if(jian==0&&mod==1)
                {
                        if(wdsx>0)
                        wdsx-=10;
                        xieru();
                        while(jian==0&&mod==1);  
                }       
        }       
        ///////////////////////温度上限
                if(jia==0&&mod==2)
        {
                Delay10ms();
                if(jia==0&&mod==2)
                {
                        if(wdxx!=800)
                        wdxx+=10;
                        xieru();
                        while(jia==0&&mod==2);  
                }       
        }
        if(jian==0&&mod==2)
        {
                Delay10ms();
                if(jian==0&&mod==2)
                {
                        if(wdxx!=0)
                        wdxx-=10;
                        xieru();
                        while(jian==0&&mod==2);  
                }       
        }       
        ///////////////////////温度下限
                if(jia==0&&mod==3)
        {
                Delay10ms();
                if(jia==0&&mod==3)
                {
                        if(ywsx!=255)
                        ywsx++;
                        xieru();
                        while(jia==0&&mod==3);  
                }       
        }
        if(jian==0&&mod==3)
        {
                Delay10ms();
                if(jian==0&&mod==3)
                {
                        if(ywsx!=0)
                        ywsx--;
                        xieru();
                        while(jian==0&&mod==3);  
                }       
        }       
        ///////////////////////烟雾上限
                        if(jia==0&&mod==4)
        {
                Delay10ms();
                if(jia==0&&mod==4)
                {
                        if(ywxx!=255)
                        ywxx++;
                        xieru();
                        while(jia==0&&mod==4);  
                }       
        }
        if(jian==0&&mod==4)
        {
                Delay10ms();
                if(jian==0&&mod==4)
                {
                        if(ywxx!=0)
                        ywxx--;
                        xieru();
                        while(jian==0&&mod==4);  
                }       
        }       
        ///////////////////////烟雾下限
}

void yanwu(int x,y,k)
{
          display_graphic_16x16(1,x,y,yanw+32*0);
          display_graphic_16x16(1,x,y+16,yanw+32*1);
          display_graphic_16x16(1,x,y+32,yanw+32*2);
          display_8x16num(1,x,y+32+8,k/1000);
          display_8x16num(1,x,y+32+16,k%1000/100);
          display_8x16num(1,x,y+32+24,k%1000%100/10);
          display_8x16num(1,x,y+32+32,k%1000%100%10);
}
void wendu(int x,y,k)
{
          display_graphic_16x16(1,x,y,wend+32*0);
          display_graphic_16x16(1,x,y+16,wend+32*1);
          display_graphic_16x16(1,x,y+32,wend+32*2);
          display_8x16num(1,x,y+32+8,k/100);
          display_8x16num(1,x,y+32+16,k%100/10);
          display_string_8x16(1,x,y+32+24,".");
          display_8x16num(1,x,y+32+32,k%100%10);
          display_graphic_16x16(1,x,y+32+42,ssd);
}
void guangzhao(int x,y,k)
{
          display_graphic_16x16(1,x,y,gzs+32*0);
          display_graphic_16x16(1,x,y+16,gzs+32*1);
          display_graphic_16x16(1,x,y+32,gzs+32*2);
          display_8x16num(1,x,y+32+8,k/10000);
          display_8x16num(1,x,y+32+16,k%10000/1000);
          display_8x16num(1,x,y+32+24,k%10000%1000/100);
          display_8x16num(1,x,y+32+32,k%10000%1000%100/10);
          display_8x16num(1,x,y+32+40,k%10000%1000%100/10);
          display_string_8x16(1,x,y+32+50,"lx");
}
uint MQx,tem,gzz;
void usartwendu()
{
                        UART_Send_Str("温度");//温度
                UART_Send_Byte(tem/100+0x30);
                UART_Send_Byte(tem%100/10+0x30);
                UART_Send_Str(".");
                UART_Send_Byte(tem%100%10+0x30);
                UART_Send_Str("  ");//换行符
}
void usartyanwu()
{
                UART_Send_Str("烟雾");//烟雾
                UART_Send_Byte(MQx/1000+0x30);
                UART_Send_Byte(MQx%1000/100+0x30);
                UART_Send_Byte(MQx%1000%100/10+0x30);
                UART_Send_Byte(MQx%1000%100%10+0x30);
                UART_Send_Str("  ");//换行符
}
void usartguangzhao()
{
                UART_Send_Str("光照");//温度
                UART_Send_Byte(gzz/10000+0x30);
                UART_Send_Byte(gzz%10000%1000+0x30);
                UART_Send_Byte(gzz%10000%1000/100+0x30);
                UART_Send_Byte(gzz%10000%1000%100/10+0x30);
          UART_Send_Byte(gzz%10000%1000%100%10+0x30);
                UART_Send_Str("\n");//换行符
}

void main(void)
{usart_init();
        initADC(0x01);//初始化8通道
        initial_lcd();//lcd初始化
        PWM_init(1,0);//初始值
                        ds_init();
                ds_xie_byte(0xcc);
          ds_xie_byte(0x44);
        Delay200ms();Delay200ms();Delay200ms();Delay200ms();
        Init_BH1750();//初始化BH1750
        clear_screen();//清屏
  if(IapReadByte(0x300)!=0x55)
        {
          IapEraseSector(0x300);
          IapProgramByte(0x300,0x55);
                chushihua();
        }
        duqu();
        while(1)
        {        keyscan();
                dismod();
                ds_init();
                ds_xie_byte(0xcc);
          ds_xie_byte(0x44);
                tem=read_temperature();//温度读取
                wendu(5,4,tem);//温度显示
                usartwendu();//串口输出
                if(tem>wdsx)//温度超高
                {
                fmq=0;//报警
                jdq=0;
                }
                if(tem<wdxx)//温度降低到下限
                {
                        fmq=1;//报警停止
                        jdq=1;
                }
               
                MQx=readADC(0);//烟雾读取
                yanwu(7,4,MQx);//烟雾显示       
                usartyanwu();
                if(ywsx>MQx && MQx>ywxx)//烟雾比较
                {
                //        fmq=1;//报警关闭
                }               
                else
                {
                //        fmq=0;//报警
                }
                //gzz=duguangzhao();//光照值读取
                guangzhao(1,4,gzz);
                usartguangzhao();
                CCAP0H=CCAP0L=gzz;//设置PWM1 p1.3脚               
        }
}
IMG_4462(20190310-000835).jpg IMG_4452.PNG IMG_4451.PNG


回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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