写个DS18B20初始化程序,死活没反应

2019-03-24 20:03发布

周末开始做毕业设计。 首先是要用单片机读取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    0100H
START:
      CALL   RESET;
      JC     $;
      CLR    P1.5;
      SJMP   $; 可是,事实上,没用,灯没亮。   想不通为什么。 难道引脚错了? 难道是坏的?我昨天刚买的说。     此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
maylove
1楼-- · 2019-03-25 17:09
找一个网上的DS18B20的C观摩下.
辛昕
2楼-- · 2019-03-25 20:54
额,这个,这个,,我前阵子看STM32固件库里碰到这个东东,不过不是太明白。
我想,大叔的意思是否:子程序中保存的数据出了子程序就挂掉?还是说别的,我不是很懂。
还是说,编译过程中,这个量不知道因为什么变得乱七八糟。

有点奇怪的是,我也试过在子程序里丢失数据,所以我干脆在子程序中也点亮一个LED灯。

额,elulis,你这个可真狠,20毫秒啊!!行,我回去试试。
仙猫
3楼-- · 2019-03-25 21:40
常有这样的情形,比如你用C写了个简易循环做延迟:
 c = 1000;
 while (c--);
编译器一看你在干嘛呢,帮你改写成给c赋值-1不就完了吗?于是你的循环体被杀掉,延迟也做不成了。

再有就是对I/O的操作,比如读键或读状态,原本的意图是想反复读查看变化的,结果编译器觉得你在瞎折腾,读完一次之后就帮你记忆在变量里,以后再读到的其实不是真的I/O而是不变的变量值,那就出问题了。

如果碰到这种情形,可以用volitale修饰子禁止对该变量或(I/O)的优化。
痞子相
4楼-- · 2019-03-26 01:40
 精彩回答 2  元偷偷看……
辛昕
5楼-- · 2019-03-26 04:09
哦~~~
前几天看固件库,刚好看到这玩意,没想到哈,马上就用上了,我的天。
PS:太为他人着想,原来真的很成问题,比如编译器同学。
杜之康
6楼-- · 2019-03-26 10:06
唉,LZ,俺是个汇编盲啊,回帖是美德,顺便赚赚钱

一周热门 更多>