历史上的今天
今天是:2025年03月04日(星期二)
2020年03月04日 | 51单片机一氧化碳CO浓度报警器设计
2020-03-04 来源:51hei
基于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) 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; //红灯灭
下一篇:基于单片机的直流电机控制系统
史海拾趣
|
小女子我初学单片机,很多不懂得地方,向大家请教下啊 关于使用外部中断点亮发光二极管的问题,为实现同一功能,写了两方案,具体程序和问题如下 方案一: ORG 0000H LJMP MAIN ORG 0003H LJMP INT MAIN: SETB EA /*首先开启总中 ...… 查看全部问答> |
|
[转载] 簡易開核 輕鬆暢玩 ASUS M4A89GTD PRO/USB3 (存開箱) AMD 現今最夯的口號 我想還是 核心動力全開 小弟也藉由這次開核風氣 入手了M4A89GTD PRO/USB3 入手也一陣子了 就來發個開箱吧 本次的主角出現了 X2 555 與M4A89GTD PRO/USB3 這次華碩用的主機板的彩盒還滿亮眼的 在一張,把閃 ...… 查看全部问答> |
|
现在需要用Waveout函数系列来实现播放wav文件的功能,播放功能已经实现,现在实现快进的功能的时候出现了一个问题,就是在按下快进按钮的时候, 原来已经读入缓冲区的音频内容还在, 请问这时候如何去清除缓冲区内的音频内容.… 查看全部问答> |
|
我的平台是CEPC X86,使用PB4.2自带的CEPC BSP定制的,系统可以正常启动。 但是,当桌面启动后,就弹出一个对话框要我设置DHCP或者静态IP,对话框的标题是:\'Mycrosoft null Ethernet Miniport Driver\' settings 当我设置DHCP时,确实可以得到 ...… 查看全部问答> |
|
用串口与MCU通信,用57600波特率,8位数据,1位停止位,无校验位。mcu端发送一个数据包号请求命令(共10个字节长度),wince端收到后,解析出包号,把对应包号的数据发送给MCU(共40个字节长度)。mcu端收到数据后继续请求下一包数据 ...… 查看全部问答> |
|
此次STM32的技术研讨会的一个重要的部分是,与使用STM32的工程师们面对面的讨论一些大家普遍碰到的问题。STM32是个新产品,Cortex-M3也是个新产品,有很多应用上的概念与大家原有的概念是相通的,也有一些概念是有些人没有碰到过的,我们希望 ...… 查看全部问答> |




