DS18B20寄生电源供电

2019-07-15 18:32发布

请问大神1、单个DS18B20使用寄生电源供电,不加MOS管强上拉可以正常工作吗?如下图。

2,、如果MOS管用9015三极管代替可以吗?
为啥我的程序用外部电源供电可以正常工作,用寄生电源供电就不能正常工作,开始转换后有延时500ms了呀?

#include <pic.h>
#include "ds18b20.h"

#define _XTAL_FREQ 4000000 //使用__delay_us()和__delay_ms()必须宏定义



//*************************DS18B20初始化函数************************
uchar init_ds18b20()
{
        uchar x=0;
        DQ=0;
        DQ_DIR=0;                        //单片机将DQ拉低
        __delay_us(495);                //精确延时495us  大于480us
        DQ_DIR=1;                                //拉高总线
        __delay_us(80);                        //延时80us       大于60us
        x=DQ;               //读端口如果x=0则初始化成功 x=1则初始化失败
        __delay_us(495);      //精确延时495us  大于480us
        DQ_DIR=1;
        return x;       
}

//***************************读一个字节函数**********************
uint read_ds18b20()
{
        uchar i;
        uint dat=0;
        for(i=0;i<8;i++)       
        {               
                DQ_DIR=1;
                DQ=0;       
                DQ_DIR=0;                        //拉低总线   
                __delay_us(7);                //延时至少1us
                DQ_DIR=1;                        //拉高总线
                __delay_us(4);                //延时1us以上读数
                   dat>>=1;            //数据右移,读顺序(先低后高)
                if(DQ)
                {
                        dat|=0x80;
                }
                __delay_us(65);                //保持60us以上
        }
        return(dat);
}

//***************************写一个字节函数**********************
void write_ds18b20(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DQ=0;       
                DQ_DIR=0;                        //拉低总线       
                __delay_us(5);                //拉低保持1us以上
                DQ=dat&0x01;                //写数据,低位先写
                   __delay_us(65);       //写时序至少保持60us以上
                dat>>=1;
                DQ_DIR=1;                        //拉高总线
                __delay_us(5);                //两次写保持1us以上
               
        }
}

//***************************启动温度转换**********************
void ds18b20_startconvert()
{
//        SETUP_DIR=1;
        init_ds18b20();
        write_ds18b20(ds18b20_skip_rom);
        write_ds18b20(ds18b20_convert_ram);
//        SETUP_DIR=0;
//        SETUP=0;
        __delay_ms(500);


}

//**********************获取温度值**************************
uint ds18b20_getconvert()
{
        uint Temperature_L=0;
        uint Temperature_H=0;
        uint  t;

//        SETUP_DIR=1;

        init_ds18b20();                           //初始化DS18B20
        write_ds18b20(ds18b20_skip_rom); //跳过读序号列号的操作
        write_ds18b20(ds18b20_read_ram); //读取温度寄存器等(共可读9个寄存器)前两个就是温度
        Temperature_L=read_ds18b20();    //读取低八位温度值
        Temperature_H=read_ds18b20();    //读取高八位温度值

        t=(Temperature_H<<8)|Temperature_L;
        t=(uint)(t*0.0625*100);       
        return t;
               
}

//**********************设置报警值和分辨率**************************
void writeram_ds18b20()
{       
        init_ds18b20();                                                //初始化DS18B20
        write_ds18b20(ds18b20_skip_rom);        //跳过读序号列号的操作
        write_ds18b20(ds18b20_write_ram);        //写RAM的操作,配置报警值上下限和分辨率
        write_ds18b20(0x3c);                                //设定报警上限值TH为60度
        write_ds18b20(0x00);                                //设定报警下限值TL为0度
        write_ds18b20(0x1f);                                //设定分辨率为9位,0x1f, 0x3f, 0x5f ,0x7f(默认)温度读数
                                                                                //分辨率分别对应 0.5, 0.25, 0.125 ,0.0625(默认)
        init_ds18b20();
        write_ds18b20(ds18b20_skip_rom);
        write_ds18b20(ds18b20_copy_ram);        //把RAM的TH,TL,CFG中的内容复制到EEPROM
       
}




#include <pic.h>
#include "delay.h"
#include "display.h"
#include "ds18b20.h"

#define _XTAL_FREQ 4000000
__CONFIG(0X3F3A);
/* 11 1111 0011 1010程序加密关,在线调试关,低压编程关,掉电复位关,延时定时器开,看门狗关,HS振荡器*/

void ds18b20_startconvert();
uint ds18b20_getconvert();
void writeram_ds18b20();

uchar t_hum;
uchar t_ten;
uchar t_bit;
uchar t_dian;
uint temp;


void main()
{       
        display_init();       
        while(1)
        {
                ds18b20_startconvert();
                temp=ds18b20_getconvert();
                t_hum=temp/1000 ;
                t_ten=temp%1000/100;
                t_bit=temp%100/10;
                t_dian=temp%10;
               
                display(t_hum,t_ten,t_bit,t_dian,10);     
        }               
}

未命名.JPG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
piqiang
1楼-- · 2019-07-15 22:16
 精彩回答 2  元偷偷看……
piqiang
2楼-- · 2019-07-16 00:23
还要延时750ms,12位精度500ms不够
caoxiangdechunt
3楼-- · 2019-07-16 06:05
拉高总线 拉低总线这是什么意思
djk0125
4楼-- · 2019-07-16 07:34
不错,按照大神的指点,已经读到数据了!!!非常感谢啊 !!!!

一周热门 更多>