请教18b20复位问题
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c;
sbit DQ = P3^5;
sbit LED = P1^7;
void delay(uint x)
{
while(x--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
if (x = 0)
{
LED = 0;
}
}
下面是汇编
RESET_18B20: SETB DQ NOP CLR DQ MOV R0,#150 MOV R1,3TSR1:DJNZ R0,$ ;延时 DJNZ R1,TSR1 SETB DQ MOV R0,#15TSR2:JNB DQ,TSR3 DJNZ R0,TSR2 LJMP TSR4TSR3:SETB FLAG1 ;18B20存在 CLR P3.6 ;存在LED灯提示 LJMP TSR5TSR4:CLR FLAG1 ;18B20不存在 LJMP TSR7TSR5:MOV R0,#06BHTSR6:DJNZ R0,TSR6TSR7:SETB DQ RET
试了很久,汇编和C,LED提示灯都亮不了,硬件应该都没难题,请教个位大虾。
/*
* 18B20复位函数
*/
void DS18b20_reset(void)
{
bit flag=1;
while (flag)
{
while (flag)
{
DQ = 1;
delay(1);
DQ = 0;
delay(50); // 550us
DQ = 1;
delay(6); // 66us
flag = DQ;
}
delay(45); //延时500us
flag = ~DQ;
}
DQ=1;
}
给这个你参考
进来看看
谢谢,还是不行,死死跳不出循环
应该不可能啊,这个程序我都用过的
你用的晶振是12M的吗?我想问题应该是在时序上面
