安防電子
返回首頁

基于DS18B20溫度傳感器和MQ2煙霧傳感器的火災報警器設計

2019-01-16

一、概述

火災自動報警系統(Fire Alarm System,簡稱FAS系統)是人們為了早期發現通報火災,并及時采取有效措施,控制和撲滅火災,而設置在建筑物中或其它場所的一種自動消防設施,是人們同火災作斗爭的有力工具。

  本設計中以溫度探頭和煙霧傳感器作為火災報警器的傳感裝置,并以LED和蜂鳴器作為示警裝置。

  二、功能

  ●高溫檢測。傳感器選用DS18B20,當環境溫度大于40℃,高溫報警指示燈亮,LCD1602第一行顯示溫度。

  ●環境煙霧濃度檢測。傳感器選用MQ2煙霧傳感器,AD0809作模數轉換傳煙霧濃度數據給單片機。當環境煙霧濃度大于50時,煙霧濃度指示燈亮,LCD1602第二行顯示煙霧濃度。

  當溫度和煙霧濃度同時過高時,蜂鳴器發出報警聲音。

  三、硬件設計

  溫度傳感器:DS18B20

  煙霧傳感器:MQ2。MQ2輸出的模擬電壓信號,使用ADC0809作模數轉換后輸入單片機。

  


  四、程序設計

  


  部分程序段:

  ○LCD1602顯示部分程序

  #define LCD_DATA P0 //lcd1602的引腳

  sbit LCD_RS = P2^0;

  sbit LCD_RW = P2^1;

  sbit LCD_EN = P2^2;

  void LCD_Init(void)

  {

  Delay20ms();

  LCD_WriteCmd(0x38); //8位機接口、雙行顯示、5×7字符點陣;

  LCD_WriteCmd(0x0c); //顯示開啟、光標不顯示也不閃爍;

  LCD_WriteCmd(0x01); //清屏;

  LCD_WriteCmd(0x06); //光標右移一位、整屏不移動;

  LCD_Goto(0,0);

  }

  void LCD_WriteDat(unsigned char lcd_dat)

  {

  unsigned char tmp;

  tmp = LCD_ReadStatus(); //讀狀態;

  while((tmp & 0x80)) //是否忙 ?

  {

  tmp = LCD_ReadStatus();

  }

  LCD_RS = 1;

  LCD_RW = 0;

  LCD_DATA = lcd_dat;

  _nop_();

  LCD_EN = 0;

  _nop_();

  _nop_();

  LCD_EN = 1;

  }

  void LCD_WriteCmd(unsigned char lcd_cmd)

  {

  unsigned char tmp;

  tmp = LCD_ReadStatus();

  while((tmp & 0x80))

  {

  tmp = LCD_ReadStatus();

  }

  LCD_RS = 0;

  LCD_RW = 0;

  LCD_DATA = lcd_cmd;

  _nop_();

  LCD_EN = 0;

  _nop_();

  _nop_();

  LCD_EN = 1;

  }

  unsigned char LCD_ReadStatus(void)

  {

  unsigned char tmp;

  #if 0

  LCD_RS = 0;

  LCD_RW = 1;

  LCD_EN = 1;

  tmp = LCD_DATA;

  LCD_EN = 0;

  #endif

  LCD_DATA = 0xff;

  LCD_RS = 0;

  LCD_RW = 1;

  LCD_EN = 0;

  _nop_();

  _nop_();

  LCD_EN = 1;

  tmp = LCD_DATA;

  return tmp;

  }

  void LCD_Goto(unsigned char x,unsigned char y)

  {

  unsigned char tmp;

  if(y) //若是第二行;

  {

  tmp = 0xc0 + x;

  LCD_WriteCmd(tmp);

  }

  else

  {

  tmp = 0x80 + x;

  LCD_WriteCmd(tmp);

  }

  }

  void LCD_Display(unsigned char row,unsigned char *str)

  {

  if(row)

  {

  LCD_Goto(0,1);

  }

  else

  {

  LCD_Goto(0,0);

  }

  while(*str != '\0')

  {

  LCD_WriteDat(*str++);

  }

  }

  ○ADC0809部分程序

  //AD0809的IO口以及變量定義

  sbit OE=P2^7;

  sbit EOC=P2^6;

  sbit START=P3^0;

  void AD0809()//0809轉換數據

  {

  START=0;_nop_();

  START=1;_nop_();

  START=0;_nop_();

  while(EOC==0);

  OE=1;_nop_();

  density=P1;_nop_();

  OE=0;

  }

  ○DS18B20部分程序

  sbit DQ=P2^3; //DS18B20數據端

  //2、DS18B2模塊

  void delay_18B20(unsigned int i)

  {

  while(i--);

  }

  //ds18b20初始化函數

  void Init_DS18B20(void)

  {

  unsigned char x=0;

  DQ = 1; //DQ復位

  delay_18B20(2); //稍做延時

  DQ = 0; //單片機將DQ拉低

  delay_18B20(60); //精確延時 大于 480us

  DQ = 1; //拉高總線

  delay_18B20(2);

  x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗

  delay_18B20(15);

  }

  //ds18b20讀一個字節

  unsigned char ReadOneChar(void)

  {

  unsigned char i=0;

  unsigned char dat = 0;

  for (i=8;i>0;i--)

  {

  DQ = 0; // 給脈沖信號

  dat>>=1;

  DQ = 1; // 給脈沖信號

  if(DQ)

  dat |=0x80;

  delay_18B20(4);

  }

  return(dat);

  }

  //ds18b20寫一個字節

  void WriteOneChar(unsigned char dat)

  {

  unsigned char i=0;

  for (i=8; i>0; i--)

  {

  DQ = 0;

  DQ = dat&0x01;

  delay_18B20(2);

  DQ = 1;

  dat>>=1;

  }

  }

  五、仿真圖

  

  圖3 火災報警器仿真圖


進入安防電子查看更多內容>>
相關視頻
  • 由內到外的智能網聯車:車聯網現狀及發展

  • 機器故障防患未然 CbM狀態監測為您助力!

  • 直播回放: 基于DLP? Pico?技術的TI桌面級DLP 3D打印、3D掃描及工業顯示應用

  • 無刷電機教程

  • ADI 應用之旅 – 工業大機器健康篇

  • 電機學 華北電力大學 李永剛

    相關電子頭條文章
萝卜大香蕉