SHT30源碼 溫濕度傳感器IIC源碼C stm32平臺
0.png (3.96 KB, 下載次數: 163)
下載附件
2018-2-2 16:21 上傳
單片機源程序如下:
- /*******************************************************************************
- *Filename: sht30_dis.c
- *Revised: $Date: 06-15 15:23 $
- *Author: double
- *Description: 溫濕度傳感器驅動
- *******************************************************************************
- *************************引腳配置**********************************************
- *******************************************************************************
- *
- * --------------------
- * | PB7 |--> SCL
- * | PB6 |--> SDA
- * --------------------
- *******************************************************************************/
- #include "sht30_dis.h"
- unsigned char TemValue = 0;
- unsigned char RhValue = 0;
- unsigned char buffer[6];
- //IIC所有操作函數
- //void IIC_Init(void); //初始化IIC的IO口
- void SCL_L(void);
- void SCL_H(void);
- void SDA_L(void);
- void SDA_H(void);
- unsigned char SDA_Read(void);
- void i2c_delay(void);
- void i2c_noAck(void);
- void i2c_ack(void);
- void i2c_stop(void);
- void i2c_delay(void);
- unsigned char i2c_star(void);
- unsigned char i2c_waitAck(void);
- void i2c_sendByte( unsigned char byte );
- unsigned char i2c_readByte(void);
- void SHT3X_WriteCMD(unsigned int cmd);
- void SHT3X_ReadState(unsigned char *temp);
- void SHT3X_SetPeriodicMeasurement(void);
- void SHX3X_ReadResults(unsigned int cmd, unsigned char *p);
- unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes);
- unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum);
- unsigned int SHT3X_CalcTemperature(unsigned int rawValue);
- unsigned char SHT3X_CalcRH(unsigned int rawValue);
- void SHT_GetValue(void);
- /*******************************************************************************
- * @fn sht30_dis_init
- *
- * @brief 初始化
- *
- * @return none
- *
- ******************************************************************************/
- void sht30_dis_init(void){
-
- // SCL_OUT();
-
- GPIO_InitTypeDef GPIO_InitStructure;
- // __HAL_RCC_GPIOB_CLK_ENABLE();
- // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB, GPIO_Pin_7);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空輸入,或者改成上拉輸入
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- delay_us(250);
- SHT3X_SetPeriodicMeasurement();//設置測量周期和模式
-
- delay_us(150);
- SHT_GetValue();
- delay_us(150);
- }
- void SDA_IN(void){
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //浮空輸入,或者改成上拉輸入
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- }
- void SDA_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
- void SDA_H(void)
- {
- SDA_OUT();
- IIC_SDA_H;
- }
- void SDA_L(void)
- {
- SDA_OUT();
- IIC_SDA_L;
- }
- unsigned char SDA_Read(void)
- {
- SDA_IN();
- return READ_SDA;
- }
- void SCL_H(void)
- {
- IIC_SCL_H;
- }
- void SCL_L(void)
- {
- IIC_SCL_L;
- }
- void i2c_delay(void)
- {
- // unsigned int z;
- //
- // for(z=0;z<10;z++);
- //2M時鐘,一個指令周期就行。測量速度是20ms讀取完數據
- __nop();
- }
- unsigned char i2c_star(void)
- {
- SDA_H();
- SCL_H();
- i2c_delay();
- if (!SDA_Read())
- return 1;
- SDA_L();
- i2c_delay();
- if (SDA_Read())
- return 1;
- SDA_L();
- SCL_L();
- i2c_delay();
- return 0;
- }
- void i2c_stop(void)
- {
- SCL_L();
- i2c_delay();
- SDA_L();
- i2c_delay();
- SCL_H();
- i2c_delay();
- SDA_H();
- i2c_delay();
- }
- void i2c_ack(void)
- {
- SCL_L();
- i2c_delay();
- SDA_L();
- i2c_delay();
- SCL_H();
- i2c_delay();
- SCL_L();
- i2c_delay();
- }
- void i2c_noAck(void)
- {
- SCL_L();
- i2c_delay();
- SDA_H();
- i2c_delay();
- SCL_H();
- i2c_delay();
- SCL_L();
- i2c_delay();
- }
- unsigned char i2c_waitAck(void)
- {
- unsigned char t = 200;
-
- SCL_L();
- i2c_delay();
- SDA_H();
- i2c_delay();
- //////////////////////////此處為金句,IO輸入輸出切換的瞬間有抖動,造成異常應答
- SDA_Read();
- //////////////////////////
- SCL_H();
- i2c_delay();
-
- while( SDA_Read() )
- {
- t --;
- i2c_delay();
- if(t==0)
- {
- SCL_L();
- return 1;
- }
- i2c_delay();
- }
- i2c_delay();
- SCL_L();
- i2c_delay();
- return 0;
- }
- void i2c_sendByte( unsigned char byte )
- {
- unsigned char i = 8;
- while (i--) {
- SCL_L();
- i2c_delay();
- if (byte & 0x80)
- SDA_H();
- else
- SDA_L();
- byte <<= 1;
- i2c_delay();
- SCL_H();
- i2c_delay();
- }
- SCL_L();
- i2c_delay();
- }
- unsigned char i2c_readByte(void)
- {
- unsigned char i = 8;
- unsigned char byte = 0;
- SDA_H();
- SDA_Read();
- while (i--)
- {
- byte <<= 1;
- SCL_L();
- i2c_delay();
- SCL_H();
- i2c_delay();
- if (SDA_Read())
- {
- byte |= 0x01;
- }
- }
- SCL_L();
- i2c_delay();
- return byte;
- }
- void SHT3X_WriteCMD(unsigned int cmd)
- {
- i2c_star();
- i2c_sendByte(i2cAddWrite_8bit);
- i2c_waitAck();
- i2c_sendByte(cmd>>8);
- i2c_waitAck();
- i2c_sendByte(cmd);
- i2c_waitAck();
- i2c_stop();
- }
- void SHT3X_SetPeriodicMeasurement(void)
- {
- SHT3X_WriteCMD(CMD_MEAS_PERI_2_H);
- }
- //讀取SHT30寄存器狀態
- void SHT3X_ReadState(unsigned char *temp)
- {
- i2c_star();
- i2c_sendByte(i2cAddWrite_8bit);
- i2c_waitAck();
- i2c_sendByte(0xf3);
- i2c_waitAck();
- i2c_sendByte(0X2d);
- i2c_waitAck();
-
- i2c_star();
- i2c_sendByte(i2cAddRead_8bit);
- i2c_waitAck();
- temp[0] = i2c_readByte();//高
- i2c_ack();
- temp[1] = i2c_readByte();//低
- i2c_ack();
- temp[2] = i2c_readByte();//校驗
- i2c_noAck();
-
- i2c_stop();
-
- }
- //讀取SHT30結果
- void SHX3X_ReadResults(unsigned int cmd, unsigned char *p)
- {
- i2c_star();
- i2c_sendByte(i2cAddWrite_8bit);
- i2c_waitAck();
- i2c_sendByte(cmd>>8);
- i2c_waitAck();
- i2c_sendByte(cmd);
- i2c_waitAck();
-
- i2c_star();
- i2c_sendByte(i2cAddRead_8bit);
-
- if(i2c_waitAck()==0){
- i2c_delay();
- i2c_delay();
- i2c_delay();
-
- p[0] = i2c_readByte();//溫度高
- i2c_ack();
- p[1] = i2c_readByte();//溫度低
- i2c_ack();
- p[2] = i2c_readByte();//校驗
- i2c_ack();
- p[3] = i2c_readByte();//濕度高
- i2c_ack();
- p[4] = i2c_readByte();//濕度低
- i2c_ack();
- p[5] = i2c_readByte();//校驗
- i2c_noAck();
- i2c_stop();
- }
- }
- //校驗
- unsigned char SHT3X_CalcCrc(unsigned char *data, unsigned char nbrOfBytes)
- {
- unsigned char bit; // bit mask
- unsigned char crc = 0xFF; // calculated checksum
- unsigned char byteCtr; // byte counter
- // calculates 8-Bit checksum with given polynomial
- for(byteCtr = 0; byteCtr < nbrOfBytes; byteCtr++) {
- crc ^= (data[byteCtr]);
- for(bit = 8; bit > 0; --bit) {
- if(crc & 0x80) {
- crc = (crc << 1) ^ POLYNOMIAL;
- } else {
- crc = (crc << 1);
- }
- }
- }
- return crc;
- }
- //校驗檢測
- unsigned char SHT3X_CheckCrc(unsigned char *pdata, unsigned char nbrOfBytes, unsigned char checksum)
- {
- unsigned char crc;
- crc = SHT3X_CalcCrc(pdata, nbrOfBytes);// calculates 8-Bit checksum
- if(crc != checksum)
- {
- return 1;
- }
- return 0;
- }
- //計算溫度
- unsigned int SHT3X_CalcTemperature(unsigned int rawValue)
- {
- // calculate temperature
- unsigned int temp;
- temp = (175 * (float)rawValue / 65535 - 45) ; // T = -45 + 175 * rawValue / (2^16-1)
- return temp;
- }
- //計算濕度
- unsigned char SHT3X_CalcRH(unsigned int rawValue)
- {
- // calculate relative humidity [%RH]
- unsigned char temp1 = (100 * (float)rawValue / 65535) ; // RH = rawValue / (2^16-1) * 10
- return temp1;
- }
- //讀取溫度---20ms即可讀取完成
- void SHT_GetValue(void)
- {
- unsigned char temp = 0;
- unsigned int dat;
- unsigned char p[3];
- unsigned char cnt;
- unsigned char tem_status,hum_status;
- cnt = 0;
- tem_status = 0;
- hum_status = 0;
-
- while(cnt++<2){
-
- SHX3X_ReadResults(CMD_FETCH_DATA, buffer);//獲取溫度濕度
- p[0] = buffer[0];
- p[1] = buffer[1];
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
下載:
sht30_dis.zip
(3.67 KB, 下載次數: 767)
2018-2-2 10:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|