找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 4238 | 评论数: 6 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-12-9 18:08

正文摘要:

代码如下: #include<reg52.h> #define uchar unsigned char #define uint  unsigned int sbit DQ = P1^0;            //DS18B20数据口 uchar FLAG=1 ...

回复

ID:994053 发表于 2021-12-24 14:20
DS18B20读写时序不对
ID:139866 发表于 2021-12-11 16:03
这个数据不是-0.06,是-0.0625
ID:818709 发表于 2021-12-10 11:42
wulin 发表于 2021-12-10 09:23
程序没有严重问题,主要是DS18B20读写时序不对导致读出错误信息,还有点不简洁。

谢谢谢谢 感谢大佬
ID:213173 发表于 2021-12-10 09:23
程序没有严重问题,主要是DS18B20读写时序不对导致读出错误信息,还有点不简洁。

  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(uchar N)
  12. {
  13.         while(--N);
  14. }

  15. void delay_1()
  16. {
  17.         delay(245);
  18.         delay(245);
  19. }


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


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

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


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

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

  75. bit Init_Ds18b20()
  76. {
  77.         bit Status_Ds18b20;
  78.         DQ=1;
  79.         delay(5);
  80.         DQ=0;
  81.         delay(200);
  82.         delay(200);
  83.         DQ=1;
  84.         delay(50);
  85.         Status_Ds18b20=DQ;
  86.         delay(25);
  87.         return Status_Ds18b20;
  88. }

  89. uchar Read_Ds18b20()
  90. {
  91.         uchar i=0,dat=0;
  92.         for(i=0;i<8;i++)
  93.         {
  94.                 DQ=0;
  95.                 dat>>=1;
  96.                 DQ=1;
  97.                 if(DQ)
  98.                 dat|=0x80;
  99.                 delay(25);
  100.         }
  101.         return dat;
  102. }

  103. void Witie_Ds18b20(uchar dat)
  104. {
  105.         uchar i=0;
  106.         for(i=0;i<8;i++)
  107.         {
  108.                 DQ=0;
  109.                 DQ=dat&0x01;
  110.                 delay(25);
  111.                 DQ=1;
  112.                 dat>>=1;
  113.         }
  114.         delay(25);
  115. }

  116. void chuli()
  117. {
  118.         uint temp;
  119.         float tem;
  120.         Init_Ds18b20();              //复位
  121.         Witie_Ds18b20(0xcc);         //写跳过ROM命令
  122.         Witie_Ds18b20(0x44);         //开启温度转换
  123.         Init_Ds18b20();      
  124.         Witie_Ds18b20(0xcc);
  125.         Witie_Ds18b20(0xbe);         //读暂存器
  126.         TMPL = Read_Ds18b20();
  127.         TMPH = Read_Ds18b20();

  128.         temp = TMPH;
  129.         temp <<= 8;      
  130.         temp = temp | TMPL;

  131.         if(TMPH>8)
  132.         {
  133.                 temp=~temp+1;
  134.                 FLAG=1;
  135.         }
  136.         else FLAG=0;         
  137.         tem=temp*0.0625;
  138.         temp=tem*100;
  139.        
  140.         if((temp/10000)==0)                    //当高位为0时不显示0
  141.                 L1602_char(2,5,' ');
  142.         else
  143.                 L1602_char(2,5,temp/10000 + 48);
  144.         if((temp/10000)==0&&(temp/1000%10)==0) //当高位为0时不显示0
  145.                 L1602_char(2,6,' ');
  146.         else
  147.                 L1602_char(2,6,temp/1000%10 + 48);
  148.         L1602_char(2,7,temp/100%10 + 48);       
  149.         L1602_char(2,8,0x2e);         
  150.         L1602_char(2,9,temp/10%10 + 48);
  151.         L1602_char(2,10,temp%10 + 48);         
  152.         L1602_char(2,11,0xdf);                  //温度符号C前的圈
  153.         if(FLAG==1)
  154.         L1602_char(2,4,0x2d); //输出-号
  155.         else
  156.         L1602_char(2,4,0x2b); //输出+号
  157. }
  158. void main()
  159. {
  160. //        float tt;
  161. //        uint temp;
  162. //        P2 = 0x00;
  163.         L1602_init();
  164.         L1602_string(1,1,"  DS18B20 TEST  ");
  165.         L1602_string(2,1,"           C");
  166.         while(1)
  167.         {
  168.                 chuli();      
  169.         }
  170. }
复制代码



ID:818709 发表于 2021-12-10 00:14
wc86110 发表于 2021-12-9 20:49
就按这图真做硬件没问题?

求大佬解答 刚学习不久
ID:96682 发表于 2021-12-9 20:49
就按这图真做硬件没问题?

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

Powered by 单片机教程网

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