基于51單片機STC12C5A60S2環境監測報警裝置作者阿陽QQ:113703571
功能:
檢測并報警,溫度,煙霧報警值上下限可調,所有數據串口輸出,可用電腦或手機串口助手實時檢測。
硬件:
STC12C5A60S2單片機最小系統
12864黑白屏---------顯示
18B20-----------------溫度檢測
BH1750---------------光照度檢測
MQ-2------------------煙霧可燃氣體檢測
蜂鳴器----------------報警
IMG_4449.JPG (1.73 MB, 下載次數: 42)
下載附件
2019-3-10 09:56 上傳
#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 (1.08 MB, 下載次數: 39)
下載附件
2019-3-10 09:56 上傳
IMG_4452.PNG (140.15 KB, 下載次數: 38)
下載附件
2019-3-10 09:56 上傳
IMG_4451.PNG (112.85 KB, 下載次數: 44)
下載附件
2019-3-10 09:56 上傳
|