微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32 DS18B20代码详解

STM32 DS18B20代码详解

时间:11-13 来源:互联网 点击:

//存储的温度是16 位的带符号扩展的二进制补码形式
//当工作在12位分辨率时,其中5个符号位,7个整数位,4个小数位

// |---------整数----------|-----小数 分辨率 1/(2^4)=0.0625----|
//低字节 | 2^3 | 2^2 | 2^1 | 2^0 | 2^(-1) | 2^(-2) | 2^(-3) | 2^(-4) |

// |-----符号位:0->正 1->负-------|-----------整数-----------|
//高字节 | s | s | s | s | s | 2^6 | 2^5 | 2^4 |
//温度 = 符号位 + 整数 + 小数*0.0625

float DS18B20_Get_Temp(uint8_t*a,uint16_tgo_temp,uint8_tb)
{
uint8_t tpmsb, tplsb;
short s_tem;
float f_tem;
int temp_num;

DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); // 跳过 ROM
DS18B20_Match_Serial(b); //匹配序列号
DS18B20_Write_Byte(0X44); // 开始转换

DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0XCC); //跳过 ROM
DS18B20_Match_Serial(b); //匹配序列号
DS18B20_Write_Byte(0XBE); //读温度值

tplsb = DS18B20_Read_Byte();
tpmsb = DS18B20_Read_Byte();

s_tem = tpmsb<8;
s_tem = s_tem | tplsb;

if( s_tem < 0 ) //负温度
{
f_tem = (~s_tem+1) * 0.0625;
temp_num = (~s_tem+1) * 0.0625*10;
go_temp= temp_num;
if(temp_num>=1000)
{
a[0]=-;
a[1]= temp_num/1000+0;
a[2]= temp_num%1000/100+0;
a[3]= temp_num%100/10+0;
a[4]=.;
a[5]= temp_num%10+0;
a[6]= \0;
}
else
{
a[0]=-;
a[1]= temp_num/100+0;
a[2]= temp_num%100/10+0;
a[3]=.;
a[4]=temp_num%10+0;
a[5]= \0;
}
}
else
{
f_tem = s_tem * 0.0625;
temp_num = s_tem * 0.0625*10;
go_temp= temp_num;
if(temp_num>=1000)
{
a[0]=+;
a[1]= temp_num/1000+0;
a[2]= temp_num%1000/100+0;
a[3]= temp_num%100/10+0;
a[4]=.;
a[5]= temp_num%10+0;
a[6]= \0;
}
else
{
a[0]=+;
a[1]= temp_num/100+0;
a[2]= temp_num%100/10+0;
a[3]=.;
a[4]=temp_num%10+0;
a[5]= \0;
}
}
return f_tem;
}

void read_serial(uint8_t *serial) //读取序列号
{
uint8_t i;
DS18B20_Rst();
DS18B20_Presence();
DS18B20_Write_Byte(0X33); //读取序列号指令
for(i=0;i<8;i++)
serial[i] = DS18B20_Read_Byte();
}

----------------第三部分是-------------main.c--------------

int main(void)
{
int go_num;

uint8_t *temp_ds18b20;

USART1_Config();
printf("多个DS18B20温度读取实验!\r\n");
while(1)
{

DS18B20_Get_Temp(temp_ds18b20,go_num,3);

printf("%d\r\n",go_num);

Delay_Ms(200);

DS18B20_Get_Temp(temp_ds18b20,go_num,2);
printf("%d\r\n",go_num);

Delay_Ms(200);

DS18B20_Get_Temp(temp_ds18b20,go_num,1);
printf("%d\r\n",go_num);

Delay_Ms(200);

}
}

-----------------串口接收----------------

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top