1 设计指标及要求
11 设计指标
12 设计要求
2 系统方案分析 2
21 系统分析 2
22 器件选择 2
221 PM25传感器的选择 2
222 电机驱动的选择 3
223液晶显示器3
224AT89S52单片机4
3 系统硬件电路设计 5
31 电源电路 5
32 电机驱动控制电路 5
33单片机最小系统6
34PM25传感器电路7
35液晶显示电路7
36下载电路8
37报警电路9
4系统软件设计 10
41主程序模块10
42液晶显示LCD1602程序 11
43 PM25传感模块程序设计 12
5 系统调试 13
51 系统调试中出现的问题 13
52 系统调试后出现的结果 13
结 论 14
参 考 文 献 15
附录A 系统硬件电路图 16
附录B 实物照片17
附录C 系统完整程序代码18
教师评语29
1 设计指标及要求
1.1 设计指标设计一款简易室内空气净化器控制系统,能够实现对室内空气中的PM2.5含量实时检测并显示,根据测试结果对电机转速进行控制模拟空气净化器滤芯转动达到控制室内控制质量的目标。
1.2设计要求
(1)前选择一款合适的PM2.5传感器,在兼顾检测精度的同时尽量降低成本用于端检测电路之用;
(2)以51单片机为核心对室内空气质量进行实时检测,检测结果可通过数码管、液晶或者其他方式进行显示;
(3)检测结果与阈值进行比较,通过改变直流电机转速来模拟空气净化器滤芯的转动,达到控制室内空气质量的目的;
2系统方案分析
2.1系统分析
本次设计是根据实时监测空气中的PM2.5的浓度,通过风扇的转速减小PM2.5的浓度已达到净化空气的目的。以AT89C52单片机为核心,以实现室内空气检测仪的基本控制功能,系统功能主要包括:电源控制电路,数据采集,数模转换电路设计,液晶显示电路设计,复位电路,电机驱动控制电路,以及电平转换等电路。
图2.1 系统框图
2.2器件选择
2.2.1 PM2.5传感器的选择
PM2.5传感器选择GP2Y1010AU0F,灰尘传感器GP2Y1010AU0F灵敏度高,可以用来测量0.8微米以上的微小粒子,可用于室内环境中烟气、粉尘、花粉等浓度的检测,以检测出单位体积粒子的绝对个数,而且内置气流发生器,可以自行吸入外部空气。其内部对角安放着红外线发光二极管和光电晶体管,使得其能够探测空气中尘埃反射光,即使非常细小的如烟草烟雾颗粒也能够被检测到,该传感器输出为模拟电压,其值与粉尘浓度成正比。
图2.2 PM2.5传感器
2.2.2 电机驱动部分
电机驱动部分选择ULN2003,ULN2003是高耐压、大电流达林顿系列,由七个硅NPN达林顿管组成。 该电路的特点如下: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据,ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统
图2.3 电机驱动原理图
2.2.3液晶显示器
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
图2.4 液晶显示屏1602引脚图
2.2.4AT89S52单片机
AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。AT89S52是一个高效的微型计算机。它的应用范围广,可用于解决复杂的控制问题,且成本较低。
图2.5 单片机引脚图
3 系统硬件电路设计
3.1 电源电路
电源电路:采用三端稳压集成电路LM7805。电子产品中,常见的三端稳压集成电路
有正电压输出的lm78 ×× 系列和负电压输出的lm79××系列。顾名思义,三端IC是指这种稳压用的集成电路,只有三条引脚输出,分别是输入端、接地端和输出端。
图3.1 电源电路
3.2 电机驱动控制电路
电机驱动ULN2003的7个输入分别于单片机的P10-P14口,P36,P37口相接,8口与9口分别接GND.VCC相连。ULN2003A在各种控制电路中常用它作为驱动继电器的芯片,其芯片内部做了一个消线圈反电动势的二极管。ULN2003的输出端允许通过IC 电流200mA,饱和压降VCE 约1V左右,耐压BVCEO 约为36V。输出电流大,故可以直接驱动继电器或固体继电器(SSR)等外接控制器件,也可直接驱动低压灯泡。
图3.2 电机驱动控制电路
3.3单片机最小系统
单片机最小系统是由单片机C52,排阻,开关,电容,电阻等组成。一般来说晶振可以在1.2~12MHz之间任选,甚至可以达到24MHz或者更高,但是频率越高功耗也就越大。在本实验套件中采用的12MHz的石英晶振。和晶振并联的两个电容的大小对振荡频率有微小影响,可以起到频率微调作用。
图3.3 单片机最小系统
3.4 PM2.5传感器电路
选用GP2Y1051AU0F传感器,该传感器共有六个端口,其中1端口接VCC,3和5端口都选择接GND,第二个端口与AD转换相连,可以将接收到的数据通过A/D转换传给该传感器从而进行处理。6端口通过一个电阻与VCC连接,达到限流作用,另外需要接一个电容。4端口连接一个电阻接到单片机的P1.1口。
图3.4 PM2.5传感器电路
3.5液晶显示电路
管脚功能:
第1脚:GND为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最强,接地电源时对比度最高。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器,低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。
第6脚:EN端为使能端,高电平1时读取信息,负跳变时执行指令。
第7-14脚:D0-D7位8位双向数据端。
第15-16脚:空脚或背灯电15脚背光正极,16脚背光负极。
图3.5 液晶显示电路
3.6下载电路
下载电路的作用是将软件程序下载到单片机中,MUX232:常用的电平转换芯片,一般用于串口通信。由于电脑串口输出电压高达12V,直接与单片机连接会烧坏芯片。所以用MAX232来进行电平转换。MAX232芯片采用单+5V电源供电,仅需几个外接电容即可完成从TTL到RS232电平的转换,共两路。
图3.6 下载电路
3.7报警电路
使用I/O口定时翻转电平驱动蜂鸣器的方式来设置,只需要对波形进行分析。进行一次电平翻转就可以驱动一次蜂鸣器得到方波信号,由于PWM控制固定频率的蜂鸣器,所以可以在系统的初始化就对PWM的输出波形进行设置,当检测到外界的PM2.5大于所设定的值时,蜂鸣器发出响声进行报警。
图3.6 报警电路
4系统软件设计
本设计基于89C52单片机,初始化阶段需要对单片机进行时钟初始化,IO口初始化以及串口初始化。当程序初始化完成后,在主程序中以轮询的方式来获取PWM波信息,即确定PWM波的转速,捕捉到后判断位置,从而确定LCD屏的显示内容以及蜂鸣器是否报警。

