ds18b20中文资料用的时候为什么要初始化啊 求解答

ds18B20的初始化 时序图_百度知道
ds18B20的初始化 时序图
看18B20的时序图的时候先将数据线拉高,则在15-60ms由18B20产生返回的低电平0,此时如果初始化成功。手册上说,延时,再拉低,延时在拉高.这个低电平可以编程来捡测吗
提问者采纳
for(i=80;检测返回的低电平
else outbit=1;0;i&
RA4=1;i&gt:bit reset(){
TRISA4=1;i&
for(i=80;i&
return outbit;
if(RA4==1) outbit=0,我注释的部分就是DS18B20返回的状态;i--);0;
for(i=52;}这时我用PIC16系列单片机写的;i--);0当然可以。在后边的程序只要判断reset()返回的数据就行了。希望我的回答能帮助到你
提问者评价
其他类似问题
为您推荐:
时序图的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁关于ds18b20初始化问题,我的板子是TQ2440,为什么初始化不了_百度知道
关于ds18b20初始化问题,我的板子是TQ2440,为什么初始化不了
/2440addr我的PCLK等于50MHZ;i &
Delay_US(1);
Delay_US(1);/ rTCNTB0 = D10) ;检测到DS18B20;/&gt,T
if(DS18B20_Reset())
return 0等待超时;/主机端口浮空输入模式
Delay_US(1);/
&#47.25; 8,精确到2位小数
/读取高八位
data = th.h里面的;主机端口推挽输出模式
Write18b20IO(1);s3c2440_
Write18b20IO(data & 0x01);
// 8;
&#47,返回1.c里面的;/&#47.h&
Delay_US(12),
/= 8;//&lt? 1 ;
Set18b20IOout();/主机端口推挽输出模式
for(i = 0; rTCFG0 |= 24;10))):#include &
///
/&#47!(rSRCPND & (1&
//等待延时到达
rSRCPND |= (1&拉低总线480us~240us
Delay_US(700);
Delay_US(30);i ++)
Set18b20IOout(); #include &等待低电平应答信号
i ++;拉低总线10-15us
/&#47? (rGPGDAT |= 1) ;
/480US延时
Write18b20IO(1),保持20-45us
Delay_US(30); rTCON
|= (1&读取温度
tl = DS18B20_ReadData(); 100)
data *= 6;T rTCON
Delay_US(42);
//
for(i = 0;i &&
Write18b20IO(1);/
DS18B20_WriteData(0xcc);
/ while(;/复位完成
Set18b20IOin();
/读取低八位
th = DS18B20_ReadData();主机端口推挽输出模式
Write18b20IO(0);= 1;///跳过读序列号
DS18B20_WriteData(0xbe);跳过回复信号
return 0x00;/
if(i &gt,读取后大约延时40-45us
data |= 0x80;1);
Delay_US(400);启动温度转换
DS18B20_Reset();清除中断标志}u8 DS18B20_Reset(void)
if(Read18b20IO())
/ rTCFG1 |= 0x0: 0)
#define Write18b20IO(x)
(void Delay_US(u32 Delay)
rTCFG0 &= (0xff);温度值扩大100倍;/
s16 DS18B20_ReadTemper(void)
u8//
/拉低总线10-15us
Delay_US(12);
&#47,初始化失败;释放总线
void DS18B20_WriteData(u8 data)
u8返回错误
DS18B20_WriteData(0xcc); Ti ++)
Write18b20IO(0);
&跳过读序列号
DS18B20_WriteData(0x44);/ #include &quot: (rGPGDAT &= 0))
s16 DS18B20_ReadTemper(void);
Write18b20IO(1);/主机端口浮空输入模式
while(Read18b20IO())
Delay_US(2);读取数据;
Set18b20IOout();
Write18b20IO(0);/= 1;1us rTCFG1 &= ~(0xf);
data &lt.h&释放总线
Set18b20IOin();/写入数据位,并且初始化成功
u8 DS18B20_ReadData(void)
u8 i.h&/DS18B20使用的是GPIOE0
#define Set18b20IOout()
(rGPGCON = (rGPGCON & 0xFFFFFFFC)|0x01)
#define Set18b20IOin()
(rGPGCON &= 0xFFFFFFFC) #define Read18b20IO()
((rGPGDAT & 1) ,data = 0;
我也用的TQ2440,DS18B20本身不能输出高电平,你要在DS的IO上拉一个10K的电阻哦。不知道你上拉了没,板子不板载DS18B20亲。但是。希望我的回答能帮助到你,应该是你外接的吧
我接到GPG0口上!现在可以了,就是测出的温度是负的,你做出来??你现在代码可以么???在线等你啊。。。。。。。。。。。。。
我没外接过DS。你读出负的温度,估计是DS没配置好
你有可以的程序??
有是有,不过不是tq的驱动,是8位单片机的程序
你认为要在IO端口上拉一个电阻才行?为什么,我对上拉电阻不清楚
因为DS本身无法输出高电平。
这上拉电阻是我们自己把DQ_UP上拉???那DQ_UP这句应该在哪里执行?真不懂啊。。大哥
不是,我是说DS的IO要主动上拉,而不是控制器的IO要上拉
其他类似问题
为您推荐:
其他1条回答
#define Write18b20IO(x)
(x ? (rGPGDAT |= 1) !怎么就能初始化了: (rGPGDAT &= 0))
这个定义的函数头
下面没有对应的程序呀
下面都是对18b20的读写那些
根本没有初始化程序!!!#define Set18b20IOout()
(rGPGCON = (rGPGCON & 0xFFFFFFFC)|0x01)
#define Set18b20IOin()
(rGPGCON &= 0xFFFFFFFC) #define Read18b20IO()
((rGPGDAT & 1) ? 1
初始化在这个函数中u8 DS18B20_Reset(void)
同学那叫复位程序
不是初始化的
绝对不是 !!你读读程序看看
嗯嗯,复位不了啊
嗯嗯,复位不了啊
哥们 初始化是初始化
复位是复位
复位就是归到原来的样子
我有51 的18b20
要的话 你可以借鉴下
大哥,在线求解啊啊啊啊啊
你能不能帮我看下哪里不对啊
tq2440的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁后使用快捷导航没有帐号?
查看: 7196|回复: 21
写个DS18B20初始化程序,死活没反应
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
周末开始做毕业设计。
首先是要用单片机读取DS18B20的数据。
看了一两天时序,基本看懂了,首先想写一个初始化程序,让单片机发现DS18B20的存在。结果发现压根没反应。
说说我做的情况。
DS18B20的硬件情况:
额,引脚是 有字的一面朝着自己,然后从左往右是 地,数据,电;
我试过直接连IO,也试过从电拉一个5.1K的上拉电阻给数据口。但是都不行。
(总不能说,PDF上给的是4.7K,我用5.1K就不行吧?)
程序,那个时序图就是一般资料里面的。
480到960us的复位脉冲。然后中间停止15到60us.
这个过程,我试过,先拉高再等待,或者先等待再拉高,貌似没啥区别。
然后,DS18B20在60到240us内发出一个低电平的存在脉冲。
而单片机要做的就是把那条线先拉高,再读取该低电平。
我试过自己写的C语言不行,那时我怀疑是时间没控制好,后来改了一个汇编的,还是不行。
再后来,我用了PDF中的一个例程,还是不行。
例程是这样的:
RESET:&&&&& MOV&&& A,&&& #4 ;设置循环次数&&&&& CLR&&& P1.0 ;发出复位脉冲&&&&& MOV&&& B,&&& #250 ;计数250 次&&&&& DJNZ&& B,&&& $ ;保持低电平500us&&&&& SETB&& P1.0 ;释放总线&&&&& MOV&&& B,&&& #6 ;设置时间常数&&&&& CLR&&& C ;清存在信号标志WAITL:JB&&&& P1.0, WH ;若总线释放跳出循环&&&&& DJNZ&& B,&&& WAITL ;总线低等待&&&&& DJNZ&& ACC,& WAITL;释放总线等待一段时间&&&&& SJMP&& SHORT& WH: MOV&&& B,&&& #111& WH1:ORL&&& C,&&& P1.0&&&&& DJNZ&& B,&&& WH1 ;存在时间等待SHORT:RET
这个例程,作用应该是,如果存在脉冲存在,则它会与CY位相或,因而,CY会是低电平。否则是高。
所以,我在主程序中,这么写:
&&&&& ORG&&& 0100HSTART:&&&&& CALL&& RESET;&&&&& JC&&&& $;&&&&& CLR&&& P1.5;&&&&& SJMP&& $;
可是,事实上,没用,灯没亮。
想不通为什么。
难道引脚错了?
难道是坏的?我昨天刚买的说。
在线时间53 小时
威望110 分
芯币180 枚
TA的帖子TA的资源
一粒金砂(中级), 积分 110, 距离下一级还需 90 积分
关键是延时有问题,还有转换时间,我有c语言的,你要的话,传一个上来,avr的和51的都有
在线时间228 小时
威望372 分
芯币2885 枚
TA的帖子TA的资源
单总线对时序要求比较严格,慢慢调试吧
在线时间109 小时
威望1648 分
芯币797 枚
E金币100 枚
TA的帖子TA的资源
当时我读那个缝隙怎么都定不准时间,用了个笨办法:多读几次缝隙,然后取几个值的逻辑与作为结果(有0出0),就准了。
Python全文搜索引擎:&url&/p/ming-search/&/url&
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
报告一下,汇编的通过了,C的还是没通过
下午郁闷了一会,先缓下,在淘宝上买nRF24L01的时候,因为感觉卖家也是个51中人,顺带就跟他吐了一下槽。
对方提示我,延时时间拉长一些,我有点奇怪。心想这时序不是要求挺高么。
然后我百无聊赖地打了好一会的打豆豆。
然后继续调试。我现在仔细看了那个例程,汇编的,感觉还是怪怪的,调长了时间,发现还是不行。
不死心,拿我自己写的汇编的,调长了 复位脉冲的时间(我挑成了大概5 到 6毫秒),结果居然可以了,我担心是意外,怕是幻觉。
我再仔细看程序,因为挺简单,几经确认,果然没错。我又用了一个办法,确认,我拔了DS18B20的DQ,发现果然就没亮LED,至此我确定了应该真的是实现了。
然后我开始着手调试C版本的,结果直到现在还是不行,郁闷的不行。
期间,跟朋友吃了晚饭,聊了一会,还看了 anqi90和鑫海宝贝提交给我的文档,给他们提出了若干建议,然后是发第二个规整贴,因为明天上班,明天是来不及发了的......
总之就是相当郁闷。C的为啥就是不行,我在仿真里仿真了好多遍,逻辑上应该是没问题了。我又反复调整了延时长度,但是始终不行。
我想,C的话应该是更难控制时间。所以我打算下一步,或许是明天晚上,或许是下周末,谁知道呢?
我会就着汇编的版本,再对比C的仿真过程中,定时器的计数状态,找出修改的方法。
在线时间109 小时
威望1648 分
芯币797 枚
E金币100 枚
TA的帖子TA的资源
回复 5楼 辛昕 的帖子
用C的延时可能时间不容易控制。不如读时在拉高以后不延时了,立即连续读个20毫秒甚至更多,有0出0,无0出1。这样只要芯片好的肯定能读出来了吧。。。
Python全文搜索引擎:&url&/p/ming-search/&/url&
在线时间2247 小时
威望13157 分
芯币10586 枚
E金币190 枚
TA的帖子TA的资源
假如逻辑没错,汇编行C不行的话,有一种可能是被编译器优化掉了,需用volitale救场。
在线时间5837 小时
威望9934 分
芯币5646 枚
TA的帖子TA的资源
找一个网上的DS18B20的C观摩下.
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
回复 7楼 仙猫 的帖子
额,这个,这个,,我前阵子看STM32固件库里碰到这个东东,不过不是太明白。
我想,大叔的意思是否:子程序中保存的数据出了子程序就挂掉?还是说别的,我不是很懂。
还是说,编译过程中,这个量不知道因为什么变得乱七八糟。
有点奇怪的是,我也试过在子程序里丢失数据,所以我干脆在子程序中也点亮一个LED灯。
额,elulis,你这个可真狠,20毫秒啊!!行,我回去试试。
在线时间2247 小时
威望13157 分
芯币10586 枚
E金币190 枚
TA的帖子TA的资源
这只是猜测
常有这样的情形,比如你用C写了个简易循环做延迟:
 c = 1000;
 while (c--);
编译器一看你在干嘛呢,帮你改写成给c赋值-1不就完了吗?于是你的循环体被杀掉,延迟也做不成了。
再有就是对I/O的操作,比如读键或读状态,原本的意图是想反复读查看变化的,结果编译器觉得你在瞎折腾,读完一次之后就帮你记忆在变量里,以后再读到的其实不是真的I/O而是不变的变量值,那就出问题了。
如果碰到这种情形,可以用volitale修饰子禁止对该变量或(I/O)的优化。
在线时间36 小时
TA的帖子TA的资源
时序问题 时序要掌握好 上拉电阻最好接
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
回复 10楼 仙猫 的帖子
前几天看固件库,刚好看到这玩意,没想到哈,马上就用上了,我的天。
PS:太为他人着想,原来真的很成问题,比如编译器同学。
在线时间14 小时
TA的帖子TA的资源
唉,LZ,俺是个汇编盲啊,回帖是美德,顺便赚赚钱
在线时间0 小时
TA的帖子TA的资源
DS18B20供应
本帖子中包含更多资源
才可以下载或查看,没有帐号?
TMS320DM642AGDK6 200片 原装深圳库存现货... 价优
接受TI全系列DSP订货...
在线时间50 小时
威望180 分
芯币424 枚
TA的帖子TA的资源
DS18B20对时序要求非常严格。我有C的
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
回复 15楼 烟雨 的帖子
额,各位有C的老大,麻烦发一份给我,谢谢。
可以回帖或者编辑帖子的,然后上传附件。。。也给有需要的童鞋留着哈~~
在线时间921 小时
威望10860 分
芯币14647 枚
E金币120 枚
TA的帖子TA的资源
基于DS18B20的温度控制系统仿真及程序
我这儿正好有一个,也是帮别人做的毕设,压缩包里有protues仿真工程和keil 工程文件,可以使用protues和keil连调,DS18B20部分的函数也写的很清楚,自己看看吧。
另外,针对这个仿真我也做了实物,用的是STC89C52RC,下载的就是这个程序,应该没有错的!希望能对你提供一些帮助!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间23 小时
芯币179 枚
TA的帖子TA的资源
调时序最好用示波器!
科学家研究已有的世界,工程师创造未来的世界!
在线时间1249 小时
威望21342 分
芯币15500 枚
E金币106 枚
TA的帖子TA的资源
回复 18楼 luckfrog 的帖子
我也想有示波器,有示波器事情就好玩多了。。。也许我就不会一直停留在直流线路了
在线时间921 小时
威望10860 分
芯币14647 枚
E金币120 枚
TA的帖子TA的资源
调时序用逻辑分析仪就行了,论坛里有介绍的,一二百块钱就行了
Powered by
逛了这许久,何不进去瞧瞧?我将DS18b20得到的温度传给另一个单片机为啥会出现乱码啊?_单片机论坛吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,760贴子:
我将DS18b20得到的温度传给另一个单片机为啥会出现乱码啊?收藏
#include &reg51.h&#include &intrins.h& //_nop_();延时函数用#define dm P0 //段码输出口#define uchar unsigned char#define uint unsigned intsbit DQ=P2^4; //温度输入口sbit w0=P2^0; //数码管4sbit w1=P2^1; //数码管3sbit w2=P2^2; //数码管2sbit w3=P2^3; //数码管1int temp1=0; //显示当前温度和设置温度的标志位为0 时显示当前温度//**************温度小数部分用查表法***********//uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数断码表uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴LED 段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮" "-"uchar table_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //个位带小数点的断码表uchar data temp_data[2]={0x00,0x00}; //读出温度暂放uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用/*****************11us 延时函数*************************/void delay(uint t){for (;t&0;t--);}void scan(){for(j=0;j&4;j++){switch (j){case 0: dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshucase 1: dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//geweicase 2: dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiweicase 3: dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei// else{dm=table_dm[b3];w3=0;delay(50);w3=1;}}}}//***************DS18B20 复位函数************************/ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50); //550 usDQ=1;delay(6); //66 uspresence=DQ; //presence=0 复位成功,继续下一步}delay(45); //延时500 uspresence=~DQ;}DQ=1; //拉高电平}/****************DS18B20 写命令函数************************///向1-WIRE 总线上写1 个字节void write_byte(uchar val){for(i=8;i&0;i--){DQ=1;_nop_();_nop_(); //从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_(); //5 usDQ=val&0x01; //最低位移出delay(6); //66 usval=val/2; //右移1 位}DQ=1;delay(1);}/****************DS18B20 读1 字节函数************************///从总线上取1 个字节uchar read_byte(void){uchar value=0;for(i=8;i&0;i--){DQ=1;_nop_();_nop_();value&&=1;DQ=0;_nop_();_nop_();_nop_();_nop_(); //4 usDQ=1;_nop_();_nop_();_nop_();_nop_(); //4 usif(DQ)value|=0x80;delay(6); //66 us}DQ=1;return(value);}/*****************读出温度函数************************/read_temp(){ow_reset(); //总线复位delay(200);write_byte(0xcc); //发命令write_byte(0x44); //发转换命令ow_reset();delay(1);write_byte(0xcc); //发命令write_byte(0xbe);temp_data[0]=read_byte(); //读温度值的第字节temp_data[1]=read_byte(); //读温度值的高字节temp=temp_data[1];temp&&=8;temp=temp|temp_data[0]; // 两字节合成一个整型变量。 //返回温度值}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/work_temp(uint tem){uchar n=0;if(tem&6348) // 温度值正负判断{tem=65536-n=1;} // 负温度求补码,标志位置1display[4]=tem&0x0f; // 取小数部分的值display[0]=ditab[display[4]]; // 存入小数部分显示值display[4]=tem&&4; // 取中间八位,即整数部分的值display[3]=display[4]/100; // 取百位数据暂存display[1]=display[4]%100; // 取后两位数据暂存display[2]=display[1]/10; // 取十位数据暂存display[1]=display[1]%10; //个位数据r=display[1]+display[2]*10+display[3]*100;/////符号位显示判断/////if(!display[3]){display[3]=0x0a; //最高位为0 时不显示if(!display[2]){display[2]=0x0a; //次高位为0 时不显示}}if(n){display[3]=0x0b;} //负温度时最高位显示"-"}//*********设置温度显示转换************//void xianshi(int horl){int n=0;if(horl&128){horl=256-n=1;}display[3]=horl/100;display[3]=display[3]&0x0f;display[2]=horl%100/10;display[1]=horl%10;display[0]=0;if(!display[3]){display[3]=0x0a; //最高位为0 时不显示if(!display[2]){display[2]=0x0a; //次高位为0 时不显示}}if(n){display[3]=0x0b; //负温度时最高位显示"-"}}void send(uchar state){SBUF=while(TI==0);TI=0;}void SCON_init(void){SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0TL1=0TI=0;TR1=1;ES=1;}/****************主函数************************/void main(){SCON_init();dm=0x00; //初始化端口w0=0;w1=0;w2=0;w3=0;for(h=0;h&4;h++) //开机显示"0000"{display[h]=0;}ow_reset(); //开机先转换一次write_byte(0xcc); //Skip ROMwrite_byte(0x44); //发转换命令for(h=0;h&100;h++) //开机显示"0000"{scan();}while(1){if (temp1==0){work_temp(read_temp()); //处理温度数据scan(); //显示温度值}
send(temp);}}另一个单片机的接收程序#include &reg51.h&#define uint unsigned int #define uchar unsigned char uchar
state ,void receive(){while(RI==0)state=SBUF;RI=0;}void SCON_init(void){SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0TL1=0RI=0;TR1=1;}void main(){
P2=0x0f;SCON_init();while(1){
receive();temp=
撸主你那是什么模拟软件啊,求教
protues仿真软件
串口通信错误~小尾巴,文字序顺就不响影阅读,小代电子工作室~
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 ds18b20初始化流程图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信