IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 单片机读取MQ-7一氧化碳传感器值 -> 正文阅读

[嵌入式]单片机读取MQ-7一氧化碳传感器值

使用TM4C123G单片机和51单片机分别读取MQ-7一氧化碳传感器值并实现报警功能

一、传感器简单介绍

  1. MQ-7属于电阻式传感器,内置二氧化锡气敏材料,可有效感应一氧化碳等有效气体,其中对一氧化碳的浓度感应灵敏度最高,但也可作为广谱的可燃气体传感器进行使用。

  2. MQ-7传感器读取方式为AD读取,也可利用数字方式读取。本文采用模拟量读取。

  3. 资料显示,MQ-7传感器在使用前必须经过一分钟的加热过程(接通电源即可自动加热)

  4. MQ-7内部原件构造如图:内部构造

  5. 输出电压-浓度图像如图所示:
    浓度-电压图

二、传感器的连接

TM4C:

单片机管脚传感器管脚
VBUSVCC
GNDGND
PE3AO
N/ADO

普中科技51单片机:

单片机管脚传感器管脚
VCCVCC
GNDGND
IN3AO
N/ADO

三、TM4C单片机程序模块分析

ADC模块初始化

void ADC_Init(void)//ADC初始化配置   
{    
  SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);// Enable the ADC0 module.
  while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0));// Wait for the ADC0 module to be ready.	
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);    //Enable GPIO port E
  GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);		//Enable PE3
  ADCSequenceConfigure(ADC0_BASE,0,ADC_TRIGGER_PROCESSOR, 0); 
	ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0);
	ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH4	|ADC_CTL_END | ADC_CTL_IE);
	ADCIntClear(ADC0_BASE, 0);
	ADCSequenceEnable(ADC0_BASE, 0);    
  ADCIntEnable(ADC0_BASE, 0); 
	ADCIntEnableEx(ADC0_BASE,ADC_INT_SS0);
	IntEnable(INT_ADC0SS0);
	ADCIntRegister(ADC0_BASE,0,ADC0IntHandler);
	IntPrioritySet(INT_ADC0SS0, USER_INT7);
}//采用中断式ADC采集

串口0初始化(printf函数用)

void ConfigureUART0(void)//串口0初始化
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIO外设		
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART外设
  GPIOPinConfigure(GPIO_PA0_U0RX);//GPIO模式配置 PA0--RX PA1--TX 
  GPIOPinConfigure(GPIO_PA1_U0TX);
  GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);//GPIO的UART模式配置
  UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
  UARTStdioConfig(0, 115200, 16000000);
}

滴答定时器初始化(加热过程计时用)

void initTime(void) 
{
  	SysTickPeriodSet(SysCtlClockGet() / 500UL);//2ms
	SysTickIntRegister(SycTickHandler);
  	SysTickIntEnable();
  	SysTickEnable();
	systick_period=SysTickPeriodGet();
}

ADC中断

void ADC0IntHandler(void)
{
	Test_Period(&ADC_Delta);
	ADCIntClear(ADC0_BASE, 0);// 清除ADC中断标志。
	ADCSequenceDataGet(ADC0_BASE, 0, adc_value);// 读取ADC值
	value=(float)adc_value[0]*3.3/4096*100;//扩大100倍精度
	if(queuei==99)
	{
		dataSum+=value;
		printf("%f\n",dataSum/100);//取平均稳定数据
		if((dataSum/100)<=2500) printf("CO concentration safe\n");//以低于50ppm为安全值(由上文Vl-PPM图粗略看出)
		//网上写的一般警告值是35ppm,但是我们的传感器没有这么精准
		else printf("Danger, open your window and evacuate\n");
		queuei=0;
		dataSum=0;
	}
	else 
	{
		dataSum+=value;
		queuei++;
	}
}

主函数

#include <stdint.h>
#include <stdbool.h>
#include "hw_types.h"
#include "interrupt.h"
#include "sysctl.h"
#include "u_DMA.h"
#include "UART0.h"
#include "usart.h"
#include "Headfile.h"
int heat_flag=0;
int heattimeCounter=0;
int main()
{
	HardWave_Init();
	printf("初始化完成");
	while(1)
	{
		if(heat_flag!=2)
		{
			if(heat_flag==0)
			{
				printf("Initiate heating process ,please wait for 1 minute\n");
				heat_flag=1;
				delay_ms(1000);
				heattimeCounter++;
			}
			else if(heat_flag==1&&heattimeCounter!=60)
			{
				printf("time remains:%d\n",60-heattimeCounter);
				delay_ms(1000);
				heattimeCounter++;
			}
			else
			{
				heat_flag=2;
				printf("Heating process complete\n");
			}
		}
		else 
		{
			ADC_Sample_Trigger();
			delay_ms(1);
		}
	}
}

