1.设计内容
本次设计的系统功能描述如下:
1.可以测量烟雾浓度并且在屏幕显示,同时显示浓度阈值。
2.可以通过按键对阈值进行加减调节。
3.浓度大于阈值时,蜂鸣器报警,风扇转动,发送报警信息(“to high”字符)到手机。
4.同时浓度是实时往手机端发送。
5.程序会把每分钟的数据存储在AT24C02里面,当触发按键时,会把以往存储的所有数据读出来,发送到手机上,每个数据对应一个地址,根据地址就可以知道它是哪个时刻采集到的数据。
原理图如下:
演示视频如下:
基于51单片机烟雾检测报警系统
2.模块介绍
1.LCD1602
LCD1602 模块是一种常用的字符液晶显示屏模块,它可以用于显示简单的文本信息。LCD1602 模块通常由一个 16x2 的字符液晶显示屏组成,可以显示 16 列字符和 2 行字符。
以下是 LCD1602 模块的一些基本特点和使用方法:
- 引脚:LCD1602 模块通常具有 16 个引脚,其中包括用于数据传输和控制的引脚,以及背光控制引脚。
- 控制器:LCD1602 模块通常采用 HD44780 控制器,这是一种广泛使用的字符液晶显示控制器。
- 接口:LCD1602 模块可以通过并行接口或者串行接口(如 I2C)与单片机或者其他设备进行连接。
- 显示内容:LCD1602 模块可以显示各种字符、数字、符号和自定义图形。
- 初始化:在使用 LCD1602 模块之前,您需要通过发送特定的指令来初始化显示屏的模式和参数。
- 控制指令:您可以通过发送控制指令来控制 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.获取源工程
需要完整工程的,可以私信我!!!