STM32F103RCT6 SHT10驱动程序
时间: 2023-06-13 21:07:55 浏览: 105
以下是一个简单的STM32F103RCT6驱动SHT10的程序示例:
```C
#include "stm32f10x.h"
#define SHT10_GPIO_RCC RCC_APB2Periph_GPIOB
#define SHT10_SCL_PIN GPIO_Pin_6
#define SHT10_SDA_PIN GPIO_Pin_7
#define SHT10_GPIO_PORT GPIOB
void Delay_us(u32 nCount)
{
u32 i;
for(i=0;i<nCount;i++);
}
void SHT10_SCL_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SHT10_SCL_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SHT10_GPIO_PORT, &GPIO_InitStructure);
}
void SHT10_SDA_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SHT10_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SHT10_GPIO_PORT, &GPIO_InitStructure);
}
void SHT10_SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SHT10_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SHT10_GPIO_PORT, &GPIO_InitStructure);
}
void SHT10_Start(void)
{
SHT10_SDA_OUT();
SHT10_SCL_OUT();
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(100);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(5);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(100);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(100);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(100);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
}
void SHT10_Ack(void)
{
SHT10_SDA_IN();
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
while(GPIO_ReadInputDataBit(SHT10_GPIO_PORT, SHT10_SDA_PIN) != RESET);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
SHT10_SDA_OUT();
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(5);
}
void SHT10_Nack(void)
{
SHT10_SDA_IN();
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
SHT10_SDA_OUT();
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(5);
}
void SHT10_WriteByte(u8 dat)
{
u8 i;
SHT10_SDA_OUT();
for(i=0;i<8;i++)
{
if(dat&0x80)
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
else
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
dat<<=1;
Delay_us(5);
}
SHT10_SDA_IN();
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
while(GPIO_ReadInputDataBit(SHT10_GPIO_PORT, SHT10_SDA_PIN) != RESET);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
SHT10_SDA_OUT();
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SDA_PIN);
Delay_us(5);
}
u8 SHT10_ReadByte(u8 ack)
{
u8 i, dat=0;
SHT10_SDA_IN();
for(i=0;i<8;i++)
{
dat<<=1;
GPIO_ResetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
GPIO_SetBits(SHT10_GPIO_PORT, SHT10_SCL_PIN);
Delay_us(5);
if(GPIO_ReadInputDataBit(SHT10_GPIO_PORT, SHT10_SDA_PIN) != RESET)
dat|=0x01;
else
dat&=0xfe;
}
if(ack)
SHT10_Ack();
else
SHT10_Nack();
return dat;
}
void SHT10_Measure(u16 *pT, u16 *pRH)
{
u16 t, rh;
SHT10_Start();
SHT10_WriteByte(0x03);
while(GPIO_ReadInputDataBit(SHT10_GPIO_PORT, SHT10_SDA_PIN) != RESET);
t=SHT10_ReadByte(1);
t<<=8;
t|=SHT10_ReadByte(1);
t&=0xfffc;
rh=SHT10_ReadByte(1);
rh<<=8;
rh|=SHT10_ReadByte(0);
*pT=t;
*pRH=rh;
}
int main()
{
u16 t, rh;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SHT10_GPIO_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = SHT10_SCL_PIN | SHT10_SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SHT10_GPIO_PORT, &GPIO_InitStructure);
while(1)
{
SHT10_Measure(&t, &rh);
Delay_us(1000);
}
}
```
在这个程序中,需要使用定时器或延迟函数来实现微秒级的延时。另外,需要根据SHT10的规格书,设置正确的时序和协议来进行通信。
阅读全文