基于51单片机的智能火灾检测仪设计

​一、检测仪设计的要求

①对天然气体进行检测,天然气体浓度达到报警设定值时,应能报警。

②正常工作,红等不亮,蜂鸣器不报警。

③温度超过报警设定值时,应能报警。

④能显示此时温度和天然气浓度。

⑤故障报警,传感器短路,短路时应发出与天燃气体浓度超范围报警有明显区别的声,光报警。

⑥错误时,有复位功能。

  该设计以半导体气敏传感器和单片机技术为核心设计的天然气体泄漏检测报警器可实现声光报警功能,是一种结构简单、性能稳定、使用方便、价格低廉、智能化的天然气体泄漏检测报警器,具有一定的实用价值。

系统的组成结构如下:

二、设计资料

三、部分程序代码

#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

七、全套设计资料扫一扫关注公众号立即获取

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下饭的王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值