国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CW32L083實現SHT30驅動

華仔的編程隨筆 ? 來源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-06-22 09:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

SHT3x是新一代的溫濕度傳感器,精度為±2%RH和±0.3℃,輸入電壓范圍從2.4V到5.5V,采用IIC總線接口,速率可達1MHz。測量溫濕度范圍分別為是-40℃ ~ 125℃和0 ~ 100%。工作電流為600uA,空閑電流在2ua。因此非常適合用在低功耗溫濕度監測項目之上。 SHT3X的獲取溫度只需要二步,一是發送溫度轉換命令,接著讀取6個字節。進行溫濕度測量,需先發送一個開始信號,然后發送一個 I2C的寫操作頭,然后再跟隨一個 16 位的溫濕度轉換命令。傳感器收到上位機發送的每個字節數據后,會通過將 SDA 總線拉到低電平給出ACK 信號。在正確的收到溫濕度轉換命令并發送 ACK 信號給微處理器之后,SHT3x 內部開始啟動溫度和濕度的轉換測量。二是在傳感器完成溫濕度測量之后,上位機可以通過發送 START信號+I2C 讀取數據頭來 讀取溫濕度數據,如果溫濕度數據已經準備好,那么芯片會向上位機發送 ACK 信號,并隨后發送 2 字節的溫度數據加 1 字節的 CRC 校驗數據,然后再發送 2 字節的濕度數據加 1 字節的 CRC 校驗數據。上位機需要對接收到的每個字節數據發送 ACK,否則芯片會停止發送數據。微處理器在收到濕度數據的CRC 字節后應該發送一個NACK 和一個 STOP 信號來結束本次數據傳輸,

下面開始CW32L083的溫度采集:

1、選取PB10、PB11為I2C通信,采取軟件I2C。初始化代碼如下:

void IIC_Init(void)

{

//配置PB10 為輸出

//使能GPIOB時鐘

CW_SYSCTRL->AHBEN_f.GPIOB = 1;

//配置PB10 為輸出

CW_GPIOB->ANALOG_f.PIN10 = 0; //設置 GPIOx_ANALOG.PINy 為 0,將端口配置為數字功能;

CW_GPIOB->DIR_f.PIN10 = 0; //設置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

CW_GPIOB->OPENDRAIN_f.PIN10 = 0; //0:推挽輸出

CW_GPIOB->ODR_f.PIN10 = 1;

CW_GPIOB->ANALOG_f.PIN11 = 0; //設置 GPIOx_ANALOG.PINy 為 0,將端口配置為數字功能;

CW_GPIOB->DIR_f.PIN11 = 0; //設置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

CW_GPIOB->OPENDRAIN_f.PIN11 = 0; //0:推挽輸出

CW_GPIOB->ODR_f.PIN11 = 1;

}

2、設置IO方向,SDA需要轉換輸出與輸入,我們采用對 GPIOx_DIR.PINy進行設置,來實現IO的數據輸入與輸出的轉換。

//IO方向設置(SDA)

/ xxxxxxxxxxxxxx ****/

void SDA_IN()

{

CW_GPIOB->DIR_f.PIN11 = 1; //設置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

}

void SDA_OUT()

{

CW_GPIOB->DIR_f.PIN11 = 0; //設置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

CW_GPIOB->OPENDRAIN_f.PIN11 = 0; //0:推挽輸出

}

3、定義讀取SDA的宏:#define READ_SDA PB11_GETVALUE() //輸入SDA

4、定義IIC的STAT、STOP、ACK、NACK等時序,代碼如下:

//產生IIC起始信號

void IIC_Start(void)

{

SDA_OUT(); //sda線輸出

IIC_SDA=1;

IIC_SCL=1;

delay_us(4);

IIC_SDA=0;//START:when CLK is high,DATA change form high to low

delay_us(4);

IIC_SCL=0;//鉗住I2C總線,準備發送或接收數據

}

//產生IIC停止信號

void IIC_Stop(void)

{

SDA_OUT();//sda線輸出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

delay_us(4);

IIC_SCL=1;

IIC_SDA=1;//發送I2C總線結束信號

delay_us(4);

}

//等待應答信號到來

//返回值:1,接收應答失敗

// 0,接收應答成功

/ xxxx修改超時時間 ***/

uint8_t IIC_Wait_Ack(void)

