STM32 DS18B20代码详解
//存储的温度是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);
}
}
-----------------串口接收----------------
STM32DS18B20代码详 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)