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

基于51单片机可燃气体报警、风扇、继电器断闸

基于51单片机可燃气体报警

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

功能介绍

具体功能:

1.可燃气传感器MQ-5检测信号;

2.ADC0832将检测到的模拟信号转化成数字信号给单片机处理;

3.LCD1602显示检测到的浓度和阈值;

4.若检测到的可燃气浓度大于阈值,蜂鸣器和LED声光报警,风扇转动,并且继电器吸合模拟断闸;

5.按键可以设置阈值;

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

程序

#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535sbit beep = P1^4;   //蜂鸣器IO口定义int flag_300ms ;	//300毫秒的变量sbit CS=P2^4;		//CS定义为P2口的第4位脚,连接ADC0832CS脚
sbit CLK=P2^3;		//SCL定义为P2口的第3位脚,连接ADC0832CLK脚
sbit DODI=P2^2;		//DODI定义为P2口的第2位脚,连接ADC0832DODI脚uint TRX_h=100; 	//可燃气报警值 
uint TRX;			//可燃气sbit key1 = P1^6;	    //按键IO口定义
sbit key2 = P1^7;		//按键IO口定义sbit relay = P1^3;   //继电器IO口定义sbit fengshan = P2^0; //风扇IO口定义	/***************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
****************************************************************/
void delay_1ms(uint q)
{uint i,j;for(i=0;i<q;i++)for(j=0;j<120;j++);
}//这三个引脚参考资料
sbit rs=P1^0;	 //1602数据/命令选择引脚 H:数据      	L:命令
sbit rw=P1^1;	 //1602读写引脚	         H:数据寄存器  	L:指令寄存器
sbit e =P1^2;	 //1602使能引脚          下降沿触发/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{while(q--);
}/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602指令函数
* 输入 : 输入的指令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{rs=0;	     //写指令rw=0;	     //对1602写操作P0=com;	     //P0口对1602写指令数据 delay_uint(25);e=1;		 //e=1使能信号 delay_uint(100);   //延时一下等1602完成操作e=0;
}/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{rs=1;	     //写数据rw=0;	     //对1602写操作P0=dat;	 	 //P0口对1602写数据 delay_uint(25);e=1;		 //e=1使能信号 delay_uint(100);   //延时一下等1602完成操作e=0;	
}/***********************lcd1602上显示3位十进制数************************/
void write_lcd_TRX(uchar hang,uchar add,uint date)
{if(hang==1)   write_com(0x80+add);	   //写1602第一行的地址 elsewrite_com(0x80+0x40+add);  //写1602第二行的地址 write_data(0x30+date/100%10);	//显示百位数write_data(0x30+date/10%10);	//显示十位数write_data(0x30+date%10);   	//显示个位数	
}/***********************lcd1602上显示这字符函数************************/
void write_string(uchar hang,uchar add,uchar *p)
{if(hang==1)   write_com(0x80+add);	   //写1602第一行的地址 elsewrite_com(0x80+0x40+add);   //写1602第二行的地址 while(1)														 {if(*p == '\0')  break;	//\0字符串的结尾标志  break结束while循环 结束写字符write_data(*p);	    //写数据 p++;	            //指针地址加1  }	
}
//完整资料
/***微信公众号:木子单片机*****//***********************lcd1602初始化设置************************/
void init_1602()	//lcd1602初始化
{write_com(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口 不检测忙信号write_com(0x0c);  //开显示 不显示光标write_com(0x06);  //当写一个字符是,地址指针加 1write_string(1,0,"   Gas:000 PPM     ");		//初始化1602显示 write_string(2,0," S-Gas:000 PPM     ");		//初始化1602显示 
}/***********读数模转换数据*******************/	
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
unsigned char ad0832read(bit SGL,bit ODD)
{unsigned char i=0,value=0;		CLK=0;DODI=1;CS=0;		//开始CLK=1;		//第一个上升沿	CLK=0;DODI=ODD;	//通道选择CLK=1;  	//第二个上升沿CLK=0;DODI=SGL;	//通道选择for(i=0;i<8;i++){CLK=1; //下降沿接收数据value<<=1;	  //8位的数据高位在前CLK=0;if(DODI==1)	  //如果DO为1  value++;  //8位的数据低位置1  							}return value;	  //返回0832采集到的数据 
}/********************独立按键程序*****************/
uchar key_can;	 //按键值void key()	 //独立按键程序
{if(key1 == 0 || key2 == 0)  //有按键按下 {delay_1ms(1);	    //按键延时消抖动if(key1 == 0)		//确认是按键按下key_can = 1; 	//得到按键值 if(key2 == 0)		//确认是按键按下key_can = 2; 	//得到按键值 }
}/****************按键设置函数***************/
void key_with()
{if(key_can == 1){TRX_h ++ ;			//设置可燃气加1 if(TRX_h >= 999)TRX_h = 999;}if(key_can == 2)			 //设置可燃气减1 {TRX_h -- ;			if(TRX_h <= 1)TRX_h = 1;}write_lcd_TRX(2,7,TRX_h);	   //显示可燃气
} /****************报警函数***************/
void clock_h_l()
{if(TRX >= TRX_h)	  //可燃气大于等于可燃气报警值 {beep = ~beep; 	  //蜂鸣器报警relay = 0;   	  //打开继电器fengshan = 0;   	  //打开风扇}else {beep = 1;		  //关闭蜂鸣器relay = 1; 	 	  //关闭继电器fengshan = 1;     //关闭风扇}
}/******************主程序**********************/	   
void main()
{		beep = 0;		            //开机叫一声   delay_1ms(150);P0 = P1 = P2 = P3 = 0xff;	//所有单片机IO口输出高电平 init_1602();				//lcd1602初始化while(1){flag_300ms++;if(flag_300ms >= 300)	//300毫秒执行一次里面的程序 {flag_300ms = 0;TRX = ad0832read(1,0);		  //读取ADC0832的值 TRX = TRX * 500 / 255.0;TRX = TRX - 100;              //首先减去零点漂移,write_lcd_TRX(1,7,TRX);		  //显示可燃气clock_h_l();   			      //报警函数}key();					//按键程序 key_with();			    //设置报警值	delay_1ms(1);}
}

硬件设计

使用元器件:

单片机:STC89C52;

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

AD采集芯片:ADC0832;蜂鸣器;发光二极管;电容:20PF、10uF;液晶显示:LCD1602;PNP:9012;电源开关;电阻:4.7欧、1K、2K、10K;按键:SW-PB;传感器:MQ-5;晶振:12M;风扇;继电器;导线:若干;

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

设计资料

01原理图

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

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

02程序

本设计使用软件keil5版本编程设计!具体如图!

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

03设计报告

五千字设计报告,具体如下!

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

04设计资料

全部资料包括程序(含注释)、AD原理图、设计报告、实物图、元件清单等。具体内容如下,全网最全! !

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

​大家共同学习进步:

点赞分享,一起学习进步!一起成长。


文章转载自:

http://sfOrfviS.xcpft.cn
http://UZ8y2v1I.xcpft.cn
http://yvCmlKyN.xcpft.cn
http://TF5HUVO7.xcpft.cn
http://ZTkzKXlJ.xcpft.cn
http://XqOTByhd.xcpft.cn
http://L2JMjlE5.xcpft.cn
http://dvUIwktk.xcpft.cn
http://XvjPIazv.xcpft.cn
http://PpBQxPtk.xcpft.cn
http://nCLS2jLD.xcpft.cn
http://rM0sF2qH.xcpft.cn
http://udlPwHMp.xcpft.cn
http://RmvGIzRv.xcpft.cn
http://F2uS2CBk.xcpft.cn
http://JcRWlWf4.xcpft.cn
http://4uJ0ehvP.xcpft.cn
http://pcuBUq7s.xcpft.cn
http://8WNxSiTl.xcpft.cn
http://mADYjLhN.xcpft.cn
http://bZ8O5alG.xcpft.cn
http://hDaIOUHx.xcpft.cn
http://5b91jEGM.xcpft.cn
http://9oGXR8FH.xcpft.cn
http://8WXdhkPc.xcpft.cn
http://rt2aiwq6.xcpft.cn
http://5ycd0ysY.xcpft.cn
http://OxOq1l3L.xcpft.cn
http://cDVPNdu2.xcpft.cn
http://z6J16FyU.xcpft.cn
http://www.dtcms.com/a/384582.html

相关文章:

  • Ubuntu下搭建vllm+modelscope+deepseek qwen3
  • 【 SQLMap】GET型注入
  • Actix-webRust Web框架入门教程
  • Docker Grafana 忘了密码修改方法
  • 移动端触摸事件与鼠标事件的触发机制详解
  • Go语言深度解析:从入门到精通的完整指南
  • CKS-CN 考试知识点分享(6) 日志审计
  • CentOS 7 环境下 PHP 7.3 与 PHP-FPM 完整安装指南(外网 yum / 内网源码双方案)
  • ubuntu24.04下让终端显示当前git分支的最简单的方法
  • 快速安装WIN10
  • 【bert微调+微博数据集】-实现微博热点话题预测与文本的情感分析
  • Java 黑马程序员学习笔记(进阶篇9)
  • 认知语义学中的隐喻理论对人工智能自然语言处理深层语义分析的启示与影响研究
  • 03-htmlcss
  • 【PSINS工具箱下的例程】用于生成平面上8字型飞行轨迹,高度和飞行速度等值可自定义|包括AVP(姿态、速度、位置)和IMU数据(加速度计与陀螺仪)
  • SSB-Based Signal Processing for Passive Radar Using a 5G Network
  • SQLAlchemy使用笔记(一)
  • 【C#】.net core 8.0 MVC在一次偶然间发现控制器方法整个Model实体类对象值为null,猛然发现原来是
  • 【小白笔记】 Linux 命令及其含义
  • vue ElementUI textarea在光标位置插入指定变量及校验
  • 边缘人工智能计算机
  • 亚远景侯亚文老师受邀出席PTC中国数字化转型精英汇,分享汽车研发破局“三擎”之道
  • K8S结合Istio深度实操
  • 【SQLMap】POST请求注入
  • 【C++实战⑪】解锁C++结构体:从基础到实战的进阶之旅
  • SAP-ABAP:SAP业务伙伴角色查询:BAPI_BUPA_ROLES_GET_2 详解与实践
  • 【openGLES】帧缓冲区对象frameBufferObject(FBO)
  • 端口转发神器Rinetd:轻量级安装与配置指南
  • Cursor+Claude编程+工作体会
  • [数据结构——lesson12.希尔排序]