• 方案介紹
    • 一、環(huán)境介紹
    • 二、SHT30介紹
    • 三、設(shè)備運(yùn)行效果
    • ?四、設(shè)備代碼
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

STM32F103ZE+SHT30檢測(cè)環(huán)境溫度與濕度(IIC模擬時(shí)序)

02/04 08:35
1314
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、環(huán)境介紹

工程編譯軟件:? keil5

溫濕度傳感器: SHT30

MCU : STM32F103ZET6

程序采用模塊化編程,iic時(shí)序?yàn)橐粋€(gè)模塊(iic.c 和 iic.h),SHT30為一個(gè)模塊(sht30.c 和 sht30.h);IIC時(shí)序采用模擬時(shí)序方式實(shí)現(xiàn),IO口都采用宏定義方式,方便快速移植到其他平臺(tái)使用。

工程源碼完整下載地址:
https://download.csdn.net/download/xiaolong1126626497/18973724

二、SHT30介紹

特點(diǎn):

1. 濕度和溫度傳感器
2. 完全校準(zhǔn)、線性化和溫度
3. 補(bǔ)償數(shù)字輸出,寬電源電壓范圍,從2.4 V到5.5 V
4. I2C接口,通信速度高達(dá)1MHz和兩個(gè)用戶可選地址
5. 典型精度 +-?2%相對(duì)濕度和+- 0.3°C
6. 啟動(dòng)和測(cè)量時(shí)間非???br /> 7. 微型8針DFN封裝

這是SHT30的7位IIC設(shè)備地址:? ?

三、設(shè)備運(yùn)行效果

這是串口打印的數(shù)據(jù):

?四、設(shè)備代碼

4.1? main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include "iic.h"
#include "sht3x.h"

int main()
{
   float Humidity;
   float Temperature;
   USART1_Init(115200);
   USART1_Printf("設(shè)備運(yùn)行正常....rn");
   IIC_Init(); 
   Init_SHT30();
   while(1)
   {
       //讀取溫濕度
       SHT3x_ReadData(&Humidity,&Temperature);
       USART1_Printf("溫度:%0.2f,濕度:%0.2frn",Temperature,Humidity);
       delay_ms(1000);
   }
}

4.2 sht30.c

#include "sht3x.h"

const int16_t POLYNOMIAL = 0x131;

/***************************************************************
* 函數(shù)名稱: SHT30_reset
* 說(shuō)    明: SHT30復(fù)位
* 參    數(shù): 無(wú)
* 返 回 值: 無(wú)
***************************************************************/
void SHT30_reset(void)
{
    u8 r_s;
    
    IIC_Start(); //發(fā)送起始信號(hào)
    
    IIC_WriteOneByteData(SHT30_AddrW); //寫設(shè)備地址
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:1rn");

    IIC_WriteOneByteData(0x30); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:2rn");
    
    IIC_WriteOneByteData(0xA2); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:3rn");
    
    IIC_Stop(); //停止信號(hào) 

    delay_ms(50);    
}


/***************************************************************
* 函數(shù)名稱: Init_SHT30
* 說(shuō)    明: 初始化SHT30,設(shè)置測(cè)量周期
* 參    數(shù): 無(wú)
* 返 回 值: 無(wú)
***************************************************************/
void Init_SHT30(void)
{
     u8 r_s;
    
    IIC_Start(); //發(fā)送起始信號(hào)
    
    IIC_WriteOneByteData(SHT30_AddrW); //寫設(shè)備地址
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:1rn");

    IIC_WriteOneByteData(0x22); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:2rn");
    
    IIC_WriteOneByteData(0x36); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("Init_SHT30_error:3rn");
    
    IIC_Stop(); //停止信號(hào)  
    
    delay_ms(200);
}


/***************************************************************
* 函數(shù)名稱: SHT3x_CheckCrc
* 說(shuō)    明: 檢查數(shù)據(jù)正確性
* 參    數(shù): data:讀取到的數(shù)據(jù)
						nbrOfBytes:需要校驗(yàn)的數(shù)量
						checksum:讀取到的校對(duì)比驗(yàn)值
* 返 回 值: 校驗(yàn)結(jié)果,0-成功		1-失敗
***************************************************************/
u8 SHT3x_CheckCrc(char data[], char nbrOfBytes, char checksum)
{
	
    char crc = 0xFF;
    char bit = 0;
    char byteCtr ;
	
    //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);
        }
    }
	
    if(crc != checksum)
		return 1;
    else
		return 0;
	
}

