一、原理图
TDQ接PA6
二、CubeMX配置
PA6直接Output。开定时器3,定时10ms。
三、代码
比赛文件加进来,.h里面改为main.h。
T1和T2之间要加延时,影响主函数,我将其隔开。.h里面记得声明
void T1_pro()
{
ow_reset();
ow_byte_wr(0xCC);
ow_byte_wr(0x44);
}
float T2_pro()
{
unsigned char low,high;
float temp;
int s;
ow_reset();
ow_byte_wr(0xCC);
ow_byte_wr(0xBE);
low=ow_byte_rd();
high=ow_byte_rd();
if( high>7 )//判断正负,负数则最高位为1
{
low=~low;
high=~high;
s=0;
}
else s=1;
temp=(high<<8 | low)*0.0625;
if( s ) return temp;//正数
else return -temp;//负数
}
main.c初始化
HAL_TIM_Base_Start_IT(&htim3);
ds18b20_init_x();
主函数
float T;
unsigned int T_flag=0;
unsigned int T_time=0;
定时器里面有:
if( htim->Instance==TIM3 )//10ms
{
if( T_flag==0 )
{
T1_pro();
T_flag=1;
}
if( T_flag==1 )
{
T_time++;
}
if( T_time==45 )
{
T_time=0;
T_flag=2;
}
if( T_flag==2 )
{
T_flag=0;
T=T2_pro();
}
}
四、拓展
数码管显示(小数点没加,可以在数组里面定义)
void seg_pro()
{
unsigned int T_1,T_2,T_3;
T_1=T/10;
T_2=(unsigned int)T%10;
T_3=(unsigned int)(T*10)%10;
seg_set(T_1,T_2,T_3);
}
问题:在读取ds18b20的时候不能被中断,否则会影响他的时序,所以会读取的有时候有问题。 本代码在定时器中执行,应当不会有问题。