尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

基于51单片机的温度烟雾火灾报警系统—LCD1602显示,ADC0809模数转换

基于51单片机的温度烟雾火灾报警系统—LCD1602显示,ADC0809模数转换
📅 发布时间:2026/7/5 14:46:18

基于51单片机的火灾报警系统

(仿真+程序+原理图+设计报告)

功能介绍

具体功能:

1.LCD1602液晶显示、DS18B20温度传感器、MQ-2烟雾传感器或MQ-5可燃气体传感器及ADC0809模数转换芯片;

2.实时显示当前的烟雾值和温度值;

3.温度和烟雾的报警值可以通过按键设定;

4.当前温度值超过上限时,红灯亮,蜂鸣器响;

5.当前烟雾值超过上线时,黄灯亮,蜂鸣器响;

​演示视频:

基于51单片机的温度烟雾火灾报警系统—LCD1602显示,ADC0809模数转换

添加图片注释,不超过 140 字(可选)

程序

//程序头函数 #include <reg52.h> #include <math.h> //宏定义 #define uint unsigned int #define uchar unsigned char //显示函数 #include <display.h> //显示函数display.h在工程里 也可鼠标选中左边右键open document <display.h> #include <intrins.h> #include "eeprom52.h" #define Data_ADC0809 P1 //定义P1口为Data_ADC0809 (之后的程序里Data_ADC0809即代表P1口) //管脚声明 sbit LED_wendu= P2^2; //温度报警灯 sbit LED_yanwu= P2^1; //烟雾报警灯 sbit FENG= P2^5; //蜂鸣器接口 sbit DQ = P2^0; //ds18b20的数据引脚 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; //按键 sbit Key1=P2^6; //设置键 sbit Key2=P2^7; //加按键 sbit Key3=P3^7; //减按键 signed char w; //温度值全局变量 uint c; //温度值全局变量 //气体浓度变量 int temp=0; //用于读取ADC数据 int ZERO=0; char sec=20; //开机初始化的时间 uchar yushe_wendu=50; //温度预设值 uchar yushe_yanwu=45; //烟雾预设值 //按钮模式| uchar Mode=0; //=1是设置温度阀值 =2是设置烟雾阀值 //函数声明 extern uchar ADC0809(); extern void Key(); void delay(uint z) //延时函数大约延时z ms { uint i,j; for(i=0;i<z;i++) for(j=0;j<121;j++); } /******************把数据保存到单片机内部eeprom中******************/ void write_eeprom() { SectorErase(0x2000); byte_write(0x2000, yushe_wendu); byte_write(0x2001, yushe_yanwu); byte_write(0x2002, ZERO); byte_write(0x2060, a_a); } /******************把数据从单片机内部eeprom中读出来*****************/ void read_eeprom() { yushe_wendu = byte_read(0x2000); yushe_yanwu = byte_read(0x2001); ZERO = byte_read(0x2002); a_a = byte_read(0x2060); } /**************开机自检eeprom初始化*****************/ void init_eeprom() { read_eeprom(); //先读 if(a_a != 1) //新的单片机初始单片机内问eeprom { yushe_wendu=50; yushe_yanwu=45; ZERO=0; a_a = 1; write_eeprom(); //保存数据 } } /*****延时子程序:该延时主要用于ds18b20延时*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****初始化DS18B20*****/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ = 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时,大于480us DQ = 1; //拉高总线 Delay_DS18B20(14); x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } /*****读一个字节*****/ 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_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; Delay_DS18B20(5); DQ = 1; dat>>=1; } } /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 a=ReadOneChar(); //读低8位 b=ReadOneChar(); //读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+5; //放大10倍输出并四舍五入 return(t); } //===================================================================================== //===================================================================================== //===================================================================================== /*****读取温度*****/ void check_wendu(void) { c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 if(c<0) c=0; if(c>=999) c=999; } //ADC0809读取信息 uchar ADC0809() { uchar temp_=0x00; //初始化高阻太 OE=0; //转化初始化 ST=0; //开始转换 ST=1; ST=0; //外部中断等待AD转换结束 while(EOC==0) //读取转换的AD值 OE=1; temp_=Data_ADC0809; OE=0; return temp_; } void Key() { //模式选择 if(Key1==0) //设置按键 { delay(20); if(Key1==0) { FENG=0; //蜂鸣器响 delay(100); FENG=1; //蜂鸣器关 if(Mode>=3) Mode=0; else { write_com(0x0f);//打开显示 无光标 光标闪烁 Mode++; //模式加一 switch(Mode) //判断模式的值 { case 1: { write_com(0x80+7);//为1时 温度阀值的位置闪烁 break; //执行后跳出switch } case 2: { write_com(0x80+15);//为2时 烟雾阀值的位置闪烁 break; } case 3: //当模式加到3时 { write_com(0x0c);//打开显示 无光标 无光标闪烁 Mode=0; //模式清零 break; } } } while(Key1==0); } } if(Key2==0&&Mode!=0) //加按键只有在模式不等于0时有效 { delay(20); if(Key2==0&&Mode!=0) { FENG=0; //蜂鸣器响 delay(100); FENG=1; //蜂鸣器关 switch(Mode) //加按键按下时 判断当前模式 { case 1: //模式为1时 { yushe_wendu++; //预设温度值(阀值)加1 if(yushe_wendu>=99) //当阀值加到大于等于99时 yushe_wendu=99; //阀值固定为99 write_com(0x80+6); //选中阀值在1602上显示的位置 write_data(0x30+yushe_wendu/10); //将阀值数据分解开送入液晶显示 write_data(0x30+yushe_wendu%10); write_com(0x80+7); write_eeprom(); //保存数据 break; } case 2: { yushe_yanwu++; //同温度阀值设置 if(yushe_yanwu>=255) yushe_yanwu=255; write_com(0x80+13); write_data(0x30+yushe_yanwu/100); write_data(0x30+yushe_yanwu%100/10); write_data(0x30+yushe_yanwu%10); write_com(0x80+15); write_eeprom(); //保存数据 break; } } while(Key2==0); } } if(Key3==0&&Mode!=0) { delay(20); if(Key3==0&&Mode!=0) { FENG=0; //蜂鸣器响 delay(100); FENG=1; //蜂鸣器关 switch(Mode) { case 1: { yushe_wendu--; //同上 if(yushe_wendu<=0) yushe_wendu=0; write_com(0x80+6); write_data(0x30+yushe_wendu/10); write_data(0x30+yushe_wendu%10); write_com(0x80+7); write_eeprom(); //保存数据 break; } case 2: { yushe_yanwu--; //同上 if(yushe_yanwu<=0) yushe_yanwu=0; write_com(0x80+13); write_data(0x30+yushe_yanwu/100); write_data(0x30+yushe_yanwu%100/10); write_data(0x30+yushe_yanwu%10); write_com(0x80+15); write_eeprom(); //保存数据 break; } } while(Key3==0); } } if(Key2==0&&Key3==0&&Mode==0) { delay(1000); if(Key2==0&&Key3==0&&Mode==0) { FENG=0; //蜂鸣器响 delay(200); FENG=1; //蜂鸣器关 ZERO=temp; while(Key2==0&&Key3==0); write_eeprom(); //保存数据 } } }//完整资料 微信公众号:木子单片机 void init() //初始化函数 { TMOD=0x01; //工作方式 TL0=0xb0; TH0=0x3c; //赋初值(12MHz晶振的50ms) EA=1; //打开中断总开关 ET0=1; //打开中断允许开关 TR0=1; //打开定时器开关 }

