×
单片机 > 单片机程序设计 > 详情

51单片机一氧化碳CO浓度报警器设计

发布时间:2020-08-21 发布时间:
|

基于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)


关键字:51单片机  一氧化碳  CO浓度报警器 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何升级STM32单片机的代码