{

uint8_t ucErrTime=0;

SDA_IN(); //SDA設置為輸入

IIC_SDA=1;delay_us(3);

IIC_SCL=1;delay_us(3);

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

//printf("超時
");

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//時鐘輸出0

return 0;

}

//產生ACK應答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//不產生ACK應答

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

5、定義發送一個字節:

//IIC發送一個字節

//返回從機有無應答

//1,有應答

//0,無應答

void IIC_Send_Byte(uint8_t txd)

{

uint8_t t;

SDA_OUT();

IIC_SCL=0;//拉低時鐘開始數據傳輸

for(t=0;t<8;t++)

{

if((txd&0x80)>>7)

IIC_SDA=1;

else

IIC_SDA=0;

txd<<=1;

delay_us(2); //對TEA5767這三個延時都是必須的

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

delay_us(2);

}

}

6、定義讀取一個字節

//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK

uint8_t IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();//SDA設置為輸入

for(i=0;i<8;i++ )

{

IIC_SCL=0;

delay_us(100);

IIC_SCL=1;

receive<<=1;

if(READ_SDA)receive++;

delay_us(100);

}

if (!ack)

IIC_NAck();//發送nACK

else

IIC_Ack(); //發送ACK

return receive;

}

到這里IIC的初始化工作結束。

6、SHT3x的數據獲取,采集廠家出廠的標準DEMO。主要是發送轉換溫度的命令與讀取命令,sth30.c代碼如下:

#include "sht30.h"

#define POLYNOMIAL_CXDZ 0x31 // X^8 + X^5 + X^4 + 1

//SHT3X CRC校驗

unsigned char SHT3X_CRC(uint8_t *data, uint8_t len)

{

unsigned char bit; // bit mask

unsigned char crc = 0xFF; // calculated checksum

unsigned char byteCtr; // byte counter

// calculates 8-Bit checksum with given polynomial @GZCXDZ

for(byteCtr = 0; byteCtr < len; byteCtr++) {

crc ^= (data[byteCtr]);

for(bit = 8; bit > 0; --bit) {

if(crc & 0x80) {

crc = (crc << 1) ^ POLYNOMIAL_CXDZ;

} else {

crc = (crc << 1);

}

}

}

return crc;

}

//SHT30命令函數

//addr:表示產品的序號,因為SHT30使用IIC總線的話一條線上可以掛兩個

void SHT30_CMD(uint16_t cmd)

{

IIC_Start();

IIC_Send_Byte(SHT30_ADDR+0); //發送設備地址,寫寄存器

IIC_Wait_Ack();

IIC_Send_Byte((cmd>>8)&0xff); //MSB

IIC_Wait_Ack();

IIC_Send_Byte(cmd&0xff); //LSB

IIC_Wait_Ack();

IIC_Stop();

SysTickDelay(500);//命令發完后需要等待20ms以上才能讀寫

}

//SHT30讀取溫濕度

//temp:溫度,-400~1250,實際溫度=temp/10,分辨率0.1℃,精度±0.3℃

//humi:濕度,0~1000,實際濕度=humi/10,分辨率0.1%rh,精度±3

//返回0成功,1失敗

uint8_t SHT30_Read_Humiture(int *temp,uint16_t *humi)

{

uint8_t buff[6];

SHT30_CMD(SHT30_READ_HUMITURE);//讀溫濕度命令

IIC_Start();

IIC_Send_Byte(SHT30_ADDR+1); //發送設備地址,讀寄存器

IIC_Wait_Ack();

buff[0]=IIC_Read_Byte(1);//繼續讀,給應答

buff[1]=IIC_Read_Byte(1);//繼續讀,給應答

buff[2]=IIC_Read_Byte(1);//繼續讀,給應答

buff[3]=IIC_Read_Byte(1);//繼續讀,給應答

buff[4]=IIC_Read_Byte(1);//繼續讀,給應答

buff[5]=IIC_Read_Byte(0);//不繼續給停止應答

IIC_Stop();

//printf("buff=%d,%d,%d,%d,%d,%d
",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5]);

//CRC校驗

if(SHT3X_CRC(&buff[0],2)==buff[2] && SHT3X_CRC(&buff[3],2)==buff[5])

{

temp=(-45+(175.0 ((buff[0]<<8)+buff[1])/65535.0)) *10;

humi=10100* ((buff[3]<<8)+buff[4])/65535.0;

if(*temp>1250) *temp=1250;

else if(*temp<-400) *temp=-400;

return 0;

}

else return 1;

}

