当前位置:文档之家› 简易智能抽油烟机设计完整版

简易智能抽油烟机设计完整版

概要随着社会的进步,科技的发展,人们生活水平的提高,电子产品应用人们的生活方面的范围越来越宽。

本设计采用单片机技术结合A/D转换芯片构成的对油烟浓度进行检测,并对测试的环境温度进行检测,判断环境温度是否达到危险温度,如达到危险温度即发出警报,通过单片对检测的油烟浓烟进行处理并在LCD上显示出来,并对风扇进行控制,对风扇进行档位设置,当油烟浓度较低的时候开启1档进行油烟的抽出,当浓度较高时开启2档进行油烟的抽出,当油烟浓于某一个值时,自动关闭抽烟机的电源,起到一个智能控制的作用。

并能起到节能的作用,现在的社会是一个低能的社会,此产品因其耗能低,普及率高,便于用于实际生活。

本设计产用MQ-2烟雾传感器对油烟浓度进行检测,采用ADC0832对检测数据进行模数转化并将数据传输给单片机,产用AT89S52芯片进行处理,并控制风扇的转速。

采用DS18B20对环境温度进行检测,起到一个保护的作用。

采用1602液晶对温度与浓度进行显示。

关键字:LCD1602,ADC0832,DS18B20,MQ-2,AT89S52,油烟机,智能目录第一章:AT89S52单片机的认识第二章:MQ-2烟雾传感器的知识第三章:ADC0832 模数转化的设计第四章:油烟机风扇控制第五章: 1602液晶显示浓度与温度第六章:基于DS18B20温度传感器的温度测量与警报第七章:系统原理图第八章:整个系统的原程序整个系统流程图:第一章:AT89S52单片机的认识AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash 允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash ,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89S52具有以下标准功能:8k 字节Flash ,256字节RAM ,32 位I/O 口线,看门狗定时器,2个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

以下是本系统的AT89S52的最小控制系统原理图第二章:MQ-2烟雾传感器知识MQ-2是一种体电阻控制型的气敏器件,其阻值随被测气体的浓度(成分)而变化。

气敏器件又是一种“气——电”传感器件,它将被测气体的浓度(成分)信号转变成相应的电信号。

MQ-2引脚结构与常用连接电路图MQ-2有两种不同的结构分别为下图的A与B图A图B本设计产用MQ-2是图A所示的实物。

MQ-2的灵敏性特性图选择MQ-2做为本设计的原因是,MQ-2价格便宜,而且市场采购比较方便,便于使用,使用简单,只需将以上电路图连接好就能对油烟浓度进行检测,输出一个0~5V的模拟信号。

从而达到将“气”转换为“电”的目的。

MQ-2油烟检测模块电路图如下第三章:ADC0832模数转换设计ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。

由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。

学习并使用ADC0832 可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。

ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。

其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。

芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。

独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。

通过DI 数据输入端,可以轻易的实现通道功能的选择。

在本设计中我们只采用一个通道。

ADC0832的引脚功能与引脚图如下·CS_ 片选使能,低电平芯片使能。

· CH0 模拟输入通道0,或作为IN+/-使用。

· CH1 模拟输入通道1,或作为IN+/-使用。

· GND 芯片参考0 电位(地)。

· DI 数据信号输入,选择通道控制。

· DO 数据信号输出,转换数据输出。

· CLK 芯片时钟输入。

·Vcc/REF 电源输入及参考电压输入(复用)。

ADC0832的时序功能图:本设计应用电路图如下第四章:油烟机风扇控制油烟机风扇控制系统采用两个继电器控制,当单片机I/O输出的dang1与dang2间有一个电压差两个继电器就会发生不同的吸合,从而使油烟机机风扇两端的电压、电流不同,风扇的转数从而收到控制。

单片机输出与档位的关系如下Dang1 0 1Dang2 1 0档位1 档位2本设计抽烟机风扇控制电路图第五章:1602液晶显示浓度与温度1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,其中:引脚符号功能说明1 VSS 一般接地2 VDD 接电源(+5V)3 V0 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

4 RS RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

5 R/W R/W为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

6 E E(或EN)端为使能(enable)端,下降沿使能。

7 DB0 低4位三态、双向数据总线0位(最低位)8 DB1 低4位三态、双向数据总线1位9 DB2 低4位三态、双向数据总线2位10 DB3 低4位三态、双向数据总线3位11 DB4 高4位三态、双向数据总线4位12 DB5 高4位三态、双向数据总线5位13 DB6 高4位三态、双向数据总线6位14 DB7 高4位三态、双向数据总线7位(最高位)(也是busy flag)15 BLA 背光电源正极16 BLK 背光电源负极寄存器选择控制表RS R/W 操作说明0 0 写入指令寄存器(清除屏等)0 1 读busy flag(DB7),以及读取位址计数器(DB0~DB6)值1 0 写入数据寄存器(显示各字型等)1 1 从数据寄存器读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. busy flag(DB7):在此位为被清除为0时,LCD将无法再处理其他的指令要求。

