stm32f103用DS18B06测温代码
时间: 2023-06-24 20:03:05 浏览: 93
stm32f103代码
4星 · 用户满意度95%
下面是使用STM32F103和DS18B20进行温度测量的代码示例:
```c
#include "stm32f10x.h"
#include "delay.h"
#define DQ_OUT PGout(0) //DS18B20的数据线
#define DQ_IN PGin(0) //DS18B20的数据线
u8 DS18B20_Init(void); //初始化
void DS18B20_Write_Byte(u8 dat); //写一个字节
u8 DS18B20_Read_Byte(void); //读一个字节
u16 DS18B20_Read_Temp(void); //读取温度
int main(void)
{
float temp;
u16 t;
Delay_Init();
RCC->APB2ENR |= 1<<8; //使能PORTG时钟
GPIOG->CRL &= 0XFFFFFFF0; //PG0设置成输出模式
GPIOG->CRL |= 0X00000003; //最大速度输出
while(DS18B20_Init()); //初始化DS18B20
DS18B20_Write_Byte(0xcc); //跳过ROM操作
DS18B20_Write_Byte(0x44); //开始温度转换
while(1)
{
DS18B20_Init(); //初始化DS18B20
DS18B20_Write_Byte(0xcc); //跳过ROM操作
DS18B20_Write_Byte(0xbe); //发送读寄存器指令
t=DS18B20_Read_Temp(); //读取温度
temp=t*0.0625;
}
}
//初始化DS18B20
u8 DS18B20_Init(void)
{
u8 i;
DQ_OUT=0;
Delay_us(500);
DQ_OUT=1;
Delay_us(30);
i=DQ_IN;
Delay_us(500);
return i;
}
//写一个字节
void DS18B20_Write_Byte(u8 dat)
{
u8 i,j;
for (i=0;i<8;i++)
{
j=dat>>i;
j&=0x01;
DQ_OUT=0;
Delay_us(2);
DQ_OUT=j;
Delay_us(60);
DQ_OUT=1;
Delay_us(2);
}
}
//读一个字节
u8 DS18B20_Read_Byte(void)
{
u8 i,j,dat=0;
for (i=0;i<8;i++)
{
DQ_OUT=0;
Delay_us(2);
DQ_OUT=1;
Delay_us(2);
j=DQ_IN;
Delay_us(40);
dat=(j<<7)|(dat>>1);
}
return dat;
}
//读取温度
u16 DS18B20_Read_Temp(void)
{
u8 ls,ms;
u16 temp;
DS18B20_Write_Byte(0xcc); //跳过ROM操作
DS18B20_Write_Byte(0xbe); //发送读寄存器指令
ls=DS18B20_Read_Byte(); //读LSB
ms=DS18B20_Read_Byte(); //读MSB
temp=ms;
temp<<=8;
temp|=ls;
return temp;
}
```
这是一个简单的温度测量示例程序,你可以根据自己的需要进行修改和完善。
阅读全文