资讯详情

酒精传感器实验

学习酒精检测传感器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可执行文件,该可执行文件自动保存在目录下。(注意:请根据该目录下 jiujing.hex 文件的生成时间,判断该文件是否是自己刚刚编译完成的。)

4.1.3 使用串口线将电脑与酒精传感器节点的串口相连,将酒精传感器节点上的S1开关拨打到左边,让STC单片机和DB9相连。

4.1.4 根据 STC-ISP软件使用说明书-甄鹏-V20160423,使用STC-ISP软件将4.1.2步中生成的可执行jiujing.hex文件通过STC_ISP串口下载软件下载进STC单片机中。

/**********************************************************/

//晶振频率: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所示界面,在串口参数设置选择正确的以及串口配置,选择16进制发送,16进制接收,把酒精读取指令01 03 00 30 00 01 84 05复制到发送区,打开串口,

点击发送: 01 03 00 30 00 01 84 05

问题?返回: 写出返回值,并提取有效数值,表示酒精浓度

实验名称

实验目的

实验设备

酒精传感器节点,串口线;

Keil u Vision4编译软件,STC下载软件STC_ISP;

实验步骤

编写实验源代码文件,代码参考

 

取酒精传感器节点,打开Keil集成开发环境。

点击左上角的Rebuild按键,编译整个工程,生成aaa.hex可执行文件。

 

使用串口线将电脑与酒精传感器节点的串口相连,将酒精传感器节点上的S1开关拨打到左边,让STC单片机和DB9相连。

使用STC-ISP软件将可执行aaa.hex文件通过STC_ISP串口下载软件下载进STC单片机中。

实验结果

标签: 传感器电路传感器992551102的油位传感器板电压传感器8f8h传感器3408556传感器11ea开关传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台