K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

  • 一、资源说明
  • 二、基本参数
  • 参数
  • 引脚说明
  • 三、驱动说明
  • IIC地址/采集通道选择/时序
  • 对应程序:
  • 四、部分代码说明
  • 1、接线引脚定义
  • 1.1、STC89C52RC+MQ2传感参模块
  • 1.2、STM32F103C8T6+MQ2传感参模块
  • 五、基础知识学习与相关资料下载
  • 六、视频效果展示与程序资料获取
  • 七、注意事项
  • 八、接线说明
  • STC89C52RC
  • STM32F103C8T6
  • 请添加图片描述

    一、资源说明

    单片机型号 测试条件 模块名称 代码功能
    STC89C52RC 晶振11.0592M MQ2传感模块 STC89C52RC采集MQ2传感模块参数 串口与OLED0.96双显示
    STM32F103C8T6 晶振8M/系统时钟72M MQ2传感模块 STM32F103C8T6采集MQ2传感模块参数 串口与OLED0.96双显示

    其他资料目录 直戳跳转

    二、基本参数

    参数

    可以用于家庭和工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、 甲烷、 酒精、烟雾等的探测;
    灵敏度可调(图中蓝色数字电位器调节)
    工作电压 5V 使用前,供电至少预热 2 分钟以上,传感器稍微发烫属于正 常现象;
    输出形式:
    a 模拟量电压输出
    b 数字开关量输出(0 和 1)

    引脚说明

    MQ2传感模块 引脚说明
    VCC 正极 5V供电
    GND 负极 接GND
    DO 数字量输出(默认高电平输出 到阀值输出低电平)
    AO 模拟量输出

    三、驱动说明

    STC89C52RC无ADC所以需要借助外部ADC模块 此处用PCF8591模块进行采集

    IIC地址/采集通道选择/时序

    请添加图片描述
    请添加图片描述
    请添加图片描述

    对应程序:

    以51为例

    /*******************************************************************
                         起动总线函数               
    函数原型: void  Start_I2c();  
    功能:     启动I2C总线,即发送I2C起始条件.  
    ********************************************************************/
    void Start_I2c()
    {
      PCF8591_SDA=1;         /*发送起始条件的数据信号*/
      PCF8591_SCL=1;
      IIC_Delay();
      PCF8591_SDA=0;         /*发送起始信号*/
      IIC_Delay();      
      PCF8591_SCL=0;       /*钳住I2C总线,准备发送或接收数据 */
      IIC_Delay();
    }
    
    /*******************************************************************
                          结束总线函数               
    函数原型: void  Stop_I2c();  
    功能:     结束I2C总线,即发送I2C结束条件.  
    ********************************************************************/
    void Stop_I2c()
    {
      PCF8591_SDA=0;      /*发送结束条件的数据信号*/
      PCF8591_SCL=1;      /*结束条件建立时间大于4μs*/
      IIC_Delay();
      PCF8591_SDA=1;      /*发送I2C总线结束信号*/
      IIC_Delay();
    }
    
    /*******************************************************************
                     字节数据发送函数               
    函数原型: void  SendByte(UCHAR c);
    功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
              此状态位进行操作.(不应答或非应答都使ack=0)     
               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
    ********************************************************************/
    void SendByte(uint8_t  c)
    {
     uint8_t  BitCnt;
     
     for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
        {
    	     if((c<<BitCnt)&0x80)PCF8591_SDA=1;   /*判断发送位*/
    	     else  PCF8591_SDA=0;                
    	
    	     PCF8591_SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/
    		 IIC_Delay();       
    	     PCF8591_SCL=0; 
        }
        
        IIC_Delay();
        PCF8591_SDA=1;                /*8位发送完后释放数据线,准备接收应答位*/
        IIC_Delay();  
        PCF8591_SCL=1;
        IIC_Delay();
        if(PCF8591_SDA==1)ack=0;     
           else ack=1;        /*判断是否接收到应答信号*/
        PCF8591_SCL=0;
      IIC_Delay();
    }
    
    /*******************************************************************
                     字节数据接收函数               
    函数原型: UCHAR  RcvByte();
    功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
              发完后请用应答函数应答从机。  
    ********************************************************************/    
    uint8_t RcvByte()
    {
      uint8_t  retc;
      uint8_t  BitCnt;
      
      retc=0; 
      PCF8591_SDA=1;                     /*置数据线为输入方式*/
      for(BitCnt=0;BitCnt<8;BitCnt++)
      {
          
          PCF8591_SCL=0;                  /*置时钟线为低,准备接收数据位*/
    	  IIC_Delay();
          PCF8591_SCL=1;                  /*置时钟线为高使数据线上数据有效*/
    	  IIC_Delay();
          retc=retc<<1;
          if(PCF8591_SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */
    		IIC_Delay();
        }
      		PCF8591_SCL=0;    
      		IIC_Delay();
      		return(retc);
    }
    
    /********************************************************************
                         应答子函数
    函数原型:  void Ack_I2c(bit a);
    功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
    ********************************************************************/
    void Ack_I2c(uint8_t a)
    {
      
      if(a==0)PCF8591_SDA=0;              /*在此发出应答或非应答信号 */
      else PCF8591_SDA=1;
      IIC_Delay();    
      PCF8591_SCL=1;
      IIC_Delay();
      PCF8591_SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/
      IIC_Delay();  
    }
    
    采集通道选择:
    ISendByte(PCF8591,0x42);
    
    地址:
    #define  PCF8591 0x90    //PCF8591 地址
    
    

    四、部分代码说明

    1、接线引脚定义

    需要自定义引脚可在此处更改,STM32要自定义引脚的话也要注意引脚时钟使能的更改

    1.1、STC89C52RC+MQ2传感参模块

    //MQ2传感+PCF8591模块引脚定义
    MQ2传感模块---------------------------PCF8591
    AO-------------------------------------AIN2
    
    sbit  PCF8591_SCL=P1^0;       //I2C  时钟 
    sbit  PCF8591_SDA=P1^1;       //I2C  数据 
    //OLED0.96模块引脚定义
    sbit SCL=P1^2; //串行时钟
    sbit SDA=P1^3; //串行数据
    

    1.2、STM32F103C8T6+MQ2传感参模块

    //MQ2传感模块引脚定义 GPIOA_0  ADC1通道0
    #define    ADC_GPIO_APBxClock_FUN        RCC_APB2PeriphClockCmd
    #define    ADC_GPIO_CLK                  RCC_APB2Periph_GPIOA  
    #define    ADC_PORT                      GPIOA
    #define    ADC_PIN                       GPIO_Pin_0
    //OLED0.96模块引脚定义					
    		//-----------------OLED IIC端口定义----------------  					   
    
    #define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SCL
    #define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)
    
    #define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SDA
    #define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)
    

    五、基础知识学习与相关资料下载

    1、STC89C52RC程序下载 直戳跳转

    2、STM32F103C8T6程序下载
    (1)串口下载 直戳跳转
    (2)ST-LINK下载 直戳跳转
    (3)J-LINK下载 直戳跳转
    (4)DAP-LINK下载 直戳跳转

    3、OLED0.96程序说明 直戳跳转

    4、串口助手下载与使用
    (1)安信可调试助手使用 直戳跳转
    (2) sscom33串口调试助手使用 直戳跳转
    (3)STC-ISP串口调试助手使用 直戳跳转

    六、视频效果展示与程序资料获取

    视频连接 直戳跳转
      资料获取            ( 滑到最后添加群号看公告免费获取)

    七、注意事项

    1、VCC GND请勿接反,接反易烧
    2、OLED显示异常时,排除接线接触不良
    3、使用前需要预热

    八、接线说明

    STC89C52RC

    /************************************************************************************
    //  生成日期   : 2021-6-21
    //  最近修改   : 2021-11-21
    //  功能描述   : MQ2传感模块测试程序
    //  测试条件   : STC89C52RC   晶振11.0592
    接线
    MQ2传感模块----------------------STC89C52RC
    VCC-------------------------------5V
    GND-------------------------------GND
    MQ2传感模块----------------------PCF8591
    AO--------------------------------AIN2
    
    PCF8591--------------------------------STC89C52RC
    VCC-- ---------------------------------5V
    GND- ----------------------------------GND
    SCL- ----------------------------------P1.0 //SCL
    SDA- ----------------------------------P1.1 //SDA
    
    OLED0.96(IIC) -------------------------STC89C52RC
    VCC------------------------------------3.3V
    GND------------------------------------GND
    SCL------------------------------------P1^2
    SDA------------------------------------P1^3
    *************************************************************************************/
    

    STM32F103C8T6

    /************************************************************************************
    //  生成日期   : 2021-6-21
    //  最近修改   : 2021-11-21
    //  功能描述   : MQ2传感模块测试程序
    //  测试条件   : STM32F103C8T6   晶振8M  系统时钟 72M
    接线
    MQ2传感模块-----------------------STM32F103C8T6
    VCC-------------------------------------5V
    GND-------------------------------------GND
    AO--------------------------------------PA_0 
    
    OLED0.96
    VCC-- -----------------------------------3.3V
    GND- ------------------------------------GND
    SCL- ------------------------------------PB_8 //SCL
    SDA- ------------------------------------PB_9 //SDA	
    *****************************************************************************************/
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » K_A18_001 基于STM32等单片机采集MQ2传感参数串口与OLED0.96双显示

    发表评论