51单片机项目(14)——基于51单片机的烟雾报警系统

1.设计内容

本次设计的系统功能描述如下:

1.可以测量烟雾浓度并且在屏幕显示,同时显示浓度阈值。

2.可以通过按键对阈值进行加减调节。

3.浓度大于阈值时,蜂鸣器报警,风扇转动,发送报警信息(“to high”字符)到手机。

4.同时浓度是实时往手机端发送。

5.程序会把每分钟的数据存储在AT24C02里面,当触发按键时,会把以往存储的所有数据读出来,发送到手机上,每个数据对应一个地址,根据地址就可以知道它是哪个时刻采集到的数据。

原理图如下:

演示视频如下:

基于51单片机烟雾检测报警系统

2.模块介绍

1.LCD1602

        LCD1602 模块是一种常用的字符液晶显示屏模块,它可以用于显示简单的文本信息。LCD1602 模块通常由一个 16x2 的字符液晶显示屏组成,可以显示 16 列字符和 2 行字符。

以下是 LCD1602 模块的一些基本特点和使用方法:

  1. 引脚:LCD1602 模块通常具有 16 个引脚,其中包括用于数据传输和控制的引脚,以及背光控制引脚。
  2. 控制器:LCD1602 模块通常采用 HD44780 控制器,这是一种广泛使用的字符液晶显示控制器。
  3. 接口:LCD1602 模块可以通过并行接口或者串行接口(如 I2C)与单片机或者其他设备进行连接。
  4. 显示内容:LCD1602 模块可以显示各种字符、数字、符号和自定义图形。
  5. 初始化:在使用 LCD1602 模块之前,您需要通过发送特定的指令来初始化显示屏的模式和参数。
  6. 控制指令:您可以通过发送控制指令来控制 LCD1602 模块的显示内容、光标位置、显示模式等。

2.ADC0832

ADC0832 是一种 8 位分辨率的模拟到数字转换器模块,可用于将模拟电压信号转换为数字信号。ADC0832 模块具有以下特点:

1. 分辨率高:ADC0832 模块具有 8 位分辨率,可以将模拟输入信号转换为 0~255 的数字量。
2. 接口简单:ADC0832 模块的接口简单,只需要连接 VCC、GND、以及模拟输入信号(VIN+ 和 VIN-),同时还需要使用两个 IO 口控制转换开始和完成。
3. 可编程输入范围:ADC0832 模块具有可编程的输入范围,可以选择 0~5V 或者 0~10V 的电压范围。
4. 内部参考电压:ADC0832 模块内部集成了一个稳定的基准电压源,供电时可以使用内部基准电压,获取更为精准的输入电压转换结果。
5. 低功耗:ADC0832 模块工作电压范围为 4.5V~6V,低功耗,适用于各种微控制器系统。

3.蓝牙模块HC08

蓝牙模块 HC08(也称为 HC-08 或 BT05)是一种低功耗蓝牙串口透传模块,可用于在设备之间进行无线数据传输和通信。以下是 HC08 蓝牙模块的一些基本特点和功能:

1. 蓝牙版本:HC08 蓝牙模块基于蓝牙 4.0 技术,支持蓝牙经典和低能耗(BLE)模式。
2. 透传通信:HC08 蓝牙模块可用于建立串口通信连接,将串口数据通过蓝牙进行透传传输。
3. 低功耗:HC08 蓝牙模块采用低功耗设计,适用于需要长时间运行、对电源要求较高的应用场景。
4. 小型化设计:HC08 蓝牙模块的尺寸小巧,体积小,易于集成到各种设备中。
5. 通信距离:HC08 蓝牙模块的通信距离一般在 10 米左右,可根据外部环境和天线设计等因素有所变化。
6. AT 指令控制:HC08 蓝牙模块支持通过发送 AT 指令进行模块控制和参数设置,例如设置蓝牙名称、波特率等。
7. 多种工作模式:HC08 蓝牙模块支持主从模式、设备间点对点通信、多设备连接等多种工作模式。

4.电机模块

该模块自带驱动,不用外接电机驱动,供电后,直接用单片机IO控制即可

5.烟雾传感器MQ2

