烟雾报警器:
1、测量温度和烟雾浓度
2、温度超过上下限,报警;烟雾超过上限报警
3、通过按键设置报警值
#include "reg51.h"
#include "lcd1602.h"
#include"Ds18b20.h"
#include "ADC0832.h"
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit beep=P2^3;//蜂鸣器
uint time=0; //定时
uchar xian1[]="Y:00% T:00 C";
uchar xian2[]="00% L:00 H:00";//参数
uchar wendu=0,yan=0;//温度
uchar lim1=50,lim2=10,lim3=30;//阀值
uchar mode=0;
//主函数
void main()
{
xian1[10]=0xdf;
init_1602(); //初始化LCD
TMOD|=0X01; //模式1
TH0=0XFC; //1ms
TL0=0X18;
ET0=1; //打开定时器0中断允许
EA=1; //打开总中断
TR0=1; //打开定时器
while(1)
{
if(!k1)//设置
{
if(mode<3)
mode++;
else
mode=0;
while(!k1);
}
if(!k2)//加
{
if(mode==1)
{
if(lim1<99)
lim1++;
}
if(mode==2)
{
if(lim2<lim3)
lim2++;
}
if(mode==3)
{
if(lim3<99)
lim3++;
}
while(!k2);
}
if(!k3)//减
{
if(mode==1)
{
if(lim1>0)
lim1--;
}
if(mode==2)
{
if(lim2>0)
lim2--;
}
if(mode==3)
{
if(lim3>lim2)
lim3--;
}
while(!k3);
}
}
}
//定时器中断
void Timer0() interrupt 1 //定时器0中断
{
uint i;
if(time<300)//定时0.3s
time++;
else
{
time=0;
wendu=Ds18b20ReadTemp();//测温
i=ADC(1);
yan=i*99/127;//烟雾
//报警
if((yan>lim1)||(wendu>lim3)||(wendu<lim2))
beep=0;
else
beep=1;
//显示
xian1[2]=yan/10+0x30;
xian1[3]=yan%10+0x30;
xian1[8]=wendu/10+0x30;
xian1[9]=wendu%10+0x30;
xian2[0]=lim1/10+0x30;
xian2[1]=lim1%10+0x30;
xian2[6]=lim2/10+0x30;
xian2[7]=lim2%10+0x30;
xian2[11]=lim3/10+0x30;
xian2[12]=lim3%10+0x30;
write_string(1,0,xian1);
write_string(2,0,xian2);
//设置光标
if(mode==1)
{
write_sfm(2,1);
}
if(mode==2)
{
write_sfm(2,7);
}
if(mode==3)
{
write_sfm(2,12);
}
if(mode==0)
{
write_com(0x0c);
}
else
write_com(0x0e);
}
TH0=0XFC; //1ms
TL0=0X18;
}