找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3252|回复: 6
打印 上一主题 下一主题
收起左侧

52单片机DS18B20测温,lcd一直显示为-0.06,求大佬解答

[复制链接]
跳转到指定楼层
楼主

代码如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. sbit DQ = P1^0;            //DS18B20数据口
  5. uchar FLAG=1;   //正负温度标志

  6. unsigned char TMPH,TMPL;

  7. //这三个引脚参考资料
  8. sbit E=P2^2;                //1602使能引脚
  9. sbit RW=P2^1;                //1602读写引脚      
  10. sbit RS=P2^0;                //1602数据/命令选择引脚


  11. void delay_1()
  12. {
  13.         int i,j;
  14.         for(i=0; i<=10; i++)
  15.         for(j=0; j<=2; j++)
  16. ;
  17. }


  18. // 1602命令函数
  19. void enable(uchar del)
  20. {
  21.         P0 = del;
  22.         RS = 0;
  23.         RW = 0;
  24.         E = 0;
  25.         delay_1();
  26.         E = 1;
  27.         delay_1();
  28. }


  29. void write(uchar del)
  30. {
  31.         P0 =del;
  32.         RS = 1;
  33.         RW = 0;
  34.         E = 0;
  35.         delay_1();
  36.         E = 1;
  37.         delay_1();
  38. }

  39. // 1602初始化,请参考1602的资料
  40. void L1602_init(void)
  41. {
  42.         enable(0x01);
  43.         enable(0x38);
  44.         enable(0x0c);
  45.         enable(0x06);
  46.         enable(0xd0);
  47. }


  48. //改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下 L1602_char(1,5,'b')
  49. void L1602_char(uchar hang,uchar lie,char sign)
  50. {
  51.         uchar a;
  52.         if(hang == 1) a = 0x80;
  53.         if(hang == 2) a = 0xc0;
  54.         a = a + lie - 1;
  55.         enable(a);
  56.         write(sign);
  57. }

  58. //改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下L1602_string(1,5,"ab cd ef;")
  59. void L1602_string(uchar hang,uchar lie,uchar *p)
  60. {
  61.         uchar a;
  62.         if(hang == 1) a = 0x80;
  63.         if(hang == 2) a = 0xc0;
  64.         a = a + lie - 1;
  65.         enable(a);
  66.         while(1)
  67.         {
  68.                 if(*p == '\0') break;
  69.                 write(*p);
  70.                 p++;
  71.         }
  72. }

  73. void delay(uint N)
  74. {
  75.         int i;
  76.         for(i=0; i<N; i++)
  77.         ;
  78. }

  79. Init_Ds18b20()
  80. {
  81.    bit Status_Ds18b20;
  82.    DQ=1;
  83.    DQ=0;
  84.    delay(250);
  85.    DQ=1;
  86.    delay(20);
  87.    if(!DQ)
  88.      Status_Ds18b20=0;
  89.         else
  90.          Status_Ds18b20=1;
  91.    delay(250);
  92.    DQ=1;
  93.    return Status_Ds18b20;
  94. }
  95. uchar Read_Ds18b20()
  96. {
  97.    uchar i=0,dat=0;
  98.    for(i=0;i<8;i++)
  99.      {
  100.            DQ=1;
  101.            DQ=0;
  102.            dat>>=1;
  103.            DQ=1;
  104.            if(DQ)
  105.              dat|=0x80;
  106.            DQ=1;
  107.            delay(25);
  108.          }
  109.            return dat;
  110. }

  111. void Witie_Ds18b20(uchar dat)
  112. {
  113.    uchar i=0;
  114.    for(i=0;i<8;i++)
  115.    {
  116.           DQ=1;
  117.           dat>>=1;
  118.           DQ=0;
  119.           DQ=CY;
  120.           delay(25);
  121.           DQ=1;
  122.    }
  123. }

  124. void chuli()
  125. {
  126.                   uint temp;
  127.             float tem;
  128.                 Init_Ds18b20();                                        //复位
  129.                 Witie_Ds18b20(0xcc);                 //写跳过ROM命令
  130.                 Witie_Ds18b20(0x44);                    //开启温度转换
  131.                 Init_Ds18b20();      
  132.                 Witie_Ds18b20(0xcc);
  133.                 Witie_Ds18b20(0xbe);            //读暂存器
  134.                 TMPL = Read_Ds18b20();
  135.                 TMPH = Read_Ds18b20();

  136.                 temp = TMPH;
  137.                 temp <<= 8;      
  138.                 temp = temp | TMPL;
  139.                 if(TMPH>=8)
  140.                 {
  141.                    temp=~temp+1;
  142.                    FLAG=1;
  143.                 }
  144.                 else FLAG=0;         
  145.                 tem=temp*0.0625;
  146.                 temp=tem*100;

  147.                 if((temp/10000)==0)                                 //当高位为0时不显示0
  148.                      L1602_char(2,5,' ');
  149.                 else
  150.                      L1602_char(2,5,temp/10000 + 48);
  151.                 if((temp/10000)==0&&(temp/1000%10)==0)                                 //当高位为0时不显示0
  152.                      L1602_char(2,6,' ');
  153.                 else
  154.                      L1602_char(2,6,temp/1000%10 + 48);
  155.             L1602_char(2,7,temp/100%10 + 48);

  156.             L1602_char(2,8,0x2e);         
  157.                 L1602_char(2,9,temp/10%10 + 48);
  158.                 L1602_char(2,10,temp%10 + 48);         
  159.                 L1602_char(2,11,0xdf);                   //温度符号C前的圈
  160.                 if(FLAG==1)
  161.                           L1602_char(2,4,0x2d); //输出-号
  162.                 else
  163.                     L1602_char(2,4,0x2b); //输出+号
  164. }
  165. void main()
  166. {
  167. //        float tt;
  168. //        uint temp;
  169.         P2 = 0x00;
  170.         L1602_init();
  171.         L1602_string(1,1,"  DS18B20 TEST  ");
  172.         L1602_string(2,1,"           C");
  173.         while(1)
  174.         {
  175.         chuli();      
  176.         }
  177. }
复制代码



硬件没问题,应该就是程序问题,求大佬解答

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:818709 发表于 2021-12-10 00:14 来自手机 | 显示全部楼层
wc86110 发表于 2021-12-9 20:49
就按这图真做硬件没问题?

求大佬解答 刚学习不久
回复

使用道具 举报

板凳
ID:818709 发表于 2021-12-10 11:42 | 显示全部楼层
wulin 发表于 2021-12-10 09:23
程序没有严重问题,主要是DS18B20读写时序不对导致读出错误信息,还有点不简洁。

谢谢谢谢 感谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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