系统软件采用MCS51汇编语言编制,包括系统主程序和中断服务子程序、误
差自动校准子程序等。主程序流程图如下
开始 程序初始化 A/D转换 数据处理 是否超过报警值 报警锁定, 等待复位 浓度显示 图 8 主程序流程图
6 系统调试与实现
8
系统同调试仿真阶段,理论上是用A/D转换器把气敏传感器检测到的电信号输送入单片机,现在用按键电路来代替。按键电路可以设定数值来代表需要的煤气浓度。数码管显示采用动态显示方式,结合按键电路的输入,在数码管上显示需要的煤气浓度数值。实现电路如图9
图9 系统总电路
分别对P1.0、P1.1、P1.2端口编程,实现分别控制数码管的个位、十位、百位的+1操作,关键程序:
GO:JNB GSET,S1 S1:LCALL,DELAY JB GSET,A1 INC SETG MOV A,SETG CJNE A,#10,J0 MOV SETG,#0 INC SETS
9
MOV A,SETS CJNE A,#10,J1 MOV SETS,#0 LJMP K2 J0:JB GSET,GO LCALL DISPLAY SJMP J0
以上程序是对个位数字的控制,十位,百位也是同样的方法。 关键显示子程序: DISPLAY:MOV A,SETG CLR P2.0 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P2.0
以上是对个位的赋值控制,对十位,百位的控制方法一样。
系统主程序:
#include
sbit adrd=P3^7; //IO口定义 sbit adwr=P3^6; sbit csad=P3^5; sbit wei_g=P2^0; sbit wei_s=P2^1; sbit bjq=P1^3;
unsigned char j,k,adval; void delay(unsigned char i) {
//延时程序
10
for(j=I;j>0;j--) for(k=125;k>0;k--); }
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; void display(uchar sh_c,uchar g_c)
//显示程序
{
wei_g=1; wei_s=0; P0=table[g_c]; delay(5); wei_g=0; wei_s=1; P0=table[sh_c]; delay(5); }
void main() // 主程序{
uchar a,A1,A2; while(1) {
csad=0; // adwr=0;
_nop_(); adwr=1;
csad=1; // delay(10);
for(a=20;a>0;a--) { display(A1,A2);
选通ADCS 关闭ADCS 11
} //送去显示各位。
P1=0xff; //读取P1口之前先给其写全1 csad=0; //选通ADCS adrd=0; //AD读使能 adval=P1; adrd=1;
csad=1; //关闭ADCS adwr=0;
adval=adval/0.25; //数据处理
if(adval>51) //判断报警浓度大于20%报警 {
delay(20); if(adval>51) bjq=1; while(1)
; //报警控制,等待复位 } A1=adval/10; A2=adval; }; }
当煤气浓度达到单片机内程序所设置的限定值(20%)时,声音系统中的喇叭会发出警报的声音;当煤气浓度下降到限定值一下时,声音系统停止报警,等待下一次报警程序的执行。
结论:基于单片机的煤气泄漏及报警系统的设计,采用单片机技术,实现了系统的多样化和智能化。本系统设计电路简单,稳定性高,容易实现,成本低廉。本系统主要的功能:(1)对空气中煤气浓度的检测;(2)煤气浓度达到一定值时报警。
参考文献
//分出十,和个位
//AD数据读取赋给P1口
12