当前位置: 首页 > news >正文

基于单片机火灾报警器仿真设计

一、系统方案
1、本设计采用51单片机作为主控器。
2、DS18B20采集温度值送到液晶1602显示。
3、MQ2采集烟雾值,送到液晶1602显示。
4、按键设置温度报警值,大于报警值,声光报警。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
/18b20初始化函数******/
void init_18b20()
{
bit q;
dq = 1; //把总线拿高
delay_uint(1); //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(20); //200us
dq = 1; //把总线拿高 释放总线
}
2、液晶显示程序
/********************************************************************

  • 名称 : write_com(uchar com)
  • 功能 : 1602命令函数
  • 输入 : 输入的命令值
  • 输出 : 无
    ***********************************************************************/
    void write_com(uchar com)
    {
    e=0;
    rs=0;
    rw=0;
    P0=com;
    delay_uint(3);
    e=1;
    delay_uint(25);
    e=0;
    }

/********************************************************************

  • 名称 : write_data(uchar dat)
  • 功能 : 1602写数据函数
  • 输入 : 需要写入1602的数据
  • 输出 : 无
    ***********************************************************************/
    void write_data(uchar dat)
    {
    e=0;
    rs=1;
    rw=0;
    P0=dat;
    delay_uint(3);
    e=1;
    delay_uint(25);
    e=0;
    }
    3、按键程序
    /***独立按键程序/
    uchar key_can; //按键值

void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P1 |= 0x0f;
if((P1 & 0x0f) != 0x0f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x0f)
{
case 0x0e: key_can = 1; break; //得到k1键值
case 0x0d: key_can = 2; break; //得到k2键值
case 0x0b: key_can = 3; break; //得到k3键值
case 0x08: key_can = 4; break; //得到k4键值
}
}
}
else
key_new = 1;
}

/*按键处理显示函数/
void key_with()
{
if(menu_1 == 0)
{
if(key_can == 3) //布防按键
{
flag_bufang_en = 1;
write_string(2,13," ");
}
if(key_can == 2) //取消报警 把变量清零
{
flag_alarm = 0;
shoudong = 0; //取消手动报警
flag_bufang = 0;
flag_bufang_en = 0;
flag_value = 0;
beep = 1;
flag_time = 0;
shoudong = 0; //取消手动报警

	}			if(key_can == 4) 	 //紧急报警键  手动报警{if(menu_1 == 0)shoudong = 1;}
}if(key_can == 1)	 //设置键
{menu_1 ++;if(menu_1 == 1){write_string(1,0,"    YW:000PPM     ");	write_string(2,0,"Set  W:            ");	write_zifu(2,10,0XDF);     //温度单位}if(menu_1 >= 3){menu_1 = 0;}if(menu_1 == 0)init_1602() ;  //初始化显示
}
if(menu_1 == 1)			//设置烟物报警
{if(key_can == 2){yanwu_h ++ ;	  //烟物报警值加1 if(yanwu_h >= 999)yanwu_h = 999;}if(key_can == 3){yanwu_h --;	  //烟物报警值减1 if(yanwu_h <= 1)yanwu_h = 1;}write_sfm_yanwu(1,7,yanwu_h);			   //显示烟物write_sfm2(2,8,s_temp);   //显示温度write_com(0x80+6);           //将光标移动到第2行第到3位write_com(0x0f);                  //显示光标并且闪烁}	
if(menu_1 == 2)			//设置高温报警
{if(key_can == 2){s_temp ++ ;		//高温报警值加1 if(s_temp > 99)s_temp = 99;}if(key_can == 3){s_temp -- ;		//高温报警值减1 if(s_temp <= 10)s_temp = 10 ;}write_sfm_yanwu(1,8,yanwu_h);			   //显示烟物write_sfm2(2,9,s_temp);   //显示温度write_com(0x80+0x40+6);           //将光标移动到第2行第到3位write_com(0x0f);                  //显示光标并且闪烁
}	

}

4、核心算法程序
/写18b20内的数据**/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
dq = 0; //把总线拿低写时间隙开始
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5); // 60us
dq = 1; //释放总线
dat >>= 1;
}
}

/读取18b20内的数据**/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
dq = 1; //释放总线
if(dq == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value; //返回数据
}

/读取温度的值 读出来的是小数**/
uint read_temp()
{
uint value;
uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序
init_18b20(); //初始化18b20
write_18b20(0xcc); //跳过64位ROM
write_18b20(0x44); //启动一次温度转换命令

init_18b20();		   //初始化18b20write_18b20(0xcc);	   //跳过64位ROM
write_18b20(0xbe);	   //发出读取暂存器命令low = read_18b20();	   //读温度低字节
value = read_18b20();  //读温度高字节
value <<= 8;		   //把温度的高位左移8位
value |= low;		   //把读出的温度低位放到value的低八位中
value *= 0.0625;	       //转换到温度值 
return value;		   //返回读出的温度 

}

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

http://www.lryc.cn/news/173976.html

相关文章:

  • 阿里测开面试大全(一)附答案完整版
  • STL-常用容器
  • 【owt】关闭microk8s 等无关服务
  • 【面试题】——Spring
  • 【算法思想-排序】根据另一个数组次序排序 - 力扣 1122 题
  • 毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
  • 编译原生安卓aosp源码,实现硬改以及定位
  • 找单身狗。一个数组中只有两个数字出现一次,其他数字出现了两次,编写一个函数找出这两个只出现一次的数字
  • Java数据结构技巧
  • easyui disabled 属性设置
  • 使用容器运行Nginx应用及Docker命令
  • fastapi 基本介绍+使用
  • C语言的结构体的认识
  • 只通过在vimrc文件写东西来实现或安装vim的插件
  • 云原生Kubernetes:K8S存储卷
  • “五育”并举育人体系构建的实践研究课题实施方案
  • 小样本目标检测:ECEA: Extensible Co-Existing Attention for Few-Shot Object Detection
  • Android 10.0 系统开启和关闭黑白模式主题功能实现
  • Linux-VI和VIM
  • 【送书】实现可观测性平台的技术要点是什么?
  • AUTOSAR汽车电子嵌入式编程精讲300篇-车载网络 CAN 总线报文异常检测
  • 基于MUSIC算法的二维超声波成像matlab仿真
  • Linux0.11——第三回 做好访问内存的最基础准备工作
  • unity自己对象池的使用
  • el-image 和 el-table冲突层级冲突问题
  • 6年Android开发前10月的总结,写给正在求职的安卓开发
  • ConcurrentHashMap 的并发度是什么?
  • Redis 面霸篇:从高频问题透视核心原理
  • 【100天精通Python】Day69:Python可视化_实战:导航定位中预测轨迹和实际轨迹的3D动画,示例+代码
  • MySQL中对varchar类型的列进行统计分析