基于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 字(可选)
大家共同学习进步:
点赞分享,一起学习进步!一起成长。