一、检测仪设计的要求
①对天然气体进行检测,天然气体浓度达到报警设定值时,应能报警。
②正常工作,红等不亮,蜂鸣器不报警。
③温度超过报警设定值时,应能报警。
④能显示此时温度和天然气浓度。
⑤故障报警,传感器短路,短路时应发出与天燃气体浓度超范围报警有明显区别的声,光报警。
⑥错误时,有复位功能。
该设计以半导体气敏传感器和单片机技术为核心设计的天然气体泄漏检测报警器可实现声光报警功能,是一种结构简单、性能稳定、使用方便、价格低廉、智能化的天然气体泄漏检测报警器,具有一定的实用价值。
系统的组成结构如下:
二、设计资料
三、部分程序代码
#include <reg52.h>
#include "eepom52.h"
#define uchar unsigned char
#define uint unsigned int
#include <intrins.h>
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //断码
//数码管位选定义
uchar code smg_we[]={0x7f,0xbf,0xdf,0xef};
//uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7};
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
uchar smg_i = 3; //显示数码管的个位数
sbit SCL=P3^4; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P3^3; //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P3^2; //CS定义为P1口的第4位脚,连接ADC0832CS脚
sbit dq = P3^5; //18b20 IO口的定义
sbit beep = P3^6; //蜂鸣器IO口定义
uint temperature,s_temp ; //温度的变量
uchar dengji,s_dengji; //烟物等级
uchar shoudong; //手动报警键
uint huoyan;
bit flag_300ms ;
uchar key_can; //按键值的变量
uchar menu_1; //菜单设计的变量
bit flag_lj_en; //按键连加使能
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
uchar key_time,flag_value; //用做连加的中间变量
bit key_500ms ;
uchar flag_clock;
uchar zd_break_en,zd_break_value; //自动退出设置界面
uchar a_a;
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************小延时函数*****************************/
void delay_uint(uint q)
{
while(q--);
}
/******************把数据保存到单片机内部eepom中******************/
void write_eepom()
{
SectorErase(0x2000);
byte_write(0x2000, s_temp);
byte_write(0x2001, s_dengji);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eepom中读出来*****************/
void read_eepom()
{
s_temp = byte_read(0x2000);
s_dengji = byte_read(0x2001);
a_a = byte_read(0x2060);
}
/**************开机自检eepom初始化*****************/
void init_eepom()
{
read_eepom(); //先读
if(a_a != 1) //新的单片机初始单片机内问EEPOM
{
s_temp = 50;
s_dengji = 5;
a_a = 1;
write_eepom();
}
}
/***********************18b20初始化函数*****************************/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1); //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(20); //200us
dq = 1; //把总线拿高 释放总线
}
/*************写18b20内的数据***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
dq = 0; //把总线拿低写时间隙开始
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5); // 60us
dq = 1; //释放总线
dat >>= 1;
}
}
/*************读取18b20内的数据***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1; //释放总线
if(dq == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value; //返回数据
}
/*************读取温度的值 读出来的是小数***************/
uint read_temp()
{
uint value;
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0x44); //启动一次温度转换命令
delay_uint(50); //500us
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0xbe); //发出读取暂存器命令
EA = 0;
low = read_18b20(); //读温度低字节
value = read_18b20(); //读温度高字节
EA = 1;
value <<= 8; //把温度的高位左移8位
value |= low; //把读出的温度低位放到value的低八位中
value *= 0.0625; //转换到温度值
return value; //返回读出的温度
}
四、protues仿真
五、AD原理图
六、PCB
七、全套设计资料扫一扫关注公众号立即获取