完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问大神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个回答
|
|
寄生电源供电方式在温度开始转换后需要立即把DQ拉高
|
|
|
|
还要延时750ms,12位精度500ms不够
|
|
|
|
拉高总线 拉低总线这是什么意思
|
|
|
|
不错,按照大神的指点,已经读到数据了!!!非常感谢啊 !!!!
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12035 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 00:34 , Processed in 0.450970 second(s), Total 42, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号