久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 可燃氣體檢測傳感器的程序 [打印本頁]

作者: xyze    時間: 2024-5-15 01:14
標題: 可燃氣體檢測傳感器的程序
基于stm32,使用SGP30 CO2和TVOC傳感器的初始化和數據讀取程序。SGP30是一款用于測量二氧化碳(CO2)和總揮發性有機化合物(TVOC)濃度的傳感器。程序中定義了相關的IIC通信函數,如起始信號、停止信號、發送和接收字節等。此外,程序還包含了一個主函數,用于初始化SGP30傳感器,并讀取CO2和TVOC的數據。


#include "sgp30_CO2_TVOC.h"
#include "user_peripheral.h"
#include "delay.h"
#include "usart.h"

#if SGP30_CO2_TVOC_Pre


void SGP30_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(SGP30_SCL_GPIO_CLK | SGP30_SDA_GPIO_SDA, ENABLE);

  GPIO_InitStructure.GPIO_Pin = SGP30_SCL_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(SGP30_SCL_GPIO_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}


void SGP30_SDA_OUT(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}

void SGP30_SDA_IN(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = SGP30_SDA_GPIO_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(SGP30_SDA_GPIO_PORT, &GPIO_InitStructure);
}


void SGP30_IIC_Start(void)
{
  SGP30_SDA_OUT();
  SGP30_SDA = 1;
  SGP30_SCL = 1;
  delay_us(20);

  SGP30_SDA = 0;        
  delay_us(20);
  SGP30_SCL = 0;         
}


void SGP30_IIC_Stop(void)
{
  SGP30_SDA_OUT();
  SGP30_SCL = 0;
  SGP30_SDA = 0;        
  delay_us(20);
  SGP30_SCL = 1;
  SGP30_SDA = 1;        
  delay_us(20);
}




u8 SGP30_IIC_Wait_Ack(void)
{
  u8 ucErrTime = 0;
  SGP30_SDA_IN();
  SGP30_SDA = 1;
  delay_us(10);
  SGP30_SCL = 1;
  delay_us(10);
  while(SGP30_SDA_READ())
  {
    ucErrTime++;
    if(ucErrTime > 250)
    {
      SGP30_IIC_Stop();
      return 1;
    }
  }
  SGP30_SCL = 0;                  
  return 0;
}


void SGP30_IIC_Ack(void)
{
  SGP30_SCL = 0;
  SGP30_SDA_OUT();
  SGP30_SDA = 0;
  delay_us(20);
  SGP30_SCL = 1;
  delay_us(20);
  SGP30_SCL = 0;
}


void SGP30_IIC_NAck(void)
{
  SGP30_SCL = 0;
  SGP30_SDA_OUT();
  SGP30_SDA = 1;
  delay_us(20);
  SGP30_SCL = 1;
  delay_us(20);
  SGP30_SCL = 0;
}





void SGP30_IIC_Send_Byte(u8 txd)
{
  u8 t;
  SGP30_SDA_OUT();
  SGP30_SCL = 0;                     
  for(t = 0; t < 8; t++)
  {
    if((txd & 0x80) >> 7)
      SGP30_SDA = 1;
    else
      SGP30_SDA = 0;
    txd <<= 1;
    delay_us(20);
    SGP30_SCL = 1;
    delay_us(20);
    SGP30_SCL = 0;
    delay_us(20);
  }
  delay_us(20);

}


u16 SGP30_IIC_Read_Byte(u8 ack)
{
  u8 i;
  u16 receive = 0;
  SGP30_SDA_IN();
  for(i = 0; i < 8; i++ )
  {
    SGP30_SCL = 0;
    delay_us(20);
    SGP30_SCL = 1;
    receive <<= 1;
    if(SGP30_SDA_READ())
      receive++;
    delay_us(20);
  }
  if (!ack)
    SGP30_IIC_NAck();
  else
    SGP30_IIC_Ack();
  return receive;
}



void SGP30_Init(void)
{
  SGP30_GPIO_Init();
  SGP30_Write(0x20, 0x03);


}


void SGP30_Write(u8 a, u8 b)
{
  SGP30_IIC_Start();
  SGP30_IIC_Send_Byte(SGP30_write);
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Send_Byte(a);               
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Send_Byte(b);
  SGP30_IIC_Wait_Ack();
  SGP30_IIC_Stop();
  delay_ms(100);
}

u32 SGP30_Read(void)
{
  u32 dat;
  u8 crc;
  SGP30_IIC_Start();
  SGP30_IIC_Send_Byte(SGP30_read);
  SGP30_IIC_Wait_Ack();
  dat = SGP30_IIC_Read_Byte(1);
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(1);
  crc = SGP30_IIC_Read_Byte(1);
  crc = crc;  
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(1);
  dat <<= 8;
  dat += SGP30_IIC_Read_Byte(0);
  SGP30_IIC_Stop();
  return(dat);
}

u32 sgp30_dat;
u32 CO2Data,TVOCData;
void SGP30_Init_ALL(void)
{
  SGP30_Init();   
        delay_ms(100);
        SGP30_Write(0x20,0x08);
        sgp30_dat = SGP30_Read();
        CO2Data = (sgp30_dat & 0xffff0000) >> 16;
        TVOCData = sgp30_dat & 0x0000ffff;      
        
        
        
        
        while(CO2Data == 400 && TVOCData == 0)
        {
                SGP30_Write(0x20,0x08);
                sgp30_dat = SGP30_Read();
                CO2Data = (sgp30_dat & 0xffff0000) >> 16;
                 TVOCData = sgp30_dat & 0x0000ffff;      
                printf("?y?ú?ì2a?D...\r\n");

                OLED_ShowString(0,4,(u8*)"co2 init wait...",16);
                delay_ms(249);


                delay_ms(251);
        }
        OLED_ShowString(0,4,(u8*)"co2 init ok...",16);
        delay_ms(500);
        OLED_Clear();
        printf("......OK.....\r\n");
}

#endif

這是一個什么程序





歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美在线视频一区二区 | 国产乱淫片视频 | 精品国产一区二区三区久久久蜜月 | 国产精品高潮呻吟av | 青青草精品视频 | 中文字幕在线视频播放 | av看片| 在线观看av的网站 | 丰满少妇在线观看网站 | 黄色大毛片 | www国产视频 | 久久香蕉国产 | 天天碰天天操 | 俄罗斯毛片 | 高清不卡av | 国产精品自拍av | 中文字幕av网站 | 久久精品欧美 | 久热精品视频在线观看 | 亚洲精品www久久久久久广东 | 男人的天堂久久 | 国产黄色在线观看 | 国产三级在线 | 中文字幕在线一区二区三区 | 国产一区二区不卡 | 国产精品毛片一区二区在线看 | 国产区在线观看 | 日韩在线成人 | av一二三区 | 福利网站在线观看 | av福利网 | 欧美午夜精品一区二区三区 | 国产一区二区免费在线观看 | 免费视频国产 | 久久人人爽人人爽人人片 | 91精品国产综合久久久蜜臀九色 | 精品久久久久久久久久久久久久久久 | 神马午夜我不卡 | 免费观看全黄做爰的视频 | 精品毛片一区二区三区 | 国产中文字幕在线观看 |