//SHT30初始化

void SHT30_Init()

{

IIC_Init();

}

sht30.h頭文件代碼如下:

#ifndef SHT30_H

#define SHT30_H

#include "main.h"

#define SHT30_ADDR (uint8_t)(0x44<<1) //sht30 i2c地址,ADDR管腳接低電平時為0x44,接高電平為0x45

//SHT30命令

#define SHT30_READ_HUMITURE (uint16_t)0x2c06 //讀溫濕度

//CRC多項式

#define POLYNOMIAL 0x31 // X^8 + X^5 + X^4 + 1

uint8_t SHT30_Read_Humiture(int *temp,uint16_t *humi);

void SHT30_Init(void);

#endif

8、在主程序中,我們把讀取到的數據顯示到LCD段碼屏上:

while(1)

{

SHT30_Read_Humiture(t,h);

temp = t[0];

Lcd_clear();

show_num(2, temp/100,0);

show_num(1, (temp/10)%10,1);

show_num(0, temp%10,0);

temp = h[0];

show_num(7, temp/100,0);

show_num(6, (temp/10)%10,1);

show_num(5, temp%10,0);

SysTickDelay(50000);

}

最后實現的效果如圖:

溫濕計.jpg

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2576

    文章

    55029

    瀏覽量

    791246
  • lcd
    lcd
    +關注

    關注

    36

    文章

    4615

    瀏覽量

    177204
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    基于CW32L083SorKit sht30x的驅動

    CW32L083的溫度采集: 1、選取PB10、PB11為I2C通信,采取軟件I2C。初始化代碼如下: void IIC_Init(void) { //配置PB10 為輸出 //使能GPIOB
    發表于 01-07 07:31

    請問如何配置和使用CW32L083系列微控制器的ADC和DAC模塊?

    如何配置和使用CW32L083系列微控制器的ADC和DAC模塊?
    發表于 12-16 08:27

    請問如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?

    如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?
    發表于 12-16 08:01

    CW32L083系列微控制器有哪些應用場景?

    CW32L083系列微控制器有哪些應用場景
    發表于 12-16 07:52

    在進行低功耗設計時如何優化CW32L083系列微控制器的功耗?

    在進行低功耗設計時,如何優化CW32L083系列微控制器的功耗?
    發表于 12-16 06:03

    請問CW32L083如何實現AUTOTRIM時鐘校準?

    如題,CW32L083如何實現AUTOTRIM時鐘校準?有沒有HSIOSC時鐘校準編程示例?
    發表于 12-16 06:02

    請問如何利用CW32L083系列微控制器的內部Flash存儲器進行程序升級和數據存儲?

    如何利用CW32L083系列微控制器的內部Flash存儲器進行程序升級和數據存儲?
    發表于 12-15 07:39

    在開發過程中如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?

    在開發過程中,如何利用CW32L083系列微控制器的官方固件庫進行程序編寫和調試?
    發表于 12-15 07:23

    CW32L083系列微控制器的時鐘配置有哪些選項?

    CW32L083系列微控制器的時鐘配置有哪些選項?如何選擇合適的時鐘源?
    發表于 12-15 07:09

    CW32L083的基本定時器

    CW32L083 內部集成 3 個基本定時器 (BTIM),每個 BTIM 完全獨立且功能完全相同,各包含一個 16bit 自動重裝 載計數器并由一個可編程預分頻器驅動。BTIM 支持定時器模式
    發表于 12-15 06:23

    在使用CW32L083系列微控制器時如何配置中斷向量表?

    在使用CW32L083系列微控制器時,如何配置中斷向量表?
    發表于 12-15 06:17

    在使用CW32L083系列微控制器時如何進行系統復位和看門狗定時器配置?

    在使用CW32L083系列微控制器時,如何進行系統復位和看門狗定時器配置?
    發表于 12-10 06:46

    CW32L083的內置獨立校準的RTC這一般怎么玩?

    CW32L083的內置獨立校準的RTC這一般怎么玩?
    發表于 12-09 07:04

    CW32L083系列微控制器有哪些主要特點?

    CW32L083系列微控制器有哪些主要特點
    發表于 12-09 06:34

    CW32L083有哪些應用場景?

    CW32L083有哪些應用場景
    發表于 11-24 07:37