/***************************************************************
* 函數(shù)名稱: SHT3x_CalcTemperatureC
* 說(shuō)    明: 溫度計(jì)算
* 參    數(shù): u16sT:讀取到的溫度原始數(shù)據(jù)
* 返 回 值: 計(jì)算后的溫度數(shù)據(jù)
***************************************************************/
float SHT3x_CalcTemperatureC(unsigned short u16sT)
{
	
    float temperatureC = 0;            // variable for result

    u16sT &= ~0x0003;           // clear bits [1..0] (status bits)
    //-- calculate temperature [℃] --
    temperatureC = (175 * (float)u16sT / 65535 - 45); //T = -45 + 175 * rawValue / (2^16-1)
	
    return temperatureC;
	
}

/***************************************************************
* 函數(shù)名稱: SHT3x_CalcRH
* 說(shuō)    明: 濕度計(jì)算
* 參    數(shù): u16sRH:讀取到的濕度原始數(shù)據(jù)
* 返 回 值: 計(jì)算后的濕度數(shù)據(jù)
***************************************************************/
float SHT3x_CalcRH(unsigned short u16sRH)
{
	
    float humidityRH = 0;              // variable for result
	
    u16sRH &= ~0x0003;          // clear bits [1..0] (status bits)
    //-- calculate relative humidity [%RH] --
    humidityRH = (100 * (float)u16sRH / 65535);  // RH = rawValue / (2^16-1) * 10
	
    return humidityRH;
	
}


//讀取溫濕度數(shù)據(jù)
void SHT3x_ReadData(float *Humidity,float *Temperature)
{
    char  data[3];    //data array for checksum verification
    u8 SHT3X_Data_Buffer[6]; 																		//byte 0,1 is temperature byte 4,5 is humidity
    u8 r_s=0;
    u8 i;
    unsigned short tmp = 0;
    uint16_t dat;
    
    IIC_Start(); //發(fā)送起始信號(hào)
    
    IIC_WriteOneByteData(SHT30_AddrW); //寫設(shè)備地址
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("SHT3X_error:1rn");

    IIC_WriteOneByteData(0xE0); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("SHT3X_error:2rn");
    
    IIC_WriteOneByteData(0x00); //寫數(shù)據(jù)
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("SHT3X_error:3rn");
    
    //IIC_Stop(); //停止信號(hào) 
    
   // DelayMs(30); //等待
    
    //讀取sht30傳感器數(shù)據(jù)
    IIC_Start(); //發(fā)送起始信號(hào)
    IIC_WriteOneByteData(SHT30_AddrR);
    r_s=IIC_GetACK();//獲取應(yīng)答
    if(r_s)printf("SHT3X_error:7rn");
    
    for(i=0;i<6;i++)
    {
        SHT3X_Data_Buffer[i]=IIC_ReadOneByteData(); //接收數(shù)據(jù)
        if(i==5)
        {
             IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
            break;
        }
        IIC_SendACK(0); //發(fā)送應(yīng)答信號(hào)
    }
    IIC_Stop(); //停止信號(hào)
    
    //    /* check tem */
    data[0] = SHT3X_Data_Buffer[0];
    data[1] = SHT3X_Data_Buffer[1];
    data[2] = SHT3X_Data_Buffer[2];

    tmp=SHT3x_CheckCrc(data, 2, data[2]);
    if( !tmp ) /* value is ture */
    {
        dat = ((uint16_t)data[0] << 8) | data[1];
        *Temperature = SHT3x_CalcTemperatureC( dat );    
    }

    //    /* check humidity */
    data[0] = SHT3X_Data_Buffer[3];
    data[1] = SHT3X_Data_Buffer[4];
    data[2] = SHT3X_Data_Buffer[5];

    tmp=SHT3x_CheckCrc(data, 2, data[2]);
    if( !tmp ) /* value is ture */
    {
        dat = ((uint16_t)data[0] << 8) | data[1];
        *Humidity = SHT3x_CalcRH( dat );    
    }
}