MQ2 是一种常用的烟雾传感器模块,它可以用来检测环境中的可燃气体和烟雾浓度。以下是 MQ2 烟雾传感器的一些基本特点和功能:

1. 灵敏度:MQ2 烟雾传感器对各种可燃气体和烟雾具有较高的灵敏度,可以检测到燃气和烟雾的存在并量化其浓度。
2. 多种气体检测:MQ2 烟雾传感器可以检测多种可燃气体,例如甲烷、丙烷、丁烷、液化气、烟雾等。
3. 模拟输出:MQ2 烟雾传感器以模拟输出方式提供检测数据,输出电压信号与检测到的气体浓度成正比。
4. 可调灵敏度:MQ2 烟雾传感器通常提供可调的灵敏度电位器,可以根据需要调整传感器的灵敏度。
5. 快速响应时间:MQ2 烟雾传感器具有快速的响应时间,可以迅速感知到环境中的可燃气体和烟雾变化。
6. 低功耗:MQ2 烟雾传感器功耗较低,适用于长时间运行和电池供电的应用。
7. 小型化设计:MQ2 烟雾传感器模块体积小巧,易于集成到各种设备中。

3.代码 

主程序main.c如下:

#include "reg52.h"
#include "LCD1602.h"
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include "adc0832.h"
#include "usart.h"
#include "i2c.h"

sbit led=P2^2;
sbit beep=P1^5;
sbit motor=P1^6;
sbit k3=P3^2;	         //阈值+ 
sbit k4=P3^3;           //阈值-
sbit k5=P1^7;           //触发信息发送

char inf[12];           //保存烟雾浓度信息
char inf2[12];          //保存烟雾阈值信息
char alarm[16]="smoke too high\r\n";


int t=0;

int addr=0;
int temp=0;

int smoke_yuzhi=100;
int smoke=0;      //烟雾浓度

int read_flag=0;     //读取信息标志位  由蓝牙控制

char h=0;
int j=0;          //用于遍历AT24C02的地址

void Int0Init()             //定时器初始化 
{  
  
   TMOD|=0X01;                  //定时器工作在方式1下,即16位定时器
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;   
   TR0=1;                     //打开定时器0
   ET0=1;                     //使能定时器0
   EA=1;                     //打开总中断
   
}

void main(void)
{  
   
   char i=0;
   
   char history[]="addr:     is     \r\n";
   LcdInit();    //LCD显示器初始化
   UsartInit();  //串口初始化
   Int0Init() ;        //定时器初始化
   
   while(1)
   {  
      smoke=read_ad(0);
      sprintf((char*)inf,"yanwu:%d\r\n",smoke);
      sprintf((char*)inf2,"yuzhi:%d\r\n",smoke_yuzhi);
       LcdWriteCom(0x01);            //清屏
       for(i=0;i<strlen(inf)-2;i++)             //-2是为了不显示\r\n
            LcdWriteData(inf[i]);
       LcdWriteCom(0x40+0x80);            //切换到第二行显示
       for(i=0;i<strlen(inf2)-2;i++)            
            LcdWriteData(inf2[i]);
      
      if(smoke>smoke_yuzhi)         //烟雾浓度大于阈值
      {
         led=!led;
         beep=0;                 //蜂鸣器低电平触发
         motor=1;                //开风扇
         Uart1Sends(alarm);      //发送报警信息到手机
      }
      else
      {
         led=1;         //灯灭
         beep=1;
         motor=0;
      }
      
      Uart1Sends(inf);
      
      if(k3==0)
      {
         delay_nms(20);
         if(k3==0)
         {
            smoke_yuzhi++;
         }
      }
      if(k4==0)
      {
         delay_nms(20);
         if(k4==0)
         {
            smoke_yuzhi--;                                 
                         
         }        
      }
      
       if(read_flag==1)        //蓝牙按钮3触发对过去24h数据的读取
      {                                
               for(j=0;j<addr;j++)
               {   
                 
                   history[5]=j/1000+0x30;
                   history[6]=(j/100)%10+0x30;
                   history[7]=(j/10)%10+0x30;      //写入地址
                   history[8]=j%10+0x30;
                   history[10]=h/10+0x30;
                   history[11]=h%10+0x30;
                   temp=At24c02Read(j);            //读取对应地址里面存储的数据
                   history[13]=temp/1000+0x30;
                   history[14]=(temp/100)%10+0x30;
                   history[15]=(temp/10)%10+0x30;
                   history[16]=temp%10+0x30;
                   Uart1Sends(history);             //发送读取到的数据
              }
                         
                 
      }
   
   
      delay_nms(1000);        //延迟1000ms
      
   }
   
}

