基于51单片机的报警器(4路,TLC1543)
4路模拟量报警器(煤气、一氧化碳、甲烷等自定义每个测量点含义)
1、使用ADC芯片测量4路模拟量输入,使用电位器代替
2、显示测量结果0-99%
3、按键设置阀值,测量值超过阀值,报警提示
#include "reg51.h"
#include"TLC1543.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^6;//按钮
sbit k2=P3^7;
sbit led1=P2^4;//指示灯
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;
sbit beep=P1^5;//蜂鸣器
uchar disp1[]="00% 00% 00% 00%";
uchar disp2[]="limit:00%";
uchar limit=10;//报警值
uint qiti1=0,qiti2=0,qiti3=0,qiti4=0;//有害气体浓度
uchar time=0;
//延时函数
void delay(uint i)
{
while(i--);
}
//主函数
void main()
{
init_1602();
TMOD|=0X01;
TH0=0X3C;
TL0=0XB0;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(!k1)//加
{
delay(1000);
if(!k1)
{
if(limit<99)
limit++;
while(!k1);
}
}
if(!k2)//减
{
delay(1000);
if(!k2)
{
if(limit>0)
limit--;
while(!k2);
}
}
//报警
if(qiti1>limit)
led1=0;
else
led1=1;
if(qiti2>limit)
led2=0;
else
led2=1;
if(qiti3>limit)
led3=0;
else
led3=1;
if(qiti4>limit)
led4=0;
else
led4=1;
if(!led1 || !led2 || !led3 || !led4)
beep=0;
else
beep=1;
}
}
//定时器0中断
void Timer0() interrupt 1
{
uchar i;
unsigned long k=0;
if(time<10) //定时0.5s
time++;
else
{
time=0;
for(i=0;i<10;i++)//测量
qiti1=TLC1543_read(0);
k=qiti1;
qiti1=99*k/4069;
for(i=0;i<10;i++)//测量
qiti2=TLC1543_read(1);
k=qiti2;
qiti2=99*k/4069;
for(i=0;i<10;i++)//测量
qiti3=TLC1543_read(2);
k=qiti3;
qiti3=99*k/4069;
for(i=0;i<10;i++)//测量
qiti4=TLC1543_read(3);
k=qiti4;
qiti4=99*k/4069;
//显示
disp1[0]=qiti1/10+0x30;
disp1[1]=qiti1%10+0x30;
disp1[4]=qiti2/10+0x30;
disp1[5]=qiti2%10+0x30;
disp1[8]=qiti3/10+0x30;
disp1[9]=qiti3%10+0x30;
disp1[12]=qiti4/10+0x30;
disp1[13]=qiti4%10+0x30;
write_string(1,0,disp1);
disp2[6]=limit/10+0x30;
disp2[7]=limit%10+0x30;
write_string(2,0,disp2);
}
TH0=0X3C;
TL0=0XB0;
}