4.3 iic.c

#include "iic.h"

/*
函數(shù)功能:IIC接口初始化
硬件連接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
	RCC->APB2ENR|=1<<3;//PB
	GPIOB->CRL&=0x00FFFFFF;
	GPIOB->CRL|=0x33000000;
	GPIOB->ODR|=0x3<<6;
}

/*
函數(shù)功能:IIC總線起始信號(hào)
*/
void IIC_Start(void)
{
    IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
    IIC_SDA_OUT=1; 		 //數(shù)據(jù)線拉高
    IIC_SCL=1;     		 //時(shí)鐘線拉高
    DelayUs(4);        //電平保持時(shí)間
    IIC_SDA_OUT=0; 		 //數(shù)據(jù)線拉低
    DelayUs(4);        //電平保持時(shí)間
    IIC_SCL=0;     		 //時(shí)鐘線拉低
}


/*
函數(shù)功能:IIC總線停止信號(hào)
*/
void IIC_Stop(void)
{
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SDA_OUT=0; 		 //數(shù)據(jù)線拉低
		IIC_SCL=0;     		 //時(shí)鐘線拉低
		DelayUs(4);        //電平保持時(shí)間
		IIC_SCL=1;     		 //時(shí)鐘線拉高
		DelayUs(4);        //電平保持時(shí)間
		IIC_SDA_OUT=1; 		 //數(shù)據(jù)線拉高
}

/*
函數(shù)功能:獲取應(yīng)答信號(hào)
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
		u8 cnt=0;
		IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
		IIC_SDA_OUT=1; 		  //數(shù)據(jù)線上拉
	  DelayUs(2);         //電平保持時(shí)間
		IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
		DelayUs(2);         //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
	  IIC_SCL=1;     		  //時(shí)鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在開(kāi)始讀取數(shù)據(jù)
		while(IIC_SDA_IN)   //等待從機(jī)應(yīng)答信號(hào)
		{
				cnt++;
				if(cnt>250)return 1;
		}
		IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
		return 0;
}

/*
函數(shù)功能:主機(jī)向從機(jī)發(fā)送應(yīng)答信號(hào)
函數(shù)形參:0表示應(yīng)答,1表示非應(yīng)答
*/
void IIC_SendACK(u8 stat)
{
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SCL=0;     		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
		if(stat)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送非應(yīng)答信號(hào)
		else IIC_SDA_OUT=0; 	 //數(shù)據(jù)線拉低,發(fā)送應(yīng)答信號(hào)
		DelayUs(2);            //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
		IIC_SCL=1;     		     //時(shí)鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
		DelayUs(2);            //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
		IIC_SCL=0;     		  	 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
}


/*
函數(shù)功能:IIC發(fā)送1個(gè)字節(jié)數(shù)據(jù)
函數(shù)形參:將要發(fā)送的數(shù)據(jù)
*/
void IIC_WriteOneByteData(u8 data)
{
		u8 i;
		IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
		IIC_SCL=0;     		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
		for(i=0;i<8;i++)
		{
				if(data&0x80)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送1
				else IIC_SDA_OUT=0; 	 //數(shù)據(jù)線拉低,發(fā)送0
				IIC_SCL=1;     		     //時(shí)鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
				DelayUs(2);            //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
				IIC_SCL=0;     		 		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
				DelayUs(2);            //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
				data<<=1;              //先發(fā)高位
		}
}


/*
函數(shù)功能:IIC接收1個(gè)字節(jié)數(shù)據(jù)
返 回 值:收到的數(shù)據(jù)
*/
u8 IIC_ReadOneByteData(void)
{
		u8 i,data;
		IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
	  for(i=0;i<8;i++)
	  {
			 	IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
				DelayUs(2);         //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
				IIC_SCL=1;     		  //時(shí)鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在正在讀取數(shù)據(jù)
				data<<=1;           
				if(IIC_SDA_IN)data|=0x01;
				DelayUs(2);         //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
	  }
		IIC_SCL=0;     		  		//時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù) (必須拉低,否則將會(huì)識(shí)別為停止信號(hào))
		return data;
}


  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