使用软件Keil uVision4,proteus 8 Professions
一、研究目的
计算机控制系统通常具有精度高、速度快、存储容量大和有逻辑判断功能等特点, 因此可以实现高级复杂的控制方法,获得快速精密的控制效果。在控制系统中,为了安全生产,对于一些重要的参数或系统部位,都设有紧急状态报警系统,以便提醒操作人员注意或采取紧急措施。可燃气的泄露是种隐形杀手,严重影响了市民生命安全,如果采用可燃气浓度控制装置就能得到及时的防护,专家经过长期测试,燃气浓度控制装置能防止事故发生的有效率达95%以上。面对这种威胁,急需探究一款高效稳定的安防产品。可燃气浓度控制系统是安全使用可燃气不可或缺的一道保护。本设计中报警程序和电机控制是设计的核心,可燃气浓度控制由气体传感器探测周围环境中的低浓度可燃气体,通过信号采样电路,将探测信号用模数转化电路转换成单片机可识别的数字量,当可燃气体浓度超过控制程序设定的阈值时,报警电路发出声光报警信号。电机控制电路对可燃气进行排放。
二、硬件电路
系统的工作原理是利用可燃气传感器将可燃气浓度变换为mV级模拟电流信号,放大器把信号放大后,通过A/D转换器,变换成数字量送入单片机进行数据分析和处理,并输出信号到显示器,当检测信号达到限定的阈值时,单片机将输出信号驱动报警及浓度控制装置,维持室内可燃气浓度在安全范围。硬件电路总设计包括:气体传感器,模数转化电路,AT89C51单片机,声光报警和浓度控制电路。
三、各部分功能详细介绍
3.1、单片机的选择
单片机作为可燃气泄漏报警的核心器件,一方面他要接收来自传感器的气体浓度的模拟信号和故障检测信号,另一方面要对两种信号分别进行处理,控制后续电路的相应工作;
(1)AT89C51单片机
AT89C51是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,片内含4KB的可反复擦写的Flash只读程序存储器和128B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MSC-51指令系统,片内置通用8位(CPU和Flash存储单元)功能强大。

外接晶振时,C1和C2的值通常选择30pF左右;C1、C2对频率有微调作用,晶振或陶瓷谐振器的频率范围可在1.2~12MHz之间选择。本设计选择了6MHz,电容为1uF,为了减小寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装的与单片机引脚XTAL1和XTAL2靠近。
复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
单片机的外部复位电路有上电复位和按键均有效的复位两种,我们在涉及单片机复位时选择按键复位。

外接石英晶体(或陶瓷谐振器)及电容C1,C2接在放大器的反馈电路中并构成并联振荡电路。对外接电容C1,C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,如果使用石英晶体,推荐电容使用30 pF±10pF,而如果使用陶瓷谐振器建议选40 pF±10pF。
用户可以采用外部时钟。采用时钟的电路如图4右图所示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。由于外部时钟信号是通过一个2分频触发器作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
3.2.外围接口电路的设计
(1)数据采集单元
可燃气体经过MC101催化燃烧式传感器检测到100~1000ppmCH4将其变成5~50mV电压信号,有放大电路放大100倍,变成0.5~5V电压信号,放大倍数计算公式:



ADC0808是一种8位主次逼近式A/D转换器,其内部结构如图8-3所示,其中包括8路模拟量开关、地址锁存与译码、8位A/D转换器和三态输出锁存器。多路开关外接8路模拟量输入端,可对8路0~5V的输入模拟电压信号分时进行转换,输出具有TTL三态锁存缓冲器,可直接连到单片机数据总线上。
A/D转换器的电路综合功能如下:
(1)分辨率为8位。
(2)最大不可调误差小于±1LSB。
(3)单一+5V供电,模拟输入范围为0~5V。
(4)具有锁存控制的8路模拟开关。
(5)可锁存三态输出,输出与TTL兼容。
(6)功耗为15mW。
(7)不必进行零点和满度调整。
(8)转换速率取决于芯片的时钟频率,时钟频率范围为10~1280kHz,当时钟为300kHz时,转换速率为128us。
图 2.4 ADC0808引脚图
3.3单片机与ADC0808接口电路一个ADC开始转换时,必须加一个启动转换信号,这一启动信号要由单片机提供。通常用WR和地址译码器的输出经一定的逻辑电路进行控制。对于电平启动型ADC,当把符合要求的电平加到启动控制端上时,立即开始转换。在转换过程中,必须保持这一电平,否则会终止转换的进行。因此,在这种启动方式下,单片机的控制信号必须经过锁存器保持一段时间,本设计通过D触发器实现。A/D转换器电路如下图所示:

