学习酒精检测传感器MQ-3的使用方法;
硬件:酒精传感器节点,串口线;
软件:Keil u Vision4编译软件,STC下载软件STC_ISP;
芯片手册:
电路原理图路径:
源码路径:
hex文件路径:
MQ-3气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器环境中有酒精蒸汽时,随着空气中酒精气体浓度的增加,传感器的电导率增加。使用简单的电路将电导率的变化转换为与气体浓度相对应的输出信号。
MQ-3.气体传感器对酒精敏感性高,能抵抗汽油、烟雾和水蒸气的干扰。该传感器可以检测各种浓度的酒精气氛,是一种适合各种应用的低成本传感器。
组件结构如图3所示.1:
图3.1 酒精传感器形状
图3.2 酒精传感器基本测试电路
基本测试电路,图3.二是酒精传感器的基本测试电路。传感器需要施加两个电压:加热器电压(VH)和测试电压(VC)。其中 VH为传感器提供特定的工作温度。VC用于测量与传感器串联的负载电阻(RL)上的电压(VRL)。该传感器具有轻微的极性,VC需要直流电源。在满足传感器电性能要求的前提下,VC和VH可共享相同的电源电路。更好地利用传感器 性能,需要选择合适的RL值。如表1所示。
表1 酒精传感器技术指标
产品型号 |
MQ-3 |
||
产品类型 |
半导体气敏元件 |
||
标准封装 |
胶木(黑胶木) |
||
检测气体 |
酒精蒸汽 |
||
检测浓度 |
0.04-4mg/L酒精 |
||
标准电路条件 |
回路电压 |
Vc |
≤24V DC |
加热电压 |
VH |
5.0V±0.2VACorDC |
|
负载电阻 |
RL |
可调 |
|
标准测试条件下气敏元件特性 |
加热电阻 |
RH |
31Ω±3Ω(室温) |
|
加热功耗 |
PH |
≤900mW |
|
敏感体表面电阻 |
Rs |
2KΩ-20KΩ(in 0.4mg/L酒精) |
|
灵敏度 |
S |
Rs(in air)/Rs(0.4mg/L酒精)≥5 |
|
浓度斜率 |
α |
≤0.6(R300ppm/R100ppm酒精) |
标准测试条件 |
温度、湿度 |
20℃±2℃;65%±5%RH |
|
|
标准测试电路 |
Vc:5.0V±0.1V; VH: 5.0V±0.1V |
|
|
预热时间 |
不少于48小时 |
酒精传感器灵敏度特性图3.3所示:
图3.3 酒精传感器灵敏度特性图
MQ-3酒精传感器的电路原理如图3.4所示:
其中U1(MQ-3)的PIN5与PIN2为加热端,对应测试回路的H端;PIN1、PIN3、PIN4、PIN6为检测回路;MQ-3传感器的供电电压Vc和加热电压Vh都为5V,负载电阻R1为1K欧姆。从技术指标表中可知,在0.4mg/L酒精中,传感器电阻Rs为2K~20K,取Rs = 12K。假设检测到酒精浓度为10mg/L时报警,由灵敏度特性曲线可知灵敏度为0.12,MQ3电阻值为12K * 0.12 = 1.44K(Rs / Ro = 灵敏度,其中Ro为传感器在0.4mg/L酒精时的电阻值),ADC1(P1.1) = 5V * 1K / (1K + 1.44K) = 2.00V,AD读数为2.00 / 3.3 * 1024 = 620,当AD采集的数值大于620时表明检测到酒精。
4.1.1 取酒精传感器节点,打开Keil集成开发环境,打开
4.1.2点击左上角的Rebuild按键,编译整个工程,将生成jiujing.hex可执行文件,该可执行文件自动保存在
4.1.3 使用串口线将电脑与酒精传感器节点的串口相连,将酒精传感器节点上的S1开关拨打到左边,让STC单片机和DB9相连。
4.1.4 根据
/**********************************************************/
//晶振频率:11.0592MHz
//文件名 :Main.c
//功能说明:酒精传感器读取实验
//制作 :www.frotech.com
//技术支持:020-22883196 QQ:
//变更记录: 2016.11.22
//变更内容: 新建造
/**********************************************************/
#include <? >
#define BUF_LENTH 128 //定义串口接收缓冲长度
#define uint unsigned int
#define uchar unsigned char
unsigned char uart1_wr; //写指针
unsigned char uart1_rd; //读指针
unsigned char xdata RX0_Buffer[BUF_LENTH]; //接收缓冲
unsigned char flag;
unsigned char i;
unsigned char xdata mbus_buffer[255];
unsigned char xdata mbus_Sendbuf[255];
unsigned char xdata Crc_buf[2]; //声明存储CRC校验值的高8位及低8位的缓存
unsigned int Crc_return_data; //声明CRC校验值
bit B_TI; //发送完成标志
sbit P1_0 = P1^0;//定义P1.0端口
// 7 6 5 4 3 2 1 0 Reset Value
//sfr ADC_CONTR = 0xBC; ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000 //AD 转换控制寄存器
#define ADC_OFF() ADC_CONTR = 0
#define ADC_ON (1 << 7)
#define ADC_90T (3 << 5)
#define ADC_180T (2 << 5)
#define ADC_360T (1 << 5)
#define ADC_540T 0
#define ADC_FLAG (1 << 4) //软件清0
#define ADC_START (1 << 3) //自动清0
#define ADC_CH0 0
#define ADC_CH1 1
#define ADC_CH2 2
#define ADC_CH3 3
#define ADC_CH4 4
#define ADC_CH5 5
#define ADC_CH6 6
#define ADC_CH7 7
uint adc10_start(uchar channel);
void uart1_init(void);
void Uart1_TxByte(unsigned char dat);
void Uart1_String(unsigned char code *puts);
void delay_ms(unsigned char ms);
unsigned int cal_crc(unsigned char *snd, unsigned char num);
/*************** 用户定义参数 *****************************/
#define MAIN_Fosc 11059200UL
#define Baudrate0 9600UL
/**********************************************************/
/****************** 编译器自动生成,用户请勿修改 ***********************/
#define BRT_Reload (256 - MAIN_Fosc / 16 / Baudrate0) //Calculate the timer1 reload value ar 1T mode
/**********************************************************/
//**********************************************************************
//函数名:main(void)
//输入 :无
//输出 :无
//功能描述:当单片机接收到酒精浓度读取指令,采集酒精浓度,再向串口返回
//酒精浓度的指令
//**********************************************************************
void main(void)
{
uint j;
uart1_init();//初始化串口
P1ASF = (1 << ADC_CH1); //STC12C5A16S2系列模拟输入(AD)选择ADC1(P1.1)
ADC_CONTR = ADC_360T | ADC_ON;
while(1)
{
if(flag==1)
{ delay_ms(5);
if(RX0_Buffer[0x03] == 0x30)
{
j = adc10_start(1); //(P1.1)ADC1转换
mbus_Sendbuf[3] = ((j>>8)&0xff);
mbus_Sendbuf[4] = j&0xff;
mbus_Sendbuf[2] = (((RX0_Buffer[0x04] * 16) + RX0_Buffer[0x05]) * 2);
mbus_Sendbuf[0] = RX0_Buffer[0];
mbus_Sendbuf[1] = 0x03;
Crc_return_data=cal_crc(mbus_Sendbuf, 5); //取得将要发送数据的CRC值
Crc_buf[0]=((Crc_return_data >> 8)&0xff); //取得CRC值的高8位
Crc_buf[1]=(Crc_return_data & 0xff); //取得CRC值的低8位
mbus_Sendbuf[5]=Crc_buf[1]; //CRC值低8位赋值给将要发送的数据的倒数第二个字节
mbus_Sendbuf[6]=Crc_buf[0]; //CRC值高8位赋值给将要发送的数据的最后一个
for(i = 0; i < 7; i++)
{
Uart1_TxByte(mbus_Sendbuf[i]);
}
flag=0;
uart1_wr=0;
}
}
}
}
//**********************************************************************
//函数名:adc10_start(uchar channel)
//输入 :ADC转换的通道
//输出 :ADC值
//功能描述:ADC转换
//**********************************************************************
uint adc10_start(uchar channel) //channel = 0~7
{
uint adc;
uchar i;
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
i = 250;
do{
if(ADC_CONTR & ADC_FLAG)
{
ADC_CONTR &= ~ADC_FLAG;
adc = (uint)ADC_RES;
adc = (adc << 2) | (ADC_RESL & 3);
return adc;
}
}while(--i);
return 1024;
}
/*****************************CRC校验计算函数********************************/
unsigned int cal_crc(unsigned char *snd, unsigned char num)
{
unsigned char i, j;
unsigned int c,crc=0xFFFF;
for(i = 0; i < num; i ++)
{
c = snd[i] & 0x00FF;
crc ^= c;
for(j = 0;j < 8; j ++)
{
if (crc & 0x0001)
{
crc>>=1;
crc^=0xA001;
}
else crc>>=1;
}
}
return(crc);
}
//**********************************************************************
//函数名:uart1_init(void)
//输入 :无
//输出 :无
//功能描述:串口初始化函数,通信参数为9600 8 N 1
//**********************************************************************
void uart1_init(void)
{
PCON |= 0x80; //UART0 Double Rate Enable
SCON = 0x50; //UART0 set as 10bit , UART0 RX enable
AUXR |= 0x01; //UART0 使用BRT
AUXR |= 0x04; //BRT set as 1T mode
BRT = BRT_Reload;
AUXR |= 0x10; //start BRT
ES = 1;
EA = 1;
}
//**********************************************************************
//函数名:Uart1_TxByte(unsigned char dat)
//输入 :需要发送的字节数据
//输出 :无
//功能描述:从串口发送单字节数据
//**********************************************************************
void Uart1_TxByte(unsigned char dat)
{
B_TI = 0;
SBUF = dat;
while(!B_TI);
B_TI = 0;
}
//**********************************************************************
//函数名:Uart1_String(unsigned char code *puts)
//输入 :字符串首地址
//输出 :无
//功能描述:从串口发送字符串
//**********************************************************************
void Uart1_String(unsigned char code *puts)
{
for(; *puts != 0; puts++)
{
Uart1_TxByte(*puts);
}
}
//**********************************************************************
//函数名:UART1_RCV (void)
//输入 :无
//输出 :无
//功能描述:串口中断接收函数
//**********************************************************************
void UART1_RCV (void) interrupt 4
{
if(RI)
{
RI = 0;
RX0_Buffer[uart1_wr++] = SBUF;
//if(++uart0_wr >= BUF_LENTH) uart0_wr = 0;
flag = 1;
}
if(TI)
{
TI = 0;
B_TI = 1;
}
}
void delay_ms(unsigned char ms)
{
unsigned int i;
do{
i = MAIN_Fosc /1400;
while(--i);
}while(--ms);
}
节点S1开关拨打到左边让STC单片机和DB9连接,打开串口调试助手,进入如图4.1所示界面,在串口参数设置选择正确的
点击发送: 01 03 00 30 00 01 84 05
问题?返回: 写出返回值,并提取有效数值,表示酒精浓度
【
实验名称
实验目的
实验设备
实验步骤
编写实验源代码文件,代码参考
取酒精传感器节点,打开Keil集成开发环境。
点击左上角的Rebuild按键,编译整个工程,生成aaa.hex可执行文件。
使用串口线将电脑与酒精传感器节点的串口相连,将酒精传感器节点上的S1开关拨打到左边,让STC单片机和DB9相连。
使用STC-ISP软件将可执行aaa.hex文件通过STC_ISP串口下载软件下载进STC单片机中。
实验结果
】