1602液晶读操作时序显示的地址表如下1602液晶写操作时序本设计1602液晶与单片机的连接图如下,RK为背光灯电阻。

第六章:基于DS18B20温度传感器的温度测量与警报美国Dallas半导体公司的数字化温度传感器DS1820是世界上第一片支持"一线总线"接口的温度传感器,在其内部使用了在板(ON-B0ARD)专利技术。

全部传感元件及转换电路集成在形如一只三极管的集成电路内。

一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

现在,新一代的DS18B20体积更小、更经济、更灵活。

使你可以充分发挥“一线总线”的优点。

在传统的模拟信号远距离温度测量系统中,需要很好的解决引线误差补偿问题、多点测量切换误差问题和放大电路零点漂移误差问题等技术问题,才能够达到较高的测量精度。

另外一般监控现场的电磁环境都非常恶劣,各种干扰信号较强,模拟温度信号容易受到干扰而产生测量误差,影响测量精度。

因此,在温度测量系统中,采用抗干扰能力强的新型数字温度传感器是解决这些问题的最有效方案,新型数字温度传感器DS18B20具有体积更小、精度更高、适用电压更宽、采用一线总线、可组网等优点,在实际应用中取得了良好的测温效果。

(1)适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯(3)DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温(4)DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内(5)温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃(6)可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温(7)在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快(8)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力(9)负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

图3:DS18B20测温原理框图例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FF6FH,-55℃的数字输出为FC90H。

表2: DS18B20温度数据表DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。

图2:DS18B20内部结构图3)DS18B20温度传感器的存储器DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

(4)配置寄存器该字节各位的意义如下:表3:配置寄存器结构TM R1 R0 1 1 1 1 1低五位一直都是"1",TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。

在DS18B20出厂时该位被设置为0,用户不要去改动。

