一、系统方案
本设计采用52单片机作为主控器,液晶1602显示,DS18B20采集温度,MQ2采集烟雾值,火焰传感器,按键设置报警,声光报警。
二、硬件设计
原理图如下:
三、单片机软件设计
1、首先是系统初始化
//
// 1602液晶初始化函数
//
void LcdInit()
{
LcdWriteCmd(0x38); // 162显示,57点阵,8位数据口
LcdWriteCmd(0x0C); // 开显示,不显示光标
LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移
LcdWriteCmd(0x01); // 清屏
}
2、液晶显示程序
//
// 1602液晶写命令函数,cmd就是要写入的命令
//
void LcdWriteCmd(uchar cmd)
{
LcdRs_P = 0;
LcdRw_P = 0;
LcdEn_P = 0;
P0=cmd;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
//
// 1602液晶写数据函数,dat就是要写入的数据
//
void LcdWriteData(uchar dat)
{
LcdRs_P = 1;
LcdRw_P = 0;
LcdEn_P = 0;
P0=dat;
DelayMs(2);
LcdEn_P = 1;
DelayMs(2);
LcdEn_P = 0;
}
3、按键程序
//
// 按键扫描
//
void KeyScanf()
{
if(Key1_P==0)
{
LcdGotoXY(0,13);
LcdWriteCmd(0x0f); // 显示光标,并闪烁
/*****烟雾报警值的设置******************************************
------------------------------------------------------------*/
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
while(Key1_P!=0) // 如果按键1按下,那么跳到下一级设置,否则是烟雾报警值的大小设置
{
if(Key2_P==0) // 如果减按键被按下
{
if(gMqAlarm>1) // 只有gMqAlarm大于1才能减1
gMqAlarm--;
LcdGotoXY(0,11); // 液晶光标定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改变后的报警值
LcdGotoXY(0,13);
DelayMs(250); // 延时一下
}
if(Key3_P==0) // 如果加按键被按下
{
if(gMqAlarm<100) // 只有gMqAlarm小于100才能加1
gMqAlarm++;
LcdGotoXY(0,11); // 液晶光标定位到第0行第11列
LcdPrintNum1(gMqAlarm); // 刷新改变后的报警值
LcdGotoXY(0,13);
DelayMs(250); // 延时一下
}
}
/*****温度报警值设置******************************************
------------------------------------------------------------*/
LcdGotoXY(1,13); // 光标定位
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
while(Key1_P!=0) // 如果按键1按下,则退出设置模式,否则是温度报警值的大小设置
{
if(Key2_P==0) // 如果减按键被按下
{
if(gTempAlarm>-54) // 只有gTempAlarm大于-54才能减1
gTempAlarm--;
LcdGotoXY(1,11); // 液晶光标定位到第1行第11列
LcdPrintNum2(gTempAlarm); // 刷新改变后的报警值
LcdGotoXY(1,13);
DelayMs(250); // 延时一下
}
if(Key3_P==0) // 如果加按键被按下
{
if(gTempAlarm<125) // 只有gTempAlarm小于125才能加1
gTempAlarm++;
LcdGotoXY(1,11); // 液晶光标定位到第0行第11列
LcdPrintNum2(gTempAlarm); // 刷新改变后的报警值
LcdGotoXY(1,13);
DelayMs(250); // 延时一下
}
}
/*****退出报警值的设置******************************************
------------------------------------------------------------*/
DelayMs(10); // 延时去除按键按下的抖动
while(!Key1_P); // 等待按键释放
DelayMs(10); // 延时去除按键松开的抖动
LcdWriteCmd(0x0c); // 关闭光标
}
}
4、核心算法程序
//
// 报警判断
//
void AlarmJudge(uchar dat1, int dat2)
{
/火焰报警判断/
if(Fire_P0)
{
DelayMs(50);
if(Fire_P0)
{
Led1_P=0;
}
}
else
{
Led1_P=1;
}
/*烟雾报警判断*/
if(dat1>gMqAlarm)
{
Led3_P=0;
}
else
{
Led3_P=1;
}
/*温度报警判断*/
if(dat2>gTempAlarm)
{
Led2_P=0;
}
else
{
Led2_P=1;
}
/*蜂鸣器报警判断*/
if((Led1_P==0)||(Led2_P==0)||(Led3_P==0))
Buzzer_P=0;
else
Buzzer_P=1;
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。