基于51单片机STC12C5A60S2环境监测报警装置作者阿阳QQ:113703571
功能:
检测并报警,温度,烟雾报警值上下限可调,所有数据串口输出,可用电脑或手机串口助手实时检测。
硬件:
STC12C5A60S2单片机最小系统
12864黑白屏---------显示
18B20-----------------温度检测
BH1750---------------光照度检测
MQ-2------------------烟雾可燃气体检测
蜂鸣器----------------报警
#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脚
}
}
|