R1和R0用来设置分辨率,如下表所示:(DS18B20出厂时被设置为12位)表4:温度分辨率设置表R1 R0 分辨率温度最大转换时间0 0 9位93.75ms0 1 10位187.5ms1 0 11位375ms1 1 12位750ms 基于DS18B20的温度检测模块蜂鸣器的警报电路第七章:系统原理图图1:protel图图2:proteus图第八章:整个系统的源程序#include<reg52.h>#include<intrins.h>unsigned char code table1[]="nongdu:" ;unsigned char code table3[]="wendu:";unsigned char code cent[]={"'C"};unsigned char flag,min,time,max=33,tltemp;//unsigned int chui;sbit rs=P2^0;sbit rw=P2^1;sbit e=P2^2;sbit s=P2^7;sbit bf=P0^7;sbit DB_B20=P3^4;sbit dio=P3^6;sbit cs=P3^5;sbit clk=P3^7;//sbit dang_1=P3^3;//sbit dang_2=P3^4;void delay_us(unsigned int time) //延时10us {int i,j;for(i=0;i<time;i++)for(j=0;j<10;j++);}void jingbao(){int i;if(min>=max){for(i=0;i<50;i++){s=!s;delay_us(5);};}}void delay1ms()//延时1ms{unsigned char i,j;for(i=0;i<4;i++)for(j=0;j<33;j++);}void delaynms(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}void fengshan(unsigned char chui){if(chui>=100){P1=0xfe;delaynms(10);}elseif(chui>=30&&chui<100){P1=0x7f;delaynms(10);}else{P1=0xff;delaynms(10);}}unsigned int adc_0832(){unsigned int i,dat;cs=1; //一个转换周期开始clk=0; //为第一个脉冲作准备cs=0; //CS置0,片选有效dio=1; //DIO置1,规定的起始信号clk=1; //第一个脉冲clk=0; //第一个脉冲的下降沿,此前DIO必须是高电平dio=1; //DIO置1,通道选择信号clk=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0clk=0; //第二个脉冲下降沿dio=0; //DI置0,选择通道0clk=1; //第三个脉冲clk=0; //第三个脉冲下降沿dio=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1clk=1; //第四个脉冲for(i=0;i<8;i++) //高位在前{clk=1; //第四个脉冲clk=0;dat<<=1; //将下面储存的低位数据向右移dat|=(unsigned char)dio; //将输出数据DIO通过或运算储存在dat最低位}cs=1; //片选无效return dat; //将读书的数据返回}bit busy(void){bit result;rs=0; //根据规定,RS为低电平,RW为高电平时,可以读状态rw=1;e=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=bf; //将忙碌标志电平赋给resulte=0; //将E恢复低电平return result;}void write_com(unsigned char datee){while(busy()==1);rs=1;rw=1;_nop_();_nop_();rs=0;rw=0;e=0;_nop_();_nop_();_nop_();_nop_();e=1;P0=datee;_nop_();_nop_();_nop_();_nop_();e=0;}void write_dater(unsigned char datere){while(busy()==1);rs=1;e=0;P0=datere;_nop_();_nop_();_nop_();_nop_();e=1;_nop_();_nop_();_nop_();_nop_();e=0;}void init_1604(){delaynms(15);write_com(0x38);delaynms(2);write_com(0x38);delaynms(2);write_com(0x38);delaynms(2);write_com(0x0c);delaynms(2);write_com(0x06);delaynms(2);write_com(0x01);delaynms(2);}bit init(){ bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DB_B20= 1; //先将数据线拉高for(time=0;time<2;time++) //略微延时约6微秒;DB_B20 = 0; //再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++) //略微延时约600微秒; //以向DS18B20发出一持续480~960us的低电平复位脉冲DB_B20 = 1; //释放数据线(将数据线拉高)for(time=0;time<10;time++); //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DB_B20; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕return (flag);}unsigned char read_onebyte()//读一个字节的数据{unsigned char i=0;unsigned char dat; //储存读出的一个字节数据for (i=0;i<8;i++){DB_B20=1; // 先将数据线拉高_nop_(); //等待一个机器周期DB_B20= 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序_nop_(); //等待一个机器周期DB_B20= 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备for(time=0;time<2;time++); //延时约6us,使主机在15us内采样dat>>=1;if(DB_B20==1)dat|=0x80; //如果读到的数据是1,则将1存入datelsedat|=0x00;//如果读到的数据是0,则将0存入dat//将单片机检测到的电平信号DQ存入r[i]for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期}return(dat); //返回读出的十六进制数据}void write_onebyte(unsigned int dat)//写一个字节的数据{unsigned char i;for (i=0; i<8; i++){DB_B20=1; // 先将数据线拉高_nop_(); //等待一个机器周期DB_B20=0; //将数据线从高拉低时即启动写时序DB_B20=dat&0x01; //利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样for(time=0;time<10;time++);//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样DB_B20=1; //释放数据线for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位}for(time=0;time<4;time++); //稍作延时,给硬}void ready(){init();write_onebyte(0xcc);write_onebyte(0x44);delay_us(20);init();write_onebyte(0xcc);write_onebyte(0xbe);}/*void display_now(){unsigned char i;write_com(0x80);for(i=0;i<11;i++){write_dater(table[i]);}}*/void display_wen(){unsigned char j;write_com(0x80);for(j=0;j<7;j++){write_dater(table3[j]);}}void display_dian(){write_com(0x80+0x0a);write_dater('.');}void display_cent(){unsigned char k;write_com(0x80+0x0c);for(k=0;k<2;k++){write_dater(cent[k]);}}void display_zhengshu(unsigned int x) {unsigned int j,k,l;j=x/100;k=(x%100)/10;l=x%10;write_com(0x80+0x06);if(flag==1){write_dater('-');}else{write_dater('+');}write_dater(0x30+j);write_dater(0x30+k);write_dater(0x30+l);delay_us(100);}void display_xiaoshu(unsigned int y) {write_com(0x80+0x0b);write_dater(0x30+y);delay_us(100);}void display_yanwu1(){unsigned char i;write_com(0x80+0x40);for(i=0;i<8;i++){write_dater(table1[i]);}}void display_yanwu(unsigned int m){unsigned int i,j,k;i=m/100;k=m%10;j=(m/10)%10;write_com(0x80+0x47);write_dater(0x30+i);write_dater(0x30+j);write_dater(0x30+k);delay_us(100);}void main(){unsigned int di=0,gao=0,tn,td,z,mm;//shu是烟雾传感器检测的浓度init_1604();delay_us(1);if(init()==1)while(1);display_wen(); // 温度display_dian(); //小数点display_cent(); //单位display_yanwu1();while(1){flag=0;ready(); //读温度准备di=read_onebyte();gao=read_onebyte();if((gao&0xf8)!=0x00){flag=1;di=~di;gao=~gao;z=di+1;di=z;if(z>255)gao++;tn=gao*16+di/16;td=(di%16)*10/16;}else{tn=gao*16+di/16;td=(di%16)*10/16;}min=tn;jingbao();display_zhengshu(tn);display_xiaoshu(td);mm=adc_0832();//chui=mm;fengshan(mm);display_yanwu(mm);}}。

相关主题