微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请教18b20复位问题

请教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的吗?我想问题应该是在时序上面

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top