找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

STC89C52单片机DS18B20程序调试问题求助

查看数: 1871 | 评论数: 4 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-10-24 21:04

正文摘要:

最近在学习DS18B20外设时,接触到了单总线协议。按照DS18B20的DataSheet写了一版程序后,发现一直无法正常显示温度,最后发现是延时的问题,但具体原理一直没想明白。 单片机芯片为STC89C52,晶振为11.0592MHz。 ...

回复

ID:916650 发表于 2021-10-25 17:02
yzwzfyz 发表于 2021-10-25 16:23
这个不难解决,去研读DS18B20手册,特别是它的读写时序部分。再对比一下,你的程序对它的操作时序,能满足 ...

嗯,您说的很对。最后发现是精确延时函数有问题,导致延时的时间并不是理想的定义的uint x的时间,超过了DataSheet要求的最大值120us,导致最后输出数据紊乱。确实是时序没对好导致的。
ID:123289 发表于 2021-10-25 16:23
这个不难解决,去研读DS18B20手册,特别是它的读写时序部分。再对比一下,你的程序对它的操作时序,能满足手册上的要求吗?
ID:916650 发表于 2021-10-25 11:23

感谢大佬,验证后发现原来的精确延时方法确实有问题
  1.                 void Delay_Us(uint x)//11.0592MHz,一个nop为1.085us
  2.                 {
  3.                         uint a;
  4.                         for(a=x;a>0;a--)
  5.                         {
  6.                                 _nop_();
  7.                         }
  8.                 }
复制代码


之前做的实验对时序的要求没那么严格,导致没发现这种精确延时方法有问题。
将10us的精确延时改成
  1.                 void Delay_Us_10()
  2.                 {
  3.                         _nop_();_nop_();_nop_();
  4.                         _nop_();_nop_();_nop_();
  5.                 }
复制代码

就好了
ID:213173 发表于 2021-10-25 06:27
  1. //测试条件12.0MHz晶振/12T MCU,如采用11.0592MHz晶振延时时间*1.085倍
  2. #include "reg51.h"

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. /*------------------------------------------------
  6. uS延时函数,含有输入参数 unsigned char t
  7. 大致延时长度如下 T=t*2+5us
  8. ------------------------------------------------*/
  9. void Delay_2xtus(uchar t)
  10. {   
  11.         while(--t);
  12. }
  13. /*------------------------------------------------
  14. uS延时函数,含有输入参数 unsigned uint t
  15. 大致延时长度如下 T=t*8+6us
  16. ------------------------------------------------*/
  17. void Delay_8xtus(uint t)
  18. {   
  19.         while(--t);
  20. }
  21. /*------------------------------------------------
  22. uS延时函数,含有输入参数 unsigned char t
  23. 大致延时长度如下 T=t*6+11us
  24. ------------------------------------------------*/
  25. void delay_6xtus(uchar t)
  26. {      
  27.         while(t--);
  28. }
  29. /*------------------------------------------------
  30. uS延时函数,含有输入参数 unsigned int t
  31. 大致延时长度如下 T=t*9+16us
  32. ------------------------------------------------*/
  33. void delay_9xtus(uint t)
  34. {      
  35.         while(t--);
  36. }
  37. /*------------------------------------------------
  38. mS延时函数,含有输入参数 unsigned char t
  39. 大致延时1mS
  40. ------------------------------------------------*/
  41. void Delay_ms(uchar t)
  42. {
  43.         while(t--)
  44.         {
  45.                 Delay_2xtus(243);
  46.                 Delay_2xtus(242);
  47.         }
  48. }

  49. void main()
  50. {
  51.         Delay_2xtus(100);
  52.         Delay_ms(100);
  53.         Delay_8xtus(100);
  54.         delay_9xtus(100);
  55.         delay_6xtus(100);

  56.         while(1);
  57. }
  58. //不同数据类型和写法的延时时间区别
  59. /*
  60.         unsigned char i=10;//2um
  61.         while(--i);//i*2um

  62.         unsigned int i=10;//4um
  63.         while(--i);//i*8us

  64.         unsigned char i=10;//2um
  65.         while(i--);//i*2+2um

  66.         unsigned int i=10;//4um
  67.         while(i--);//i*8+8us
  68. */
复制代码

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表