图4.1 主程序流程图
4.2液晶显示LCD1602程序
设置16X2显示,显示5X7点阵,8位数据接口。LCD开始显示且不显示光标,光标不闪烁。写一个字符后地址指针加一,且光标加一,整屏显示不移动。然后显示清屏。接着设置指针。然后设置晶振跟波特率。
图4.2液晶模块程序流程图
4.3 PM2.5传感模块程序设计
当电源接通后,该传感模块进入初始化,当初始化完成后,通过内部的电路实时监测空气中PM2.5的含量,然后将这一模拟量传送给单片机,单片机内部的AD转换电路将其转化成单片机可以识别的数字量,单片机根据接受的数据进行相应的函数运算。

图4.3 PM2.5传感器设计流程图
5 系统调试
5.1 系统调试中出现的问题
(1)单片机程序下载不进去。
(2)蜂鸣器不报警。
(3)液晶显示屏1602的亮度太低。
(4)1602与电机共用了一个口导致1602的显示很跳跃。
(5)PM2.5传感器反应不灵敏。
5.2 系统调试后出现的结果
程序下载进单片机后,液晶屏上显示正常,通过改变外界PM2.5的值观测现象,出现的结果与程序设计的一致。当用开关调节到模式一时,电机低速运转,调节到模式三时,电机高速运转。当调节到模式二时,电机的转动与PM2.5的值有关,外界的PM2.5值超过一定数值时蜂鸣器报警。
结 论
通过这次对空气净化系统的设计,明白了它的工作原理,如何达到净化空气的效果,PM2.5的浓度对空气的污染,这次实习给我们的收获不小。我们更加深刻的体会到了理论与实践的差距所在了。发现单片机这门课程能和以前学的模电,数电,电路知识配合上,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,也要有编程语言的汇编语言或C语言的基础。
参 考 文 献[1] 《51单片机课程设计》 华中科技大学出版社 周向红编
[2] 《51单片机C语言应用开发》北京航空航天大学出版社 刘波文等编
[3] 《单片机实用系统设计与仿真经典实例》电子工业出版社 周润景等编
[4] 《新型电子通用单元电路》电子工业出版社 孙余凯等编
[5] http://wenku.baidu.com/view/1c7e5723dd36a32d737581c1.html
[6] http://wenku.baidu.com/view/89a4b74bcf84b9d528ea7ab9.html
[7] http://www.doc88.com/p-606590837883.html
附录A 系统硬件电路图

附录B 实物照片

