甲醛除味控制系统(微型计算机控制技术课程设计)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 设计内容与要求2
2 系统概述2
3 元器件选择3
3.1 气敏元件3
3.2 ADC08083
3.3 AT89C514
4 硬件电路7
4.1 晶振电路7
4.2 A/D转换电路7
电机驱动电路10
5 程序设计9
5.1 主程序9
5.2 采样程序11
5.3 PWM波产生程序11
6 仿真结果15
7 小结与体会16
参考文献17
附录〔一〕19
附录〔二〕20
甲醛除味控制系统设计
1 设计内容与要求
设计一个甲醛除味控制系统,根据甲醛浓度来控制电机转速进展抽风,降低甲醛浓度。
设计过程中要对传感器进展选型,运用单片机合理设计采集与控制系统。
2 系统概述
根据对设计要求的分析可知,可采用模块化设计方法,因此系统主要分为四个局部,它们分别是:采样模块、A/D转换模块、单片机采集控制模块、电机驱动模块。
其中传感器检测模块功能是完成对空气中甲醛浓度的采集并将其转换成电压信号;A/D转换模块主要对传感器模块输出的电压信号进展A/D转换,然后输出给单片机;单片机局部主要是对A/D转换电路输入的信号进展采集,然后根据采集量对电机进展控制;电机模块主要包括点击驱动电路以与电机,其主要作用是根据单片机输出的信号控制自身转速。
电路的大体工作流程如图1所示。
图1 系统工作流程
3 元器件选择
3.1 气敏元件
本次设计要求对甲醛气体的浓度进展测量,经查阅资料可知道应该选择的气敏元件为MQ183。
但因为仿真软Protues中无MQ183,所以用电压来模拟传感器的输出。
3.2 ADC0808
ADC0808是采样分辨率为8位的、以逐次逼近原理进展模/数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进展A/D转换。
ADC0808是ADC0809的简化版本,功能根本一样。
一般在硬件仿真时采用ADC0808进展A/D转换,实际使用时采用ADC0809进展A/D转换。
ADC0808芯片有28条引脚,采用双列直插式封装,如图2所示。
图2 ADC0808引脚图
ADC0808管脚功能如下:
1~5,26~28〔IN0~IN7〕:8路模拟量输入端。
8,14,15,17~21:8位数字量输出端。
22〔ALE〕:地址锁存允许信号,输入,高电平有效。
6〔START〕: A/D转换启动脉冲输入端,输入一个正脉冲〔至少100ns宽〕
使其启动〔脉冲上升沿使0809复位,下降沿启动A/D转换〕。
7〔EOC〕: A/D转换完毕信号,输出,当A/D转换完毕时,此端输出一个高电平〔转换期间一直为低电平〕。
9〔OE〕:数据输出允许信号,输入,高电平有效。
当A/D转换完毕时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10〔CLK〕:时钟脉冲输入端。
要求时钟频率不高于640KHZ。
12〔VREF〔+〕〕、16〔VREF〔-〕〕:参考电压输入端。
11〔Vcc〕:主电源输入端。
13〔GND〕:地。
23~25〔ADDA、ADDB、ADDC〕:3位地址输入线,用于选通8路模拟输入中的一路。
ADC0808的通道选择,如表1所示。
表1 ADC0808通道选择
3.3 AT89C51
AT89C51是一种带4K字节闪存可编程可擦除只读存储器〔FPEROM—Flash Programmable and Erasable Read Only Memory〕的低
电压、高性能CMOS 8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
AT89C51的管脚图如图3所示。
图3 AT89C51引脚图
下面对AT89C51管脚功能进展简要说明。
VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程
序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0 口作为原码输入口,当FIASH进展校验时,P0输出原码,此时P0外部必须被拉高。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1〞时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进展存取时,P2口输出地址的高八位。
在给出地址“1〞时,它利用内部上拉优势,当对外部八位地址数据存储器进展读写时,P2口输出其特殊功能存放器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL 门电流。
当P3口写入“1〞后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流〔ILL〕这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功备用能口。
:RXD串行输入口。
:TXD串行输出口。
:/INT0外部中断0 。
:/INT1外部中断1。
:T0记时器0外部输入。
:T1记时器1外部输入。
:/WR外部数据存储器写选通。
:/RD外部数据存储器读选通。
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH 地址上置0。
此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
PSEN:外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN 信号将不出现。
EA/VPP:当/EA保持低电平时,如此在此期间外部程序存储器
〔0000H-FFFFH〕,不管是否有内部程序存储器。
注意加密方式1时,/EA
将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH 编程期间,此引脚也用于施加12V编程电源〔VPP〕。
XTAL1:反向振荡放大器的输入与内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的上下电平要求的宽度。
4 硬件电路
总的硬件电路图见附录一,这里这对硬件电路的主要局部进展简单的说明。
4.1 晶振电路
晶整电路结构如图4所示。
在AT89C51内部有一个震荡电路,只要在单片机的XTAL1和XTAL2引脚外接石英晶体〔简称晶振〕,就构成了自激振荡器并在单片机内部产生时钟脉冲信号,图4中电容器C1和C2稳定频率和快速起振。
4.2 A/D转换电路
采样电路结构如图5所示。
设计中利用电阻的变化来影响电压的输入来模拟甲醛浓度的变化量,相当于一个甲醛浓度的传感器,真实的传感器中的结构并非如图5中的滑动变阻器这样,这只是一个模拟。
采样电路采用的芯片是ADC0808,输出口OUT1~OUT8接AT89C51的8个输入引脚。
ADC0808通过对输入电压的采样,将之转换为数字信号输入到下一环节,即单片机控制局部。
图4 晶振电路
图5A/D转换电路
本设计只要求控制电机向一个方向转动,故只需采用直流电机的单向驱动电
路即可满足实验要求。
驱动电路如图6所示。
如图6中所示的电机要实现调速如此是通过利用三极管对之流电机进展PWM 调速控制。
其原理是加在电动机电枢两段的电压是脉动的方波,使此波的幅值和周期不变,而改变脉冲高电平所占的宽度,即改变脉冲的占空比,就可以改变加
载电动机两端的电压平均值,从而达到调速的目的。
PWM波形如图7所示。
图6电机驱动电路
5 程序设计
程序设计局部主要分为采样程序设计、中断函数的程序、以与主程序。
5.1 主程序
主程序局部应该具有以下功能:将ADC0808转换过后的的采样值输入到单片机中,然后再根据采样值计算当周期为10ms时PWM波为高电平和低电平的时间,然后利用定时器定时输出指定占空比的PWM波。
主程序流程如图8所示。
图7 PWM波
图7 PWM波形图
图8 主程序流程图
主程序代码见附录二。
5.2 采样程序
本次设计中ADC0808采用的是直接通过单片机控制其端口的信号,从而使ADC0808分别工作在输入、A/D转换和输出三个状态。
采样程序代码如下:
void scan()
{
OE=0;
START=0;
_nop_();
_nop_();
_nop_();
START=1;
_nop_();
_nop_();
_nop_();
START=0;
delay(2);
while(EOC==0);
OE=1;
temp=P1;
delay(2);
OE=0;
t1=temp*39;
}
5.3 PWM波产生程序
PWM的产生原理是先通过单片机对得到的采样值进展计算得到高电平和低电平的持续时间,周期T为10ms,再对高电平和低电平进展延时,从而得到PWM 波,通过改变延时时间即可改变占空比。
程序代码如下:
void time1(void) interrupt 3
{
TR1=0;
t2=10000-t1;
if(P2_7==0)
{
th1=-t1/256;
tl1=-t1%256;
}
else
{
th1=-t2/256;
tl1=-t2%256;
}
TH1=th1;
TL1=tl1;
P2_7=~P2_7;
TR1=1;
}
6 仿真结果
先利用keil软件对程序进展调试,再将程序载入单片机进展仿真,可得到仿真结果的PWM波如图9所示。
当模拟电压小于等于1V时,输出低电平,电机不转。
当模拟电压大于1V时,电动机转动,PWM的占空比不同。
当模拟电压等于5V时,电动机转动,但此时输出的为高电平。
图9 仿真结果的PWM波形
7 小结与体会
此次课程设计让我受益匪浅。
与平常做题不同,课程设计对知识的应用和理解有很大的要求,能够使平常学习的知识得到系统的应用,这一点在本次课程设计中更是显现得淋漓尽致。
本次课程设计我们组所做的题目是设计一个甲醛除味控制系统。
题目不是很难,主要是围绕单片机和A/D转换芯片ADC0808,需要我们了解A/D转换芯片ADC0808的功能与用法,经过一段时间的查阅资料后,我们根本弄清了ADC0808的功能与用法,有了设计思路,并经过一段时间的努力终于完成了设计。
经过此次课程设计,我们学到了很多,对我们分析问题的能力有了很大的提高。
这些恰恰是我们以后走上工作岗位所必须的,这对我们以后的工作有很大的帮助。
参考文献
[1] 陈立周. 单片机原理与其应用.:机械工业,2006
[2] 马忠梅. 单片机的C语言应用程序设计.:航空航天大学,2007
[3] X红丽. 传感与检测技术.:国防工业,2007
[4] 于海生. 微型计算机控制原理.:清华大学,1999
#include"REG51.H"
#include"intrins.h"
#define uchar unsigned char #define uint unsigned int sbit START=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit P2_7=P2^7;
sbit P2_3=P2^3;
uchar a;
uchar temp;
uint t1,t2;
uchar th1,tl1,th0,tl0;
void delay(uint );
void scan();
init()
{
TMOD=0X11;
th1=60;
tl1=176;
TH1=th1;
TL1=tl1;
TR1=1;
ET1=1;
IT1=1;
EA=1;
}
void time1(void) interrupt 3 {
TR1=0;
t2=10000-t1;
if(P2_7==0)
{
th1=-t1/256;
tl1=-t1%256;
}
else
{
th1=-t2/256;
tl1=-t2%256;
}
TH1=th1;
TL1=tl1;
TR1=1;
}
void main(void) {
P0=0XFF;
P1=0XFF;
P2=0XFF;
P3=0XFF;
init();
while(1)
{
scan();
if(temp<=51)
{
EA=0;
P2_7=0;
P2_3=1;
}
else
{
EA=1;
}
delay(100);
}
}
void scan()
{
OE=0;
START=0;
_nop_();
_nop_();
_nop_();
START=1;
_nop_();
_nop_();
_nop_();
START=0;
delay(2);
while(EOC==0);
OE=1;
temp=P1;
delay(2);
OE=0;
t1=temp*39;
}
void delay(uint x) {
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++); }。