硬件设计

使用元器件:

单片机:STC89C51;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

9*15万用板;

ADC0809;28脚IC座;

40脚IC座;1602液晶;

16p母座;16p排针;

MQ小板;3P母座*2;

3P排针*2;2.2k电阻*2;

MQ-2烟雾传感器;

1k电阻*2;5.1Ω电阻;

DS18B20;10k电阻*3;

470Ω电阻;10uf电解电容;

103排阻(10k);有源蜂鸣器;

9012三极管;104独石电容;

30pf瓷片电容*2;

12M晶振;按键*4;

5mmLED (红、黄) *2;

DC电源接口;自锁开关;

导线:若干;

添加图片注释,不超过 140 字(可选)

流程图:

设计资料

01仿真图

本设计使用proteus7.8和proteus8.7两个版本设计,向下兼容,无需担心!具体如图!

添加图片注释,不超过 140 字(可选)

02原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

03程序

本设计使用软件keil5版本编程设计!资料有安装教学,不用担心。具体如图!

添加图片注释,不超过 140 字(可选)

04设计报告

一万三千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

05设计资料

资料获取请看前面演示视频,全部资料包括仿真源文件 、程序(含注释)、AD原理图、设计报告、流程图、实物图、元件清单、讲解视频等。具体内容如下,全网最全! !

操作演示请观看前面演示视频!

点赞分享一起学习成长。

相关新闻

  • AI基础0-人工智能的数学基础
  • TotalSegmentator:如何快速实现医学图像中117个解剖结构的自动分割?
  • OneNote专业迁移指南:终极免费工具助你无损转换到Markdown

最新新闻

  • Kubernetes服务安全暴露实战:Cloudflare Tunnel控制器完整指南
  • JSON.simple Maven配置终极指南:从依赖管理到发布部署的完整流程
  • SmartTube完整指南:在电视上享受无广告YouTube体验的终极方案
  • Python依赖注入的终极指南:掌握python-inject的3种绑定策略
  • ebook2audiobook:一键将电子书转换为专业有声书的终极工具
  • 【深度解析】温度之殇:一幅图揭示永磁同步电驱动系统性能热衰减的奥秘

日新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号