你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
木易-357428 发表于 2015-2-3 14:153 s2 w. o" @4 b0 F8 W, |0 t0 K 一般都是读时序不对,读的延时要求非常高,时钟频率高了还好说,时钟频率低的话,多运行几句语句,DS18B20 ...
wambob 发表于 2015-2-3 17:55# S! m3 }9 U4 } 测试复位不通过
手头备一块arduino uno,验证模块好坏使用!
当然那18B20坏了只是都出来的温度是某个默认值:)
8 \" e/ e4 v2 U. k! D% f/ i! d; D
unsigned char DS18B20_Rst(void) //复位函数/ X* Z% [; o$ M% z- ~5 ?7 G* |' u
{
unsigned char retry = 0;
DS18B20_out(); //设置GPIO输出
DS18B20_PIN_H; //置1
DS18B20_PIN_L; / C ?/ d" i$ y0 W; Z2 a4 D
Delay_Us(500); //延时: J: k( V( i0 P* a7 ~* v0 R1 [3 ?5 W
DS18B20_PIN_H;
Delay_Us(30);
DS18B20_in(); //设置GPIO输入; i. _+ {9 n Q+ w
while((DS18B20_IN )&& retry < 300) //如果读到高电平,等待 调试前面都对,到这以下下出问题了,怎么修改程序也读不到18B20发出的低电平1 F0 `1 [3 o9 ]" c7 m# o4 X+ O
{ 8 n0 O9 |# [4 t7 E! f/ D0 X4 Y
retry ++;) Y. T2 L1 S0 B. Z/ }% I h
// Delay_Us(1);
}8 v, g" P/ }# j9 s2 C$ ^
if(retry >=300) //超时返回1) m/ M3 n6 k, b- Q
return 1; 3 I" D8 P7 A/ V. X
retry=0;, z7 V8 E% s. C# q4 c
( n% F5 l0 V5 S5 U
while(!(DS18B20_IN )&& retry < 300) //如果读到低电平,延时60-240US! u6 @. ?& U" q2 n
{. f% ^- A' S0 F! z: @8 `" n
retry ++;
// Delay_Us(1);( X5 a5 C+ Q |4 ?8 g0 _
}0 b0 |( y9 s8 b4 E" v
if(retry >= 300) //如果超时,返回1. I% r0 Z! k1 M! h- G- G) T4 G
return 1;
3 F# R- T5 G1 U( ~' J
return 0;$ @+ |7 }) U# e, R1 e
}
- y/ u! R$ }( T
在MAIN() //检测是否复位
{- f% O) ?# I- B- p' b# e" S7 X
if(DS18B20_Rst()==0) // 结果总是返回1 .调试进入,发现#define DS18B20_IN GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) 读输入总是为1,说明18B20 在MASTER 释放总线延时15-60US后没有发出低电平,.不要说18B20是坏的,用51单片机检测过,正常能读出温度并变化3 @( z! F! p L
GPIO_SetBits(GPIOA, GPIO_Pin_5);& h- _) n3 H. {3 v. ~
9 T% L, m# H: x
}
测试复位不通过
复位时序要求的不严格,但你首先要确定线序对的,芯片是好的。最好用示波器或逻辑分析仪捕捉一下,看看是否有存在脉冲。