历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 51单片机一氧化碳CO浓度报警器设计

2020-03-04 来源:51hei

基于51单片机的CO浓度报警器设计,实际测试成功。MQ系列气体传感器通用!
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png?imageView2/2/w/550

制作出来的实物图如下:
0.jpg?imageView2/2/w/5500.jpg?imageView2/2/w/550

一氧化碳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)

                WARNING=255;

                write_com(0x80+0x40+11);

                write_data('0'+WARNING/100);

                write_data('0'+WARNING/10%10);

                write_data('0'+WARNING%10);

                write_com(0x80+0x40+13);//位置

                FENG=1;

        }

}


void  time1_int(void) interrupt 1  //定时器函数

{

        uchar count;

        TL0=0xb0;

         TH0=0x3c;        //重新赋初值

          count++;        //计时变量加

        if(count==10)//定时器定时是50ms,此处计数10次,正好是500ms,用于报警时 灯亮和蜂鸣器响

        {

                if(flag==0)                   //报警标志为0时

                {

                        LED_G=0;           //绿灯亮

                        LED_R=1;           //红灯灭

推荐阅读

史海拾趣

Harbour Industries公司的发展小趣事

背景:随着全球化的深入发展,电子行业也迎来了国际化的浪潮。Handok意识到,要想在激烈的国际竞争中立于不败之地,必须加强与国际市场的联系和合作。

发展:Handok积极寻求与国际知名电子企业的合作机会,通过技术引进、联合研发等方式不断提升自身的技术实力和产品品质。同时,公司还加大了对国际市场的开拓力度,通过参加国际展会、设立海外分支机构等方式扩大品牌影响力。

影响:国际合作的成功为Handok带来了更多的发展机遇和市场空间,公司的国际知名度和竞争力显著提升。

Friedrich Lütze GmbH公司的发展小趣事

在激烈的市场竞争中, Friedrich Lütze GmbH 深知品牌建设的重要性。公司不断加大品牌宣传力度,通过参加国内外知名展会、举办技术研讨会等方式,提升品牌知名度和影响力。同时,公司注重客户服务体验,建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些举措有效提升了公司在市场上的竞争力和客户满意度。

上海超致公司的发展小趣事

上海超致始终重视品牌建设,公司拥有一系列注册商标和专利信息,这些知识产权的拥有为公司树立了良好的品牌形象。同时,上海超致还积极开展国际合作,与国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。这些国际合作不仅提升了公司的技术水平,也帮助公司打开了国际市场的大门。

ENPIRION公司的发展小趣事

随着ENPIRION公司产品的不断推出和市场的逐步扩大,公司开始寻求与各大电子制造商的合作。通过与小米、OPPO、vivo等知名品牌建立合作关系,ENPIRION公司的电源管理解决方案得到了更广泛的应用,进一步提升了其市场影响力和竞争力。这些合作伙伴关系的建立不仅为ENPIRION公司带来了更多的商业机会,也为其技术创新和产品升级提供了更广阔的平台。

常州能动(ENDRIVE)公司的发展小趣事

为了确保产品质量和客户满意度,常州能动不断完善质量管理体系。公司引进了国际先进的质量管理方法,建立了严格的质量检测流程。同时,公司还加大了对生产设备的投入,引进了先进的生产设备和技术,提高了生产效率和产品质量。这些努力使得常州能动的产品质量得到了客户的高度认可。

Astro Industries Inc公司的发展小趣事

随着产品的热销,Astro Industries Inc开始积极寻求市场拓展的机会。公司加强了与各大销售渠道的合作,通过线上线下相结合的方式,将产品推向更广阔的市场。同时,公司也注重品牌建设,通过统一的品牌形象和宣传策略,提升了品牌知名度和美誉度。这些举措使得Astro Industries Inc在电子行业中逐渐崭露头角。

问答坊 | AI 解惑

51单片机外部中断问题

小女子我初学单片机,很多不懂得地方,向大家请教下啊 关于使用外部中断点亮发光二极管的问题,为实现同一功能,写了两方案,具体程序和问题如下 方案一: ORG 0000H LJMP MAIN ORG 0003H LJMP INT MAIN: SETB EA  /*首先开启总中 ...…

查看全部问答>

有没有办法从应用程序得到windowmessage的值

因我要拦截系统自定义的系统消息,只知道消息名字,不知道值,如何得到其值。谢谢Q…

查看全部问答>

6410,wince软件开发项目合作

基于S3C6410的WINCE 6.0 R3软件开发. 最好在顺德,需要与硬件调试.…

查看全部问答>

[转载] 簡易開核 輕鬆暢玩 ASUS M4A89GTD PRO/USB3 (存開箱)

AMD 現今最夯的口號 我想還是  核心動力全開 小弟也藉由這次開核風氣 入手了M4A89GTD PRO/USB3 入手也一陣子了 就來發個開箱吧 本次的主角出現了 X2 555 與M4A89GTD PRO/USB3 這次華碩用的主機板的彩盒還滿亮眼的 在一張,把閃 ...…

查看全部问答>

如何实现快进和快退的功能

现在需要用Waveout函数系列来实现播放wav文件的功能,播放功能已经实现,现在实现快进的功能的时候出现了一个问题,就是在按下快进按钮的时候, 原来已经读入缓冲区的音频内容还在, 请问这时候如何去清除缓冲区内的音频内容.…

查看全部问答>

WINCE OS启动桌面后为什么总是提醒我设置IP?

我的平台是CEPC X86,使用PB4.2自带的CEPC BSP定制的,系统可以正常启动。 但是,当桌面启动后,就弹出一个对话框要我设置DHCP或者静态IP,对话框的标题是:\'Mycrosoft null Ethernet Miniport Driver\' settings 当我设置DHCP时,确实可以得到 ...…

查看全部问答>

wince 串口的处理速度问题

    用串口与MCU通信,用57600波特率,8位数据,1位停止位,无校验位。mcu端发送一个数据包号请求命令(共10个字节长度),wince端收到后,解析出包号,把对应包号的数据发送给MCU(共40个字节长度)。mcu端收到数据后继续请求下一包数据 ...…

查看全部问答>

12月3号xilinx北京研讨会资料上传

12月3号xilinx北京研讨会资料上传 只是将培训中相关的课件pdf上传了 其他有需要的 可以再上传    …

查看全部问答>

STM32没有MPU

                                 如题,是不是没有MPU(Memory protect unit)?…

查看全部问答>

【忽悠】STM32的技术研讨会先睹为快

此次STM32的技术研讨会的一个重要的部分是,与使用STM32的工程师们面对面的讨论一些大家普遍碰到的问题。STM32是个新产品,Cortex-M3也是个新产品,有很多应用上的概念与大家原有的概念是相通的,也有一些概念是有些人没有碰到过的,我们希望 ...…

查看全部问答>