四、51单片机程序模块分析

XPT2046驱动(读取AD值,SPI协议)

#include"XPT2046.h"
/****************************************************************************
*函数名:TSPI_Start
*输  入:无
*输  出:无
*功  能:初始化触摸SPI
****************************************************************************/

void SPI_Start(void)
{
	CLK = 0;
	CS  = 1;
	DIN = 1;
	CLK = 1;
	CS  = 0;		
}
/****************************************************************************
*函数名:SPI_Write
*输  入:dat:写入数据
*输  出:无
*功  能:使用SPI写入数据
****************************************************************************/

void SPI_Write(uchar dat)
{
	uchar i;
	CLK = 0;
	for(i=0; i<8; i++)
	{
		DIN = dat >> 7;  	//放置最高位
		dat <<= 1;
		CLK = 0;			//上升沿放置数据

		CLK = 1;

	}
}
/****************************************************************************
*函数名:SPI_Read
*输  入:无
*输  出:dat:读取 到的数据
*功  能:使用SPI读取数据
****************************************************************************/

uint SPI_Read(void)
{
	uint i, dat=0;
	CLK = 0;
	for(i=0; i<12; i++)		//接收12位数据
	{
		dat <<= 1;

		CLK = 1;
		CLK = 0;

		dat |= DOUT;

	}
	return dat;	
}

/****************************************************************************
*函数名:Read_AD_Data
*输  入:cmd:读取的X或者Y
*输  出:endValue:最终信号处理后返回的值
*功  能:读取触摸数据
****************************************************************************/
uint Read_AD_Data(uchar cmd)
{
	uchar i;
	uint AD_Value;
	CLK = 0;
	CS  = 0;
	SPI_Write(cmd);
	for(i=6; i>0; i--); 	//延时等待转换结果
	CLK = 1;	  //发送一个时钟周期,清除BUSY
	_nop_();
	_nop_();
	CLK = 0;
	_nop_();
	_nop_();
	AD_Value=SPI_Read();
	CS = 1;
	return AD_Value;	
}

主函数

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include"XPT2046.h"	

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit LED=P2^0;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 disp[4];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函数名         :datapros()
* 函数功能		 :数据处理函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void datapros()
{
	u16 temp;
	static u8 i;
	if(i==50)
	{
		i=0;
		temp = Read_AD_Data(0xE4);		//   AIN3 外部输入
	}
	i++;
	disp[0]=smgduan[temp/1000];//千位
	disp[1]=smgduan[temp%1000/100];//百位
	disp[2]=smgduan[temp%1000%100/10];//个位
	disp[3]=smgduan[temp%1000%100%10];		
	if(temp>=2500)			//报警功能:闪烁灯
	{
		LED=1;
		delay(1000);
		LED=0;
	}
}


/*******************************************************************************
* 函数名         :DigDisplay()
* 函数功能		 :数码管显示函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void DigDisplay()
{
	u8 i;
	for(i=0;i<4;i++)
	{
		switch(i)	 //位选,选择点亮的数码管,
		{
			case(0):
				LSA=1;LSB=1;LSC=1; break;//显示第0位
			case(1):
				LSA=0;LSB=1;LSC=1; break;//显示第1位
			case(2):
				LSA=1;LSB=0;LSC=1; break;//显示第2位
			case(3):
				LSA=0;LSB=0;LSC=1; break;//显示第3位	
		}
		P0=disp[i];//发送数据
		delay(100); //间隔一段时间扫描	
		P0=0x00;//消隐
	}		
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	while(1)
	{
		datapros();	 //数据处理函数
		DigDisplay();//数码管显示函数		
	}		
}

五、程序效果

TM4C123G

1、加热启动过程
加热驱动
2、测量电压Vl值

TM4C

利用打火机模拟可燃气体源
利用打火机模拟可燃气体源
SerialChart绘制曲线
SerialChart绘制曲线

51单片机

51单片机

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:07:51  更:2021-07-14 23:08:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:27:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码