51单片机如何连接MQ-2烟雾传感器

#include "reg51.h"
#include "intrins.h"

#define UPID 0X6F
#define MYID 0x08

sfr AUXR=0x8e;//STC应用该辅助寄存器

/*Declare SFR associated with the ADC*/
sfr ADC_CONTR = 0xBC;  //ADC control register
sfr ADC_RES = 0xBD;     //ADC high 8-bit result register
sfr ADC_LOW2 = 0xBE;    //ADC low 2-bit result register
sfr P1ASF = 0x9D;       //P1 secondary function control register

/*Define ADC operation const for ADC_CONTR*/
#define ADC_POWER  0x80     //ADC power control bit
#define ADC_FLAG   0x10     //ADC complete flag
#define ADC_START  0x08     //ADC start control bit
#define ADC_SPEEDLL 0x00    //420 clocks
#define ADC_SPEEDL 0x20     //280 clocks
#define ADC_SPEEDH  0x40      //140 clocks
#define ADC_SPEEDHH 0x60    //70 clocks

unsigned char bufsend[10];

void Delay1ms(unsigned int x)   //@11.0592MHz
{
   unsigned char i,j;
     while(x–)
   {
     _nop_();
         i= 11;
         j= 190;
         do
             {
         while(–j);
             }
             while(–i);
   }
}

void UartInit(void)        //9600bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    AUXR &= 0xBF;        //定时器时钟12T模式
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式
    TL1 = 0xFD;        //设置定时初始值
    TH1 = 0xFD;        //设置定时重载值
    ET1 = 0;        //禁止定时器%d中断
    TR1 = 1;        //定时器1开始计时
}

void InitADC()
{
  P1ASF = 0x01;     //Open 8 channels ADC function
  ADC_RES =0;       //Clear previous result
  ADC_CONTR=ADC_POWER | ADC_SPEEDLL;
  Delay1ms(2);      //ADC power-on and delay
}

unsigned char GetADCResult(unsigned char ch)
    {
    ADC_CONTR=ADC_POWER | ADC_SPEEDLL| ch | ADC_START;
        _nop_();       //Must wait before inquiry
    _nop_();
    _nop_();
        _nop_();
    while(!(ADC_CONTR & ADC_FLAG));   //Wait complete flag
        ADC_CONTR &=~ADC_FLAG;     //Close ADC
    return ADC_RES;           //Return ADC result
  }

    
unsigned char DataSendPreprocess()
{
  unsigned char i,t=0;
  bufsend[0]=0x7f;  //起始字节
  bufsend[1]=0x5f;  //接受者地址
  bufsend[2]=0x08;  //发送者地址
  bufsend[3]=3;     //数据长度
  bufsend[4]=0x84;  //传感器类型0x13—>可燃气体传感器MQ-2
  bufsend[5]=0;     //AD通道号P1.0<——>可燃气体传感器MQ-2的AO
  bufsend[6]=GetADCResult(0);//AD通道号0转换后数据
  for(i=1;i<=6;i++)  //异或校验码生成
  t^=bufsend[i];
  bufsend[7]=t;     //校验字节
  bufsend[8]=0xff;  //结束字节
  return 9;
}

void DataSend(unsigned char ss[],unsigned char len)
    {
    unsigned char i;
        for(i=0;i<len;i++)
        {
      SBUF=ss[i];
          while(TI==0);
      TI=0;
    }
  }
void main()
    {
    unsigned char len;
        InitADC();
    UartInit();
    while(1)
            {
        len=DataSendPreprocess();
                DataSend(bufsend,len);
                Delay1ms(1000);
      }
  }

作者:菜鸡一只_f

物联沃分享整理
物联沃-IOTWORD物联网 » 51单片机如何连接MQ-2烟雾传感器

发表评论