仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【U04】
1.? 简介
? 本文提出了一种基于51单片机的火灾报警系统。单片机实时通过ADC0832转换芯片采集烟雾传感器的烟雾的浓度,通过单片机的数据转换处理后在液晶屏上显示,当测量空气中的烟雾浓度和温度大于设置值时,蜂鸣器发出报警,温度和烟雾的浓度报警值可以通过按键进行设置。
2.? 主要功能
a.通过LCD1602显示当前烟雾浓度、实时温度、报警阈值。
b.通过按键设置烟雾浓度和温度报警阈值。
3.? 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include <reg52.h>
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
#define uchar unsigned char
#define uint unsigned int
uchar yushe_wendu=30; //温度预设值
uchar yushe_yanwu=80; //烟雾预设值
uint wendu; //温度值全局变量
uchar yanwu; //用于读取ADC数据
//运行模式
uchar Mode=0; //=1是设置温度阀值 =2是设置烟雾阀值 =0是正常监控模式
//管脚声明
sbit Led_Reg =P1^1; //红灯
sbit Led_Yellow =P1^7; //黄灯
sbit Buzzer =P1^4; //蜂鸣器
sbit Fan =P3^3; //
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************/
//LCD管脚声明
sbit LCDRS = P2^5;
sbit LCDEN = P2^7;
sbit RW = P2^6;
sbit D0 = P0^0;
sbit D1 = P0^1;
sbit D2 = P0^2;
sbit D3 = P0^3;
sbit D4 = P0^4;
sbit D5 = P0^5;
sbit D6 = P0^6;
sbit D7 = P0^7;
//LCD延时
void LCDdelay(uint z) //该延时大约100us
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void LCD_WriteData(u8 dat)
{
if(dat&0x01)D0=1;else D0=0;
if(dat&0x02)D1=1;else D1=0;
if(dat&0x04)D2=1;else D2=0;
if(dat&0x08)D3=1;else D3=0;
if(dat&0x10)D4=1;else D4=0;
if(dat&0x20)D5=1;else D5=0;
if(dat&0x40)D6=1;else D6=0;
if(dat&0x80)D7=1;else D7=0;
}
//命令
void write_com(uchar com)
{
LCDRS=0;
LCD_WriteData(com);
RW = 0;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//数据
void write_data(uchar date)
{
LCDRS=1;
LCD_WriteData(date);
RW = 0;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
/*------------------------------------------------
选择写入位置
------------------------------------------------*/
void SelectPosition(unsigned char x,unsigned char y)
{
if (x == 0)
{
write_com(0x80 + y); //表示第一行
}
else
{
write_com(0xC0 + y); //表示第二行
}
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
SelectPosition(x,y) ;
while (*s)
{
write_data( *s);
s ++;
}
}
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{
SelectPosition(x,y) ;
if(l>=5)
write_data(0x30+s/10000%10); //万位
if(l>=4)
write_data(0x30+s/1000%10); //千位
if(l>=3)
write_data(0x30+s/100%10); //百位
if(l>=2)
write_data(0x30+s/10%10); //十位
if(l>=1)
write_data(0x30+s%10); //个位
}
4.? 仿真proteus8.6
? 本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
初始界面:
高温报警:
高浓度报警:
5.? 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6.? 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7.? 资料获取链接
百度网盘下载链接:【U04】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集
1775