基于51单片机煤气天然气有毒气体检测系统蓝牙手机通信proteus仿真原理图PCB

功能:
0.本系统采用STC89C52作为单片机
1.系统采用LCD1602作为显示液晶,可以实时显示气体的检测情况以及其他功能设置信息
2.检测有毒气体传感器用的是MQ-4系列传感器
3.蜂鸣器和LED组成了声光报警系统
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.两路继电器分别控制气阀开关和排气扇控制,一旦检测到气体泄漏,就关闭阀门同时打开门窗
6.三个LED指示灯只是当前气体浓度的状态值

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include "lcd1602.h"
#include "delay.h"
#include "tlc0832.h"

sbit FAN        = P2^0; //接口定义
sbit BUZZER     = P2^2;
sbit RELAY      = P2^1;

sbit LED_YELLOW = P1^6;
sbit LED_GREEN  = P1^5;
sbit LED_RED    = P1^7;

unsigned char dis0[16];		 //数组暂存
unsigned char dis1[16];		 //数组暂存
unsigned char midVolt;		 //ad采集电压
unsigned char i;
bit dispFlag = 1;

void Timer0_Init(void); //函数声明
void UART_Init(void);
void UART_SendByte(unsigned char dat);
void UART_SendStr(unsigned char *s, unsigned char length);

void main(void)
{
	Timer0_Init(); //定时器0初始化
	LCD_Init();
	DelayMs(100);
	LCD_Clear();

	UART_Init();
	DelayMs(120);
	UART_SendStr("ready ok!\r\n", 10);
	LCD_DispStr(0, 0, "    Detector    ");
	while (1) //主循环
	{
		if (dispFlag == 1)
		{
			dispFlag = 0;
            midVolt = ReadADC(AIN0_GND);
            if (midVolt < 66)
            {
                midVolt = 66;
            }
			midVolt = 100 * (midVolt - 66) / (255 - 66); //读取AD检测到的值转化为百分比,减去初始值
			sprintf(dis0, "CONC. :%2d%%\r\n", (unsigned int)midVolt); //串口发送
			UART_SendStr(dis0, 12);
			sprintf(dis1, "  Percent :%02d%%   ", (unsigned int)midVolt); //显示当前检测值
			LCD_DispStr(0, 1, dis1);
		}
		
		if (midVolt < 30)
		{
			FAN = 1; //关 风扇
			BUZZER = 1;	  //关 蜂鸣器
			RELAY = 1;	  //关闭继电器打开气阀
			LED_GREEN = 0;  //开 绿灯
			LED_YELLOW = 1;  //关 黄灯
			LED_RED = 1;  //关 红灯
		}
		else if (midVolt < 50)
		{
			FAN = 1; //关 风扇
			BUZZER = 1;	  //关 蜂鸣器
			RELAY = 0;	  //打开继电器关闭气阀
			LED_GREEN = 1;  //关 绿灯
			LED_YELLOW = 0;  //开 黄灯
			LED_RED = 1;  //关 红灯
		}
		else
		{
			FAN = 0; //开 风扇
			BUZZER = 0;	  //开 蜂鸣器
			RELAY = 0;	  //打开继电器关闭气阀
			LED_GREEN = 1;  //关 绿灯
			LED_YELLOW = 1;  //关 黄灯
			LED_RED = 0;  //开 红灯
		}
		for (i = 0; i < 5; i++)
		{
			DelayMs(100);
		}
	}
}

void Timer0_Init(void)
{
	TMOD &= 0xF0;
	TMOD |= 0x01;				 //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
	TH0 = (65536 - 18432) / 256; //重新赋值 20ms
	TL0 = (65536 - 18432) % 256;
	EA = 1;	 //总中断打开
	ET0 = 1; //定时器中断打开
	TR0 = 1; //定时器开关打开
}

void Timer0_Interrupt(void) interrupt 1
{
	static unsigned char time_20ms = 0; //定时变量

	TH0 = (65536 - 18432) / 256; //重新赋值 20ms
	TL0 = (65536 - 18432) % 256;

	time_20ms++;
	if (time_20ms > 50)
	{
		dispFlag = 1;
		time_20ms = 0;
	}
}

void UART_Init(void)
{
	SCON = 0x50;  // SCON: 模式 1, 8-bit UART, 使能接收
	TMOD &= 0x0F;
	TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
	TH1 = 0xFD;	  // TH1:  重装值 9600 波特率 晶振 11.0592MHz
	TR1 = 1;	  // TR1:  timer 1 打开
	EA = 1;		  //打开总中断
	ES = 1;		  //打开串口中断
}

void UART_SendByte(unsigned char dat)
{
	unsigned char time_out;
	time_out = 0x00;
	SBUF = dat;						  //将数据放入SBUF中
	while ((!TI) && (time_out < 100)) //检测是否发送出去
	{
		time_out++;
		DelayUs10x(2);
	}		//未发送出去 进行短暂延时
	TI = 0; //清除ti标志
}

void UART_SendStr(unsigned char *s, unsigned char length)
{
	unsigned char NUM;
	NUM = 0x00;
	while (NUM < length) //发送长度对比
	{
		UART_SendByte(*s); //放松单字节数据
		s++;			  //指针++
		NUM++;			  //下一个++
	}
}

void UART_Interrupt(void) interrupt 4 //串行中断服务程序
{
	unsigned char u_buf;
	if (RI) //判断是接收中断产生
	{
		RI = 0; //标志位清零
		u_buf = SBUF;
	}
	if (TI) //如果是发送标志位,清零
		TI = 0;
}

仿真演示视频:
https://www.bilibili.com/video/BV1ve4y1C7DU/

实物演示视频:
https://www.bilibili.com/video/BV12W4y1B7Yq/

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值