找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

单片机+ds18b20温度读取错误 求帮助

查看数: 3060 | 评论数: 7 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-8-15 09:10

正文摘要:

是不是代码错误了 #include"temp.h" /******************************************************************************* * 函 数 名         : Delay1ms * 函数功能  &nbs ...

回复

ID:745303 发表于 2020-8-21 14:08

你好我把实物做了出来之后有时会出现数据读取错误的现象,是不是在源代码中lcd显示时温度值得计算有错误
ID:745303 发表于 2020-8-20 14:29
枫城落 发表于 2020-8-17 18:37
Ds18b20Init定义有问题

可以帮忙再修改下吗
ID:745303 发表于 2020-8-18 15:06
wulin 发表于 2020-8-17 17:47
把temp.h头文件里函数声明也改成bit Ds18b20Init();即可。

可以了谢谢
ID:814418 发表于 2020-8-17 18:37
Ds18b20Init定义有问题
ID:213173 发表于 2020-8-17 17:47
66584 发表于 2020-8-17 13:21
你好,你的函数在35到48这一段出现了Ds18b20Init重新定义的问题

把temp.h头文件里函数声明也改成bit Ds18b20Init();即可。
ID:745303 发表于 2020-8-17 13:21
wulin 发表于 2020-8-15 21:13
给你修改一下,经验证正常。

你好,你的函数在35到48这一段出现了Ds18b20Init重新定义的问题
ID:213173 发表于 2020-8-15 21:13
给你修改一下,经验证正常。
  1. #include"temp.h"
  2. /*------------------------------------------------
  3. * 函 数 名         : DelayUs2x 长度如下 T=tx2+5 uS
  4. * 函数功能         : 延时函数
  5. * 输    入         : 无
  6. * 输    出         : 无
  7. ------------------------------------------------*/
  8. void DelayUs2x(uchar t)
  9. {   
  10.         while(--t);
  11. }
  12. /*******************************************************************************
  13. * 函 数 名         : Delay1ms
  14. * 函数功能         : 延时函数
  15. * 输    入         : 无
  16. * 输    出         : 无
  17. *******************************************************************************/

  18. void Delay1ms(uint y)
  19. {
  20.         while(y--)
  21.         {
  22.                 //大致延时1mS
  23.                 DelayUs2x(245);
  24.                 DelayUs2x(245);
  25.         }
  26. }
  27. /*******************************************************************************
  28. * 函 数 名         : Ds18b20Init
  29. * 函数功能         : 初始化
  30. * 输    入         : 无
  31. * 输    出         : 初始化成功返回1,失败返回0
  32. *******************************************************************************/

  33. bit Ds18b20Init()
  34. {
  35.         bit dat=0;
  36.         DSPORT = 1;    //DSPORT复位
  37.         DelayUs2x(5);   //稍做延时
  38.         DSPORT = 0;         //单片机将DSPORT拉低
  39.         DelayUs2x(200); //精确延时 大于 480us 小于960us
  40.         DelayUs2x(200);
  41.         DSPORT = 1;        //拉高总线
  42.         DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲
  43.         dat=DSPORT;        //如果x=0则初始化成功, x=1则初始化失败
  44.         DelayUs2x(25); //稍作延时返回
  45.         return dat;
  46. }

  47. /*******************************************************************************
  48. * 函 数 名         : Ds18b20WriteByte
  49. * 函数功能         : 向18B20写入一个字节
  50. * 输    入         : com
  51. * 输    出         : 无
  52. *******************************************************************************/

  53. void Ds18b20WriteByte(uchar dat)
  54. {
  55.         uchar i=0;
  56.         for(i=8; i>0; i--)
  57.         {
  58.                 DSPORT = 0;
  59.                 DSPORT = dat&0x01;
  60.                 DelayUs2x(25);
  61.                 DSPORT = 1;
  62.                 dat>>=1;
  63.         }
  64.         DelayUs2x(25);
  65. }
  66. /*******************************************************************************
  67. * 函 数 名         : Ds18b20ReadByte
  68. * 函数功能         : 读取一个字节
  69. * 输    入         : com
  70. * 输    出         : 无
  71. *******************************************************************************/
  72. uchar Ds18b20ReadByte()
  73. {
  74.         uchar i=0;
  75.         uchar dat = 0;
  76.         for (i=8;i>0;i--)
  77.         {
  78.                 DSPORT = 0; // 给脉冲信号
  79.                 dat>>=1;
  80.                 DSPORT = 1; // 给脉冲信号
  81.                 if(DSPORT)
  82.                 dat|=0x80;
  83.                 DelayUs2x(25);
  84.         }
  85.         return(dat);
  86. }
  87. /*******************************************************************************
  88. * 函 数 名         : Ds18b20ChangTemp
  89. * 函数功能         : 让18b20开始转换温度
  90. * 输    入         : com
  91. * 输    出         : 无
  92. *******************************************************************************/

  93. void  Ds18b20ChangTemp()
  94. {
  95.         Ds18b20Init();
  96. //        Delay1ms(1);
  97.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  98.         Ds18b20WriteByte(0x44);            //温度转换命令
  99.         Delay1ms(10);                                                //等待转换成功
  100. }
  101. /*******************************************************************************
  102. * 函 数 名         : Ds18b20ReadTempCom
  103. * 函数功能         : 发送读取温度命令
  104. * 输    入         : com
  105. * 输    出         : 无
  106. *******************************************************************************/

  107. void  Ds18b20ReadTempCom()
  108. {        
  109.         Ds18b20Init();
  110. //        Delay1ms(1);
  111.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  112.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  113. }
  114. /*******************************************************************************
  115. * 函 数 名         : Ds18b20ReadTemp
  116. * 函数功能                   : 读取温度
  117. * 输    入         : com
  118. * 输    出         : 无
  119. *******************************************************************************/

  120. int Ds18b20ReadTemp()
  121. {
  122.         int temp = 0;
  123.         uchar tmh, tml;
  124.         Ds18b20ChangTemp();         //先写入转换命令
  125.         Ds18b20ReadTempCom();       //然后等待转换完后发送读取温度命令
  126.         tml = Ds18b20ReadByte();    //读取温度值共16位,先读低字节
  127.         tmh = Ds18b20ReadByte();    //再读高字节
  128.         temp = tmh<<8|tml;
  129.         return temp;
  130. }
复制代码

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

Powered by 单片机教程网

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