void time0() interrupt 1		//定时器0的中断服务函数
{   
   t++;                          //t为1200时,计数满1min 
   if(t==100)                    //(若要保存24h的数据 这里t=1200 也就是相邻两个地址单元的数据间隔1分钟 调试的时候取100就可以,不然很久一次才能观察到现象)    
   {
    t=0;                         //每一分钟 保存一次浓度值   AT24C02有2K空间  足够保存24h的数据
    At24c02Write(addr,smoke);       //向对应地址里面保存浓度信息   
    addr++;             //地址自增
    if(addr%60==0)
      h++;
    if(addr==1440)      //此时存满了24h
    {
      for(j=0;j<addr;j++)
      {
         At24c02Write(j,0);      //清除数据
      }
      addr=0;           //地址清0 从头开始
      h=0;                 //时间清0
   } 
   
    }
     
  
   
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;         //重新给定时器赋值
  
	
}

//串口接收中断
void Usart() interrupt 4
{
	unsigned char receiveData;

	receiveData=SBUF;//接收到的数据
	RI = 0;//清除接收中断标志位
   if(receiveData=='A')
      smoke_yuzhi++;
   if(receiveData=='B')
      smoke_yuzhi--;
   if(receiveData=='C')
     read_flag=1;
   else
      read_flag=0;
}

4.获取源工程

需要完整工程的,可以私信我!!!

