sht10代码.docx
《sht10代码.docx》由会员分享,可在线阅读,更多相关《sht10代码.docx(23页珍藏版)》请在冰豆网上搜索。
![sht10代码.docx](https://file1.bdocx.com/fileroot1/2022-10/28/1e550058-b462-418e-8690-0f8dbfa1610d/1e550058-b462-418e-8690-0f8dbfa1610d1.gif)
sht10代码
xukai871105xukai871105当前离线
积分11012楼
楼主|发表于2011-11-1717:
02:
52|只看该作者
/*Includes
------------------------------------------------------------------*/
#include"stm32f10x.h"
#include"usart1.h"
#include"stdio.h"
/*Privatetypedef
-----------------------------------------------------------*/
/*Privatedefine
------------------------------------------------------------*/
#defineSDA_H()GPIO_SetBits(GPIOB,GPIO_Pin_0)
#defineSDA_L()GPIO_ResetBits(GPIOB,GPIO_Pin_0)
#defineSCK_H()GPIO_SetBits(GPIOB,GPIO_Pin_1)
#defineSCK_L()GPIO_ResetBits(GPIOB,GPIO_Pin_1)
//读SDA数据
#defineSDA_R()GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)
/*Privatemacro
-------------------------------------------------------------*/
#definenoACK0//无应答
#defineACK1//应答
#defineSTATUS_REG_W0x06//00000110
#defineSTATUS_REG_R0x07//00000111
#defineMEASURE_TEMP0x03//00000011
#defineMEASURE_HUMI0x05//00000101
#defineRESET0x1e//00011110
/*Privatevariables
---------------------------------------------------------*/
enum{TEMP,HUMI};
uint8_tTest_Timetick=0;
uint16_tTest_Counter=0;
/*Privatefunctionprototypes
-----------------------------------------------*/
voidRCC_Config(void);
voidUSART1_Config(void);
voidSHT10_Config(void);
voidSHT10_SDAIn(void);
voidSHT10_SDAOut(void);
voidSHT10_Delay(void);
uint8_tSHT10_WriteByte(uint8_tvalue);
uint8_tSHT10_ReadByte(uint8_tAck);
voidSHT10_Start(void);
voidSHT10_ConReset(void);
uint8_tSHT10_Measure(uint16_t*pValue,uint8_t*pCheckSum,uint8_tmode);
voidSHT10_Cal(uint16_tTemp,uint16_tHum,float*pTempValue,float*pHumValue);
/*Privatefunctions
---------------------------------------------------------*/
/**
*@brief主程序
*@param无
*@retval无
*/
intmain(void)
{
//温度结果16bit
uint16_tTempValue;
//湿度结果16bit
uint16_tHumValue;
//温度转换结果
floatTempResult;
//湿度转换结果
floatHumResult;
//校验值
uint8_tCheckValue=0x00;
//错误
uint8_terror=0x00;
//初始化RCC
RCC_Config();
USART1_Config();
SHT10_Config();
printf("Start\n");
while
(1)
{
if(Test_Timetick)
{
Test_Timetick=0;
Test_Counter++;
//延时2000ms
if(Test_Counter>2000)
{
Test_Counter=0;
printf("启动转换!
\n");
//SHT10连接
SHT10_ConReset();
//获得温度和湿度数据,16位格式
error+=SHT10_Measure(&TempValue,&CheckValue,TEMP);
error+=SHT10_Measure(&HumValue,&CheckValue,HUMI);
//温度湿度计算,浮点数形式
SHT10_Cal(TempValue,HumValue,&TempResult,&HumResult);
//通过串口输出,温度和湿度数据
printf("温度%2.1fC湿度%2.1f%%\n",TempResult,HumResult);
}
}
}
}
/**
*@brief初始化Systick定时器
*@paramNone
*@retvalNone
*/
voidRCC_Config(void)
{
//Systick时钟每1ms触发一次
if(SysTick_Config(SystemCoreClock/1000))
{
//
while
(1);
}
}
/**
*@brief初始化SHT10IO口
*@paramNone
*@retvalNone
*/
voidSHT10_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//使能GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//PB0SDA推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//PB1SCK推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**
*@brief配置为输入状态
*@paramNone
*@retvalNone
*/
voidSHT10_SDAIn(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//PB0SDA浮动输入,外部有上拉电阻
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**
*@brief配置为输出状态
*@paramNone
*@retvalNone
*/
voidSHT10_SDAOut(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
//PB0SDA推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**
*@brief配置为输出状态
*@param写数据
*@retval应答
*/
uint8_tSHT10_WriteByte(uint8_tvalue)
{
uint8_ti,error=0;
//SDA输出
SHT10_SDAOut();
for(i=0x80;i>0;i/=2)
{
if(i&value)
SDA_H();
else
SDA_L();
SHT10_Delay();
SCK_H();
SHT10_Delay();
SCK_L();
SHT10_Delay();
}
//SDA输入
SHT10_SDAIn();
SCK_H();
error=SDA_R();//读应答位
SCK_L();
returnerror;
}
/**
*@brief读数据
*@param应答
*@retval返回数据
*/
uint8_tSHT10_ReadByte(uint8_tAck)
{
uint8_ti,val=0;
//输入状态
SHT10_SDAIn();
for(i=0x80;i>0;i/=2)
{
SHT10_Delay();
SCK_H();
SHT10_Delay();
if(SDA_R())
val=(val|i);//读数据
SCK_L();
}
//输出状态
SHT10_SDAOut();
if(Ack)
SDA_L();//应答为低电平
else
SDA_H();
SHT10_Delay();
SCK_H();
SHT10_Delay();
SCK_L();
SHT10_Delay();