附录C 系统完整程序代码
- #include <reg52.h> //reg52.h是针对52单片机定义的头文件,主要包括寄存器定义。
- #include <intrins.h> //要使用<intrins.h>里面的函数(像汇编一样简便)
- #include <stdio.h> //C语言标准库里的一种 文件,预处理命令。
- #include <stdlib.h> //可以调用它里面声明的函数了,比如:malloc、free、exit等常用函数
- #define uchar unsigned char //预定义 uchar 为 unsigned char 的一个代名词
- #define uint unsigned int //预定义uint为unsigned int的一个代名词
- sbit lcden=P1^5; //使能端设置
- sbit lcdrw=P1^6; //1602(写数据端)
- sbit lcdrs=P1^7; // 1602(读数据端)
- sbit rxd=P3^2; //单片机发送数据(txd接收数据)
- sbit PWM=P0^1; //PWM波输出端
- sbit IN0=P3^5; //输入口1
- sbit IN1=P3^6; //输入口2
- sbit alarm=P0^0;//蜂鸣器
- sbit k1=P1^0;//开关k1为模式一
- sbit k2=P1^1;//开关k2为模式二
- sbit k3=P1^2;//开关k3为模式三
- sbit zero=B^0; //52单片机的头文件
- sbit one=B^1;
- sbit two=B^2;
- sbit three=B^3;
- sbit four=B^4;
- sbit five=B^5;
- sbit six=B^6;
- sbit seven=B^7;
- uchar cal[7]={0};
- uchar buf;
- uchar sum;
- uint i=0;
- uint lcd;
- uchar gdp=0,gao=0,mode;
- uint Vo=0;
- uchar t=0;
- uchar code table[]="PM2.5:"; //数组
- uchar code table1[]="Mode:"; //数组
- uchar code table2[]="ug/m^3"; //数组
- uchar code table3[]=" "; //数组
- uchar code table4[]="DianJi:";
- uchar code table5[]="Check ";
- uchar code table6[]="DiSu ";
- uchar code table7[]="GaoSu";
- uchar ZS[2];
- uchar PM[5];
- void delay(uint i) //延时
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- uint k=0;
- void write_com(uchar com)//1602???写指令
- {
- lcdrs=0;
- P2=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date)//1602???写数据
- {
- lcdrs=1;
- P2=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void key() //模式选择
- {
- if(k1==0)
- {
- mode=1;
- k++;//按键可以加
- delay(200);//去斗
- ;
- if(k>20)
- {
- k=0;
- }
- else if(k<0)
- {
- k=20; //设置可加的范围
- }
- sprintf( ZS, "%d", k );
- }
- if(k2==0)
- {
- mode=2;
- k--;
- delay(200);
- if(k>20)
- {
- k=0;
- }
- else if(k<0)
- {
- k=20;
- }
- sprintf( ZS, "%d", k );
- }
- if(k3==0)
- {
- mode=3;
- }
- }
- void init()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x38);//设置16X2显示,显示5X7点阵,8位数据接口
- write_com(0x0c);//LCD开显示且不显示光标,光标不闪烁
- write_com(0x06);//写一个字符后地址指针加一,且光标加一,整屏显示不移动。
- write_com(0x01);//显示清屏
- write_com(0x80);//数据指针设置
- SCON=0x50; //SM0 SM1 SM2 REN TB8 RB8 TI RI 10位异步收发
- RCAP2H=(65536-156)/256; //晶振12M
- RCAP2L=(65536-156)%256; //PM2.5 2400bps
- TH2=RCAP2H;
- TL2=RCAP2L;
- PCON=0x00; //波特率不加倍
- T2CON=0x34; //TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2
- TMOD=0x12;//T0 8位自动重装 T1 16位定时器
- TH0=160;
- TL0=160;
- TH1=60536/256;
- TL1=60536%256;
- IT0=0; //低电平触发(边沿)
- ES=1; //允许串口中断
- ET1=1; //定时器1中断
- TR1=1; //与门开关
- PX0=0; //中断优先级低
- EX0=1; //外部中断0
- EA=1; //开启总中断
- EX0=1;
- EA=1;
- }
- void panduan() //PWM波的设置
- {
- if(Vo<10)
- {
- gao=2;
- }
- else if(Vo<20)
- {
- gao=3;
- }
- else if(Vo<30)
- {
- gao=4;
- }
- else if(Vo<40)
- {
- gao=5;
- }
- else if(Vo<50)
- {
- gao=6;
- }
- else if(Vo<80)
- {
- gao=10;
- }
- else if(Vo<150)
- {
- gao=15;
- }
- else
- {
- gao=20;
- }
- }
- void moshi()
- {
- if(mode==1)
- {
- gdp=k;
- }
- else if(mode==2)
- {
- gdp=k;
- }
- else if(mode==3)
- {
- gdp=gao;
- }
- else gdp=0;
- }
- void senddata(uchar dat) //PM2.5模式
- {
- if (dat==170)
- {
- i=0;
- cal[i]=dat;
- }
- else
- {
- i=i+1;
- cal[i]=dat;
- if(i==6)//把七位写进去
- {
- sum=cal[1]+cal[2]+cal[3]+cal[4]; //sum=Vout(H)+Vout(L)+Vref(H)+Vref(L)
- if(sum==cal[5]&&cal[6]==255) //sum与校验位相同&&最后一位是0xFF
- {
- Vo=(int)(((float)cal[1]*256+(float)cal[2])/1024*2750);//转换成整型数据
- if (Vo<10)
- lcd=1;
- else if (Vo<100)
- lcd=2;
- else if (Vo<1000)
- lcd=3;
- else
- lcd=4;
- sprintf( PM, "%d", Vo ); //输出Vo 值
-
- }
- }
- }
- }
- void main() //主函数
- {
- int i=0;
- init();
- for(i=0;i<6;i++)
- {
- write_data(table[i]);
- delay(5);
- }
- write_com(0x80+0x0a);
- for(i=0;i<6;i++)
- {
- write_data(table2[i]);
- delay(5);
- }
- PWM=0;
- alarm=0;
- IN0=0;
- IN1=1;
- mode=3;//JianCe??
- if(i==6)//把七位写进去
- {
- sum=cal[1]+cal[2]+cal[3]+cal[4]; //sum=Vout(H)+Vout(L)+Vref(H)+Vref(L)
- if(sum==cal[5]&&cal[6]==255) //sum与校验位相同&&最后一位是0xFF
- {
- Vo=(int)(((float)cal[1]*256+(float)cal[2])/1024*2750);//转换成整型数据
- if (Vo<10)
- lcd=1;
- else if (Vo<100)
- lcd=2;
- else if (Vo<1000)
- lcd=3;
- else
- lcd=4;
- sprintf( PM, "%d", Vo ); //输出Vo 值
-
- case 1: //按键控制PWM波转速加一
- write_com(0x80+0x40);
- for(i=0;i<7;i++)
- {
- write_data(table4[i]);
- delay(2);
- }
- if(k<10)
- {
- write_com(0x80+0x47);
- write_data(table3[1]);
- delay(2);
- write_com(0x80+0x48);
- for(i=0;i<1;i++)
- {
-
- write_data(ZS[i]);
- delay(200);
- }
- write_com(0x80+0x49);
- for(i=0;i<5;i++)
- {
- write_data(table6[i]);
- delay(5);
- }
- }
- else
- {
- write_com(0x80+0x47);
- for(i=0;i<2;i++)
- {
-
- write_data(ZS[i]);
- delay(200);
- }
- write_com(0x80+0x49);
- for(i=0;i<5;i++)
- {
- write_data(table7[i]);
- delay(5);
- }
- }
- break;
- case 2:
- write_com(0x80+0x40);
- for(i=0;i<7;i++)
- {
- write_data(table4[i]);
- delay(2);
- }
-
- if(k<10){
- write_com(0x80+0x47);
- write_data(table3[1]);
- delay(2);
- write_com(0x80+0x48);
- for(i=0;i<1;i++)
- {
-
- write_data(ZS[i]);
- delay(200);
- }
- write_com(0x80+0x49);
- for(i=0;i<5;i++)
- {
- write_data(table6[i]);
- delay(5);
- }
- }
- else
- {
- write_com(0x80+0x47);
- for(i=0;i<2;i++)
- {
-
- write_data(ZS[i]);
- delay(200);
- }
- write_com(0x80+0x49);
- for(i=0;i<5;i++)
- {
- write_data(table7[i]);
- delay(5);
- }
- }
- break;
- case 3:
-
- write_com(0x80+0x40);
- for(i=0;i<5;i++)
- {
- write_data(table1[i]);
- delay(2);
- }
- write_com(0x80+0x45);
- for(i=0;i<8;i++)
- {
-
- write_data(table5[i]);
- delay(2);
- }
- break;
- }
- key();
- }
- }
-
- void pwm() interrupt 3//pwm波中断服务
- {
- TH1=60536/256;
- TL1=60536%256;
- if (t==20)
- {
- t=0;
- }
- if (t<gdp)
- {
- PWM=1;
- }
- else
- PWM=0;
- t++;
- }
- void serial() interrupt 4//串行中断服务
- {
- ES=0;
- RI=0;
- buf=SBUF;
- senddata(buf);
- ES=1;
- }
复制代码
完整的Word格式文档51黑下载地址:
课程设计报告.doc
(567 KB, 下载次数: 127)