单片机/MCUwilliam hill官网
登录
直播中
piqiang
10年用户
25经验值
擅长:测量仪表
私信
关注
[问答]
DS18B20寄生电源供电
开启该帖子的消息推送
电源
请问大神1、单个DS18B20使用寄生
电源
供电,不加MOS管强上拉可以正常工作吗?如下图。
2,、如果MOS管用9015三极管代替可以吗?
为啥我的程序用外部电源供电可以正常工作,用寄生电源供电就不能正常工作,开始转换后有延时500ms了呀?
#include
#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
#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);
}
}
回帖
(4)
piqiang
2014-9-19 11:16:21
寄生电源供电方式在温度开始转换后需要立即把DQ拉高
寄生电源供电方式在温度开始转换后需要立即把DQ拉高
举报
piqiang
2014-9-19 11:18:59
还要延时750ms,12位精度500ms不够
还要延时750ms,12位精度500ms不够
举报
caoxiangdechunt
2015-4-13 17:41:27
拉高总线 拉低总线这是什么意思
拉高总线 拉低总线这是什么意思
举报
djk0125
2017-4-27 17:44:26
不错,按照大神的指点,已经读到数据了!!!非常感谢啊 !!!!
不错,按照大神的指点,已经读到数据了!!!非常感谢啊 !!!!
举报
更多回帖
rotate(-90deg);
回复
相关问答
电源
DS18B20
做了个数字温度计遇到的问题
2012-04-02
3726
Arduino Uno板子做
DS18B20
温度探测,用
寄生
电源
供电
导致结果无法正常运行如何解决?
2023-01-17
726
DS18B20
数字温度计怎么使用?
2021-04-15
739
DS18B20
不可思意的问题!求解!
2016-04-22
6643
请问AVR驱动MAXIN的
DS18B20
程序哪位大神可以分享一下吗?
2018-06-26
1306
如何去实现Linux的
DS18B20
驱动程序?
2021-04-27
1211
DS18B20
温度传感器与MCU是如何连接的
2021-09-27
2735
DS18B20
数字温度传感器的驱动过程是怎样的
2021-10-26
3170
如何去实现FPGA与
DS18B20
之间的通信?
2021-05-07
1015
如何利用单片机对
DS18B20
进行编程?
2021-10-26
2427
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分