基于51单片机的温度烟雾火灾报警系统—LCD1602显示,ADC0809模数转换 📅 2026/7/5 14:31:45 基于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 STP3^3; sbit EOCP3^6; sbit OEP3^2; //按键 sbit Key1P2^6; //设置键 sbit Key2P2^7; //加按键 sbit Key3P3^7; //减按键 signed char w; //温度值全局变量 uint c; //温度值全局变量 //气体浓度变量 int temp0; //用于读取ADC数据 int ZERO0; char sec20; //开机初始化的时间 uchar yushe_wendu50; //温度预设值 uchar yushe_yanwu45; //烟雾预设值 //按钮模式| uchar Mode0; //1是设置温度阀值 2是设置烟雾阀值 //函数声明 extern uchar ADC0809(); extern void Key(); void delay(uint z) //延时函数大约延时z ms { uint i,j; for(i0;iz;i) for(j0;j121;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_wendu50; yushe_yanwu45; ZERO0; a_a 1; write_eeprom(); //保存数据 } } /*****延时子程序该延时主要用于ds18b20延时*****/ void Delay_DS18B20(int num) { while(num--) ; } /*****初始化DS18B20*****/ void Init_DS18B20(void) { unsigned char x0; DQ 1; //DQ复位 Delay_DS18B20(8); //稍做延时 DQ 0; //单片机将DQ拉低 Delay_DS18B20(80); //精确延时大于480us DQ 1; //拉高总线 Delay_DS18B20(14); x DQ; //稍做延时后如果x0则初始化成功x1则初始化失败 Delay_DS18B20(20); } /*****读一个字节*****/ unsigned char ReadOneChar(void) { unsigned char i0; unsigned char dat 0; for (i8;i0;i--) { DQ 0; // 给脉冲信号 dat1; DQ 1; // 给脉冲信号 if(DQ) dat|0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ void WriteOneChar(unsigned char dat) { unsigned char i0; for (i8; i0; i--) { DQ 0; DQ dat0x01; Delay_DS18B20(5); DQ 1; dat1; } } /*****读取温度*****/ unsigned int ReadTemperature(void) { unsigned char a0; unsigned char b0; unsigned int t0; float tt0; Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0x44); //启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器 aReadOneChar(); //读低8位 bReadOneChar(); //读高8位 tb; t8; tt|a; ttt*0.0625; t tt*105; //放大10倍输出并四舍五入 return(t); } // // // /*****读取温度*****/ void check_wendu(void) { cReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差 if(c0) c0; if(c999) c999; } //ADC0809读取信息 uchar ADC0809() { uchar temp_0x00; //初始化高阻太 OE0; //转化初始化 ST0; //开始转换 ST1; ST0; //外部中断等待AD转换结束 while(EOC0) //读取转换的AD值 OE1; temp_Data_ADC0809; OE0; return temp_; } void Key() { //模式选择 if(Key10) //设置按键 { delay(20); if(Key10) { FENG0; //蜂鸣器响 delay(100); FENG1; //蜂鸣器关 if(Mode3) Mode0; else { write_com(0x0f);//打开显示 无光标 光标闪烁 Mode; //模式加一 switch(Mode) //判断模式的值 { case 1: { write_com(0x807);//为1时 温度阀值的位置闪烁 break; //执行后跳出switch } case 2: { write_com(0x8015);//为2时 烟雾阀值的位置闪烁 break; } case 3: //当模式加到3时 { write_com(0x0c);//打开显示 无光标 无光标闪烁 Mode0; //模式清零 break; } } } while(Key10); } } if(Key20Mode!0) //加按键只有在模式不等于0时有效 { delay(20); if(Key20Mode!0) { FENG0; //蜂鸣器响 delay(100); FENG1; //蜂鸣器关 switch(Mode) //加按键按下时 判断当前模式 { case 1: //模式为1时 { yushe_wendu; //预设温度值阀值加1 if(yushe_wendu99) //当阀值加到大于等于99时 yushe_wendu99; //阀值固定为99 write_com(0x806); //选中阀值在1602上显示的位置 write_data(0x30yushe_wendu/10); //将阀值数据分解开送入液晶显示 write_data(0x30yushe_wendu%10); write_com(0x807); write_eeprom(); //保存数据 break; } case 2: { yushe_yanwu; //同温度阀值设置 if(yushe_yanwu255) yushe_yanwu255; write_com(0x8013); write_data(0x30yushe_yanwu/100); write_data(0x30yushe_yanwu%100/10); write_data(0x30yushe_yanwu%10); write_com(0x8015); write_eeprom(); //保存数据 break; } } while(Key20); } } if(Key30Mode!0) { delay(20); if(Key30Mode!0) { FENG0; //蜂鸣器响 delay(100); FENG1; //蜂鸣器关 switch(Mode) { case 1: { yushe_wendu--; //同上 if(yushe_wendu0) yushe_wendu0; write_com(0x806); write_data(0x30yushe_wendu/10); write_data(0x30yushe_wendu%10); write_com(0x807); write_eeprom(); //保存数据 break; } case 2: { yushe_yanwu--; //同上 if(yushe_yanwu0) yushe_yanwu0; write_com(0x8013); write_data(0x30yushe_yanwu/100); write_data(0x30yushe_yanwu%100/10); write_data(0x30yushe_yanwu%10); write_com(0x8015); write_eeprom(); //保存数据 break; } } while(Key30); } } if(Key20Key30Mode0) { delay(1000); if(Key20Key30Mode0) { FENG0; //蜂鸣器响 delay(200); FENG1; //蜂鸣器关 ZEROtemp; while(Key20Key30); write_eeprom(); //保存数据 } } }//完整资料 微信公众号木子单片机 void init() //初始化函数 { TMOD0x01; //工作方式 TL00xb0; TH00x3c; //赋初值12MHz晶振的50ms EA1; //打开中断总开关 ET01; //打开中断允许开关 TR01; //打开定时器开关 }硬件设计使用元器件单片机STC89C51注意单片机是通用的无论51还是52、无论stc还是at都一样引脚功能都一样。程序也是一样的。9*15万用板ADC080928脚IC座40脚IC座1602液晶16p母座16p排针MQ小板3P母座*23P排针*22.2k电阻*2MQ-2烟雾传感器1k电阻*25.1Ω电阻DS18B2010k电阻*3470Ω电阻10uf电解电容103排阻10k有源蜂鸣器9012三极管104独石电容30pf瓷片电容*212M晶振按键*45mmLED (红、黄) *2DC电源接口自锁开关导线若干添加图片注释不超过 140 字可选流程图设计资料01仿真图本设计使用proteus7.8和proteus8.7两个版本设计向下兼容无需担心具体如图添加图片注释不超过 140 字可选02原理图本系统原理图采用Altium Designer19设计具体如图添加图片注释不超过 140 字可选03程序本设计使用软件keil5版本编程设计资料有安装教学不用担心。具体如图添加图片注释不超过 140 字可选04设计报告一万三千字设计报告具体如下添加图片注释不超过 140 字可选05设计资料资料获取请看前面演示视频全部资料包括仿真源文件 、程序含注释、AD原理图、设计报告、流程图、实物图、元件清单、讲解视频等。具体内容如下全网最全! 操作演示请观看前面演示视频点赞分享一起学习成长。