ds18b20温度传感器stm32代码
时间: 2023-09-10 13:05:40 浏览: 71
ds18b20温度传感器代码
以下是使用STM32读取DS18B20温度传感器的代码示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#define DQ_OUT_H GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET) //输出高电平
#define DQ_OUT_L GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET) //输出低电平
#define DQ_IN GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) //读取输入电平
void DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1); //初始化为高电平
}
//复位DS18B20
void DS18B20_Reset(void)
{
DQ_OUT_L; //先将总线拉低
delay_us(750); //拉低750us
DQ_OUT_H; //再将总线拉高
delay_us(15); //等待15us
while(DQ_IN); //等待DS18B20的回应
delay_us(280); //等待DS18B20的回应
}
//向DS18B20写一个字节
void DS18B20_WriteByte(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
if(dat&0x01) //写1
{
DQ_OUT_L; //拉低总线
delay_us(2); //等待2us
DQ_OUT_H; //拉高总线
delay_us(60); //等待60us,保证写入成功
}
else //写0
{
DQ_OUT_L; //拉低总线
delay_us(60); //等待60us
DQ_OUT_H; //拉高总线
delay_us(2); //等待2us
}
dat>>=1; //准备写下一位
}
}
//从DS18B20读一个字节
u8 DS18B20_ReadByte(void)
{
u8 i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1; //先将dat右移一位
DQ_OUT_L; //拉低总线
delay_us(2); //等待2us
DQ_OUT_H; //拉高总线
delay_us(2); //等待2us
if(DQ_IN) dat|=0x80; //如果读到高电平,则将dat的最高位设置为1
delay_us(60); //等待60us
}
return dat;
}
//从DS18B20读取温度值
float DS18B20_ReadTemp(void)
{
u8 i;
float temp;
DS18B20_Reset(); //复位
DS18B20_WriteByte(0xCC); //跳过ROM操作
DS18B20_WriteByte(0x44); //启动温度转换
while(!DS18B20_ReadByte()); //等待转换完成
DS18B20_Reset(); //复位
DS18B20_WriteByte(0xCC); //跳过ROM操作
DS18B20_WriteByte(0xBE); //读取温度值
temp=DS18B20_ReadByte(); //先读取低8位
temp|=((float)DS18B20_ReadByte()<<8); //再读取高8位
temp/=16; //转换为摄氏度
return temp;
}
int main(void)
{
float temp;
DS18B20_Init();
while(1)
{
temp=DS18B20_ReadTemp();
//将温度值发送到串口或LCD等外设
}
}
```
需要注意的是,上面的代码中使用了一个名为`delay_us()`的延时函数,该函数需要自行实现。在STM32中,可以使用定时器或SysTick定时器来实现微秒级延时。
阅读全文