以下是基于您的需求所编写的51单片机烟雾传感器、TLC549、THD11和LCD1602做温湿度和烟雾报警器的代码。请注意,这只是基本的代码框架,您可能需要根据您的具体需求进行修改。 ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int //烟雾传感器口定义 sbit SmokeSensor = P3^4; //TLC549口定义 sbit AD_CLK = P3^5; //ADC转换时序控制引脚 sbit AD_DIN = P3^6; //ADC转换数据输入引脚 sbit AD_DOUT = P3^7; //ADC转换数据输出引脚 //温湿度传感器口定义 sbit DHT11 = P3^2; //LCD1602口定义 sbit LCD_RS = P1^0; //LCD1602命令/数据选择引脚 sbit LCD_RW = P1^1; //LCD1602读/写选择引脚 sbit LCD_EN = P1^2; //LCD1602使能引脚 sbit LCD_D4 = P1^4; //LCD1602数据引脚D4 sbit LCD_D5 = P1^5; //LCD1602数据引脚D5 sbit LCD_D6 = P1^6; //LCD1602数据引脚D6 sbit LCD_D7 = P1^7; //LCD1602数据引脚D7 //LCD1602显示位置定义 uchar dis_pos[4][2] = {{0, 0}, {0, 1}, {0, 2}, {0, 3}}; //函数声明 void init_lcd1602(); void lcd_write_cmd(uchar cmd); void lcd_write_data(uchar dat); void lcd_set_xy(uchar x, uchar y); void lcd_show_string(uchar x, uchar y, uchar *str); void delay(uint z); uint tlc549_read(uchar channel); void thd11_start(); uchar thd11_ack(); uchar thd11_read_byte(); void thd11_read(uchar *temperature, uchar *humidity); //主函数 void main() { uchar temperature, humidity; uint smoke_value, adc_value; uchar buf[16]; init_lcd1602(); //初始化LCD1602 while (1) { //读取烟雾传感器数值 smoke_value = SmokeSensor; //读取TLC549模数转换器数值 adc_value = tlc549_read(0); //读取温湿度传感器数值 thd11_read(&temperature, &humidity); //在LCD1602上显示数据 lcd_show_string(dis_pos[0][0], dis_pos[0][1], "Temp:"); sprintf(buf, "%02d ", temperature); lcd_show_string(dis_pos[0][0]+6, dis_pos[0][1], buf); lcd_show_string(dis_pos[0][0]+9, dis_pos[0][1], "C"); lcd_show_string(dis_pos[1][0], dis_pos[1][1], "Humi:"); sprintf(buf, "%02d ", humidity); lcd_show_string(dis_pos[1][0]+6, dis_pos[1][1], buf); lcd_show_string(dis_pos[1][0]+9, dis_pos[1][1], "%"); lcd_show_string(dis_pos[2][0], dis_pos[2][1], "Smoke:"); sprintf(buf, "%d", smoke_value); lcd_show_string(dis_pos[2][0]+7, dis_pos[2][1], buf); //判断烟雾数值是否超过阈值 if (smoke_value > 0) { //触发报警器 //TODO: 根据具体需求编写相应的代码 } delay(500); } } //初始化LCD1602 void init_lcd1602() { lcd_write_cmd(0x38); //显示模式设置:16×2,5×7点阵,8位数据 lcd_write_cmd(0x0c); //显示开关控制:显示开,光标关,光标闪烁关 lcd_write_cmd(0x06); //输入方式设置:光标移动,地址+1 lcd_write_cmd(0x01); //清屏 } //向LCD1602写命令 void lcd_write_cmd(uchar cmd) { LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P1 = (P1 & 0x0F) | (cmd & 0xF0); LCD_EN = 1; delay(1); LCD_EN = 0; P1 = (P1 & 0x0F) | ((cmd & 0x0F) << 4); LCD_EN = 1; delay(1); LCD_EN = 0; } //向LCD1602写数据 void lcd_write_data(uchar dat) { LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P1 = (P1 & 0x0F) | (dat & 0xF0); LCD_EN = 1; delay(1); LCD_EN = 0; P1 = (P1 & 0x0F) | ((dat & 0x0F) << 4); LCD_EN = 1; delay(1); LCD_EN = 0; } //设置LCD1602的显示位置 void lcd_set_xy(uchar x, uchar y) { uchar pos; if (y == 0) pos = 0x80 + x; else pos = 0xC0 + x; lcd_write_cmd(pos); } //在LCD1602上显示字符串 void lcd_show_string(uchar x, uchar y, uchar *str) { lcd_set_xy(x, y); while (*str != '\0') { lcd_write_data(*str++); } } //延时函数 void delay(uint z) { uint x, y; for (x = z; x > 0; x--) for (y = 110; y > 0; y--); } //TLC549模数转换器读取函数 uint tlc549_read(uchar channel) { uint res = 0; uchar i; //配置ADC转换通道 AD_CLK = 0; AD_DIN = 1; AD_CLK = 1; AD_CLK = 0; AD_DIN = 1; AD_CLK = 1; AD_CLK = 0; AD_DIN = 0; AD_CLK = 1; AD_CLK = 0; AD_DIN = channel & 0x07; AD_CLK = 1; //等待转换完成 while (AD_DOUT); //读取转换结果 for (i = 0; i < 16; i++) { AD_CLK = 0; res <<= 1; if (AD_DOUT) res |= 0x01; AD_CLK = 1; } return res; } //THD11开始信号 void thd11_start() { DHT11 = 0; delay(20); DHT11 = 1; delay(30); } //THD11响应信号 uchar thd11_ack() { uchar i = 0; while (DHT11); delay(80); if (!DHT11) { while (!DHT11); return 1; } else { return 0; } } //THD11读取一个字节数据 uchar thd11_read_byte() { uchar i, dat = 0; for (i = 0; i < 8; i++) { while (!DHT11); delay(30); if (DHT11) dat |= (1 << (7 - i)); while (DHT11); } return dat; } //读取THD11温湿度传感器数据 void thd11_read(uchar *temperature, uchar *humidity) { uchar buf[5]; uchar i; //发送开始信号 thd11_start(); //等待响应信号 if (thd11_ack() == 0) return; //读取数据 for (i = 0; i < 5; i++) buf[i] = thd11_read_byte(); //计算温度和湿度值 *humidity = buf[0]; *temperature = buf[2]; } ``` 请注意,本代码仅作为参考,具体实现方式需要根据您的具体需求进行修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

嵌入式小李(接定制)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值