基于51单片机的CO浓度报警器设计,实际测试成功。MQ系列气体传感器通用!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
制作出来的实物图如下:
一氧化碳CO报警器元件清单
1) 9*15万用板
2) STC89C51单片机
3) ADC0809
4) 28脚IC座
5) 40脚IC座
6) 1602液晶
7) 16p母座
8) 16p排针
9) 3p排针
10) 7*7风扇
11) MQ-7烟雾传感器
12) 5v继电器(黄/蓝)
13) 2.2k电阻*3
14) 1.5k电阻
15) 1k电阻*2
16) 5.1Ω电阻
17) 导线、焊锡
17) 220Ω电阻
18) 10k电阻*2
19) 470Ω电阻
20) 10uf电解电容
21) 30pf瓷片电容*2
22) 12M晶振
23) 按键*4
24) 103排阻(10k)
25) 有源蜂鸣器
26) 5mmLED (红绿黄) *3
27) 9012三极管*2
28) 104独石电容
29) 2p接线端子
30) DC电源接口
31) 自锁开关
32) USB电源线
或电池盒+DC电源插口
单片机源程序如下:
//程序头函数
#include
//显示函数
#include
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1
//管脚声明
sbit LED_R= P2^2;//红灯
sbit LED_G= P2^0;//绿灯
sbit FENG = P2^5;//蜂鸣器
sbit san=P3^4; //风扇控制(选配)
//ADC0809
sbit ST=P3^3;
sbit EOC=P3^6;
sbit OE=P3^2;
//按键
sbit Key1=P2^6; //设置键
sbit Key2=P2^7; //加按键
sbit Key3=P3^7; //减按键
bit bdata flag; //报警标志位
uchar set; //设置状态
//函数声明
extern uchar ADC0809();
extern void Key();
//酒精含量变量
uchar temp=0;
uchar WARNING=25; //报警值
void init() //初始化函数
{
TMOD=0x01; //工作方式
TL0=0xb0;
TH0=0x3c; //赋初值(12MHz晶振的50ms)
EA=1; //打开中断总开关
ET0=1; //打开中断允许开关
TR0=1; //打开定时器开关
}
void main() //主函数
{
Init1602();//初始化显示
init(); //初始化定时器
while(1) //进入循环
{
temp=ADC0809(); //读取酒精浓度值
if(set==0) //只有在非设置状态时,
Display_1602(temp,WARNING); //才刷新显示实时浓度值
if(temp
{
flag=0; //报警标志位置0,不报警
}
else if(temp>WARNING&&set==0) //非设置时当浓度值大于报警值时
{
flag=1; //报警标志位置1
}
Key(); //扫描按键
}
}
//ADC0809读取信息
uchar ADC0809()
{
uchar temp_=0x00;
//初始化高阻太
OE=0;
//转化初始化
ST=0;
//开始转换
ST=1;
ST=0;
//外部中断等待AD转换结束
while(EOC==0)
//读取转换的AD值
OE=1;
temp_=Data_ADC0809;//将0809的数值读入单片机
OE=0;
return temp_; //返回读到的数据
}
void Key() //按键函数
{
if(Key1==0) //设置键按下时
{
while(Key1==0); //检测按键是否释放
FENG=0; //蜂鸣器响
set++; //设置状态标志加
flag=0; //停止报警
san=1; //风扇停止转动(选配)
TR0=0; //定时器停止
write_com(0x80+0x40+13);//选中报警值的位置
write_com(0x0f);//打开显示 无光标 光标闪烁
}
if(set>=2) //再按一下设置键时,退出设置
{
set=0; //设置状态清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
FENG=1; //蜂鸣器停止响
flag=1; //报警标志位置1
TR0=1; //定时器开始计时
}
if(Key2==0&&set!=0) //当在设置状态时,按下加键时
{
while(Key2==0); //按键释放
FENG=0; //蜂鸣器鸣响
WARNING++; //报警阈值加
if(WARNING>=255)//阈值最大加到255
WARNING=0; //清零
write_com(0x80+0x40+11); //在阈值的位置写入设置的数据
write_data('0'+WARNING/100); //显示百位(将123除以100得到的商是1,就是百位数据)123为例子
write_data('0'+WARNING/10%10);//显示十位(将123除以10得到商是12,将12除以10的余数就是十位)
write_data('0'+WARNING%10); //显示个位(将123除以10的余数3就是个位数据)123为例子
write_com(0x80+0x40+13);//位置
FENG=1;//蜂鸣器停止
}
if(Key3==0&&set!=0) //减按键注释参考加按键部分
{
while(Key3==0);
FENG=0;
WARNING--;
if(WARNING<=0)
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』