使用TM4C123G单片机和51单片机分别读取MQ-7一氧化碳传感器值并实现报警功能
一、传感器简单介绍
-
MQ-7属于电阻式传感器,内置二氧化锡气敏材料,可有效感应一氧化碳等有效气体,其中对一氧化碳的浓度感应灵敏度最高,但也可作为广谱的可燃气体传感器进行使用。 -
MQ-7传感器读取方式为AD读取,也可利用数字方式读取。本文采用模拟量读取。 -
资料显示,MQ-7传感器在使用前必须经过一分钟的加热过程(接通电源即可自动加热) -
MQ-7内部原件构造如图: -
输出电压-浓度图像如图所示:
二、传感器的连接
TM4C:
单片机管脚 | 传感器管脚 |
---|
VBUS | VCC | GND | GND | PE3 | AO | N/A | DO |
普中科技51单片机:
单片机管脚 | 传感器管脚 |
---|
VCC | VCC | GND | GND | IN3 | AO | N/A | DO |
三、TM4C单片机程序模块分析
ADC模块初始化
void ADC_Init(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_ADC0));
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
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);
}
串口0初始化(printf函数用)
void ConfigureUART0(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);
}
滴答定时器初始化(加热过程计时用)
void initTime(void)
{
SysTickPeriodSet(SysCtlClockGet() / 500UL);
SysTickIntRegister(SycTickHandler);
SysTickIntEnable();
SysTickEnable();
systick_period=SysTickPeriodGet();
}
ADC中断
void ADC0IntHandler(void)
{
Test_Period(&ADC_Delta);
ADCIntClear(ADC0_BASE, 0);
ADCSequenceDataGet(ADC0_BASE, 0, adc_value);
value=(float)adc_value[0]*3.3/4096*100;
if(queuei==99)
{
dataSum+=value;
printf("%f\n",dataSum/100);
if((dataSum/100)<=2500) printf("CO concentration safe\n");
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"
void SPI_Start(void)
{
CLK = 0;
CS = 1;
DIN = 1;
CLK = 1;
CS = 0;
}
void SPI_Write(uchar dat)
{
uchar i;
CLK = 0;
for(i=0; i<8; i++)
{
DIN = dat >> 7;
dat <<= 1;
CLK = 0;
CLK = 1;
}
}
uint SPI_Read(void)
{
uint i, dat=0;
CLK = 0;
for(i=0; i<12; i++)
{
dat <<= 1;
CLK = 1;
CLK = 0;
dat |= DOUT;
}
return dat;
}
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;
_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};
void delay(u16 i)
{
while(i--);
}
void datapros()
{
u16 temp;
static u8 i;
if(i==50)
{
i=0;
temp = Read_AD_Data(0xE4);
}
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;
}
}
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)
{
case(0):
LSA=1;LSB=1;LSC=1; break;
case(1):
LSA=0;LSB=1;LSC=1; break;
case(2):
LSA=1;LSB=0;LSC=1; break;
case(3):
LSA=0;LSB=0;LSC=1; break;
}
P0=disp[i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
datapros();
DigDisplay();
}
}
五、程序效果
TM4C123G
1、加热启动过程 2、测量电压Vl值
TM4C
利用打火机模拟可燃气体源 SerialChart绘制曲线
51单片机
|