发光二极管通常需要十几到几十mA的驱动电流才能发光,因此,由微型机发出的显示控制信号必须经过驱动电路才能使显示器正常工作。
本次我们用的时动态显示。动态显示,就是微型计算机定时的对显示器进行扫描,在这种方法中,显示器分时工作,每次只能有一个器件显示。但由于人的视觉有暂留现象,所以,只要扫描频率足够快,仍会感觉所有的器件都在显示。此种显示的优点是使用硬件少,因而价格低,线路简单。但它占用机时长,只要微型计算机不执行显示程序,就立刻停止显示。由此可见,这种显示将使计算机的开销大。
ABCDEFG控制着每个数字中的七段发光二极管来显示每个数字,DP控制着小数点的显示,TED显示电路是由1234进行选通控制第几位数字的显示。利用LED显示电路显示空气中的可燃气浓度,来警示人们,保护人的安全。数码管的A B C D E F G D P代表一个管子里面有7个LED灯,和小数点.右边4个数值是指4 个数码管的选通。

单片机AT89C51通过引脚P3.6和P3.7控制二极管导通,蜂鸣器报警。红灯不亮表示正常状态,表示环境中的可燃气浓度处于极低状态,当气体传感器检测的浓度信号达到所限定值的要求时,红灯开始闪亮,提醒用户尽快采取安全方法措施。当可燃气浓度超过报警所要求的预设值时,红灯闪亮,报警器发出声音警示用户可燃气浓度已经很高,泄漏情况已经较为严重,用户需及时撤离现场。
图 3.7 声音灯光报警电路
3.6浓度控制电路
浓度控制电路采用ULN2003A芯片来驱动两个不同方向的排风扇,设计了pwm控制程序来根据不同的可燃气浓度控制风扇实现不同的转速。LN2003A由7组达林顿晶体管阵列和相应的电阻网络以及钳位二极管网络构成,具有同时驱动7组负载的能力,为单片双极型大功率高速集成电路。
浓度控制电路在开始运行时,风扇1缓慢地向外排出气体,保证室内可燃气浓度低。当屋内可燃气泄露,空气中的可燃气密度达到限定值1以上时,风扇1以较快的速度正转向外排出可燃气,风扇2快速反转向屋内供应洁净空气,目的是降低室内可燃气的浓度。当可燃气浓度达到限定值2以上时,风扇1正转飞速排出可燃气体,风扇2也飞速反转的向屋内供应安全气体,以保证在较快的时间内降低可燃气的浓度,保证人的生命安全。
3.8 浓度控制电路
3.7软件程序设计主程序流程图如图所示,系统先进行初始化,单片机内部实现将浓度值与预先设定好的报警值比较,判断是否报警和浓度控制风扇工作方式,分200ppm,1000ppm两个浓度等级,使用户更加便利。
图3.9 主程序流程图
四、结果
图 4.1 当浓度小于于200ppm时,表示情况正常
当可燃气浓度小于200ppm时,LED不亮,表示室内可燃气浓度在正常状态,风扇1开始缓慢的向外排出气体,保证屋内可燃气浓度低。

