大家好,我在51开发板上控制DS18B20时,能够正常显示温度值。把代码移植到新唐时,发现DS18B20初始化一直不成功。DS18B20初始化代码如下:
void Init_Ds18b20(void) //DS18B20初始化
{
uint8_t DQ_RETURN = 2;//定义一个变量判断初始化成功与否
DS18B20_OUT();//设置NUC120LE03A第PA15引脚为输出
DS18B20_SET(); //DQ=1设置PA15引脚(18B20引脚)为高。
Ds18B20_Delay(5); //适当延时
DS18B20_CLR();//DQ = 0;把PA15引脚(18B20引脚)拉低
Ds18B20_Delay(85); //延时大于480us小于960us。这里用示波器量了是760us。
DS18B20_SET(); //DQ = 1 把PA15引脚(18B20引脚)拉高。
Ds18B20_Delay(2);//适当延时
DS18B20_IO_PIN();//设置PA15引脚(18B20引脚)为输入
Ds18B20_Delay(1);//适当延时以让引脚状态稳定
DQ_RETURN = DS18B20_IO_PIN();//读取PA15引脚(18B20引脚)的状态
Ds18B20_Delay(2);
DS18B20_OUT();
Ds18B20_Delay(55); //这里是不小于480us,示波器量了540us
if(DQ_RETURN==0) //判断成功与否
printf ("Sucessful!\n");
else
printf("Fail!\n");
}
这个时序跟DS18B20初始化的程序基本吻合。而且我看了数据手册写了51的代码,51的波形跟上面的波形基本上一样。但是51初始化成功。新唐却没成功。51单片机电压是5V。新唐电压是3.3V。我看了DS18B20的工作电压是3V-5.5V。但是51初始化成功,并能正常读取温度,新唐的却不可以。希望有经验的朋友指点下,在此先谢谢了! |