请问大神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);
}
}
-
一周热门 更多>