两级警报可提示用户不同的可燃气泄漏浓度情况,并采取相应措施,使用户安全撤离。
设计了一套合理的浓度控制系统方案,并对可燃气浓度控制系统中涉及到的各个组成部分做出了详细的分析。根据设计所规定的浓度要求,考虑到使用环境、成本等因素,选用MC101催还燃烧式气体传感器。单片机控制电路中,AT89C51单片机作为核心芯片,充分利用了其高速数据处理能力和丰富的片内外设,实现了仪器的小型化和智能化。
可燃气泄漏报警器能够对可燃气进行实时监测,当浓度超时,过设定的范围值时,发出声光报警。同时单片机将报警时的浓度通过数码管显示出来。浓度控制电路能够降低可燃气的浓度,利用双向风扇在不同的可燃气浓度以快速、飞速的转速来排出可燃气并排进纯净的空气,以保证人的安全。学会了单片机AT98C51,ADC0808,以及7SEG-MPX4-CC的引脚功能。学会了如何利用A/D转换器ADC0808将模拟量转换位数字量。如何利用AT89C51将数字量传送到数码管中,通过P1口与数码管相连,将浓度显示出来。利用程序控制着ADC0808的运行。学会了连接单片机的时钟与复位电路。在设计的基础上,可以对浓度控制器进一步功能拓展,以保障可燃性气体浓度控制功能更加完备,工作性能稳定,安全性更高。
#include <reg52.h>
#include <math.h>
#define unit unsigned int
#define uchar unsigned char
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit P37=P3^7;
sbit P36=P3^6;
uchar ad_data;
int data dis[6]={0x00,0x00,0x00,0x00,0x00,0x00};
uchar code led_segment[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
int A4,A3,A2,A1,x;
void data_pro();
void delay (k);
void display();
void main(void) //主程序
{ ad_data=0; //采样值存储单元初始化为0
while(1)
{ ST=0;
ST=1;
ST=0;
while(EOC==0)
OE=1;
ad_data=P0;
data_pro();
display();
}
}
void delay(int count) //定义延时子函数,利用循环来延时
{ int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
void display(void) //LED显示子程序
{P1=led_segment[A1]; //驱动方法
led1=0; //开第一个数码管
delay(1); //动态显示方法 进行一个很小的延时
led1=1; //关第一个数码管 这样进行动态显示
P1=led_segment[A2]; //驱动方法
led2=0; //开第二个数码管
delay(1); //动态显示方法 进行一个很小的延时
led2=1; //关第二个数码管 这样进行动态显示
P1=led_segment[A3];
led3=0;
delay(1);
led3=1;
P1=led_segment[A4];
led4=0;
delay(1);
led4=1;
if(x<=200)
{P37=0;
P36=0;}
else if(x<=500)
{P37=1;
P36=0;}
else
{P37=1;
P36=x;}
}
void data_pro(void) //数据处理子程序
{float q;
int flag;
dis[2]=ad_data/51; //取整
dis[4]=ad_data%51; //取余
dis[4]=dis[4]*10;
dis[1]=dis[4]/51; //取第一位小数
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[0]=dis[4]/51;
q=dis[2]*100+dis[1]*10+dis[0];
x=q*20/9;
A4=x%10;flag=x/10;
A3=flag%10;flag=flag/10;
A2=flag%10;flag=flag/10;
A1=flag;
}
}
uchar pluse; //占空比寄存器
void Timer2() interrupt 5
{static uchar time;
TF2=0;
if(++time==pluse) PWM=0; //达到脉宽设定值时,输出PWM低电平
else if(time==40) //PWM的频率为1khz左右
{ time=0;
PWM=1; }
}
void InitTimer2(void) //初始化函数
{RCAP2H = 0x0f ;//定时25us初值
RCAP2L = 0x07;//
ET2=1;
EA=1;
TR2=1; }
浓度控制及报警子程序:
void kongzhi(void)
{if(x<=200)
{P37=0;
P36=0;
P34=0;
InitTimer2();
pluse=10;
}
else if(x<=500)
{P37=1;
P36=0;
P34=1;
InitTimer2();
pluse=20;
}
else
{P37=1;
P36=1;
P34=1;
InitTimer2();
pluse=30;
}
}