找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4028|回复: 2
收起左侧

单片机ds18b20正温度值显示正常,负温度值显示不正常

[复制链接]
ID:481844 发表于 2019-3-31 10:59 | 显示全部楼层 |阅读模式
用LCD显示ds18b20的温度值,显示的正温度值正常,负温度值显示的不正常,求解决,谢谢!

1.png 草图.png


#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit rs=P2^6;
sbit rw=P2^5;
sbit en=P2^7;
sbit DS=P3^7;//温度传感器
uchar tt,s;
void delay(uchar z)
{
        uchar x,y;
        for(x=0;x<z;x++)
                for(y=0;y<110;y++);
}
void read_busy()
{
        uchar busy;
        P0=0xff;
        rs=0;
        rw=1;
        do
        {
                en=1;
                busy=P0;
                en=0;

        }while(busy&0x80);
}
void write_cmd(uchar cmd)
{
        read_busy();
        rs=0;
        rw=0;
        P0=cmd;
        en=1;
        en=0;
}
void write_dat(uchar dat)
{
        read_busy();
        rs=1;
        rw=0;
        P0=dat;
        en=1;
        en=0;
}
void inti()
{
        write_cmd(0x38);
        write_cmd(0x0c);
        write_cmd(0x01);
        write_cmd(0x06);
        
}
void delay_us(uchar us)
{
        while(us--);
}
bit ds_inti()
{
        bit i;
        DS=1;
        DS=0;
        delay_us(75);
        DS=1;
        delay_us(4);
        i=DS;
        delay_us(25);
        DS=1;
        return i;
}
void write_byte(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
                DS=0;
                DS=dat&0x01;
                delay_us(10);
                DS=1;
                dat>>=1;
        }        
}
uchar read_byte()
{
        uchar i,j,dat;
        for(i=0;i<8;i++)
        {
                DS=0;
                DS=1;
                j=DS;
                delay_us(10);
                DS=1;
                dat=(j<<7)|(dat>>1);
        }
        return dat;
}
void wendu_inti(ulong i)
{        
        uchar shiwan,wan,qian,bai,shi,ge;         
        shiwan=i/100000;
        wan=i%100000/10000;
        qian=i%10000/1000;
        bai=i%1000/100;
        shi=i%100/10;
        ge=i%10;
        inti();
        write_cmd(0x80|0x05);

        if(s==1)
                write_dat(0x2d);
                        
        write_dat(shiwan+'0');
        write_dat(wan+'0');
        write_dat(0x2e);
        write_dat(qian+'0');        
        write_dat(bai+'0');
        write_dat(shi+'0');        
        write_dat(ge+'0');
        write_dat(0xdf);
        write_dat(0x43);        
}
void timer0inti() interrupt 1
{
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
        tt++;
}
void timer0()
{
        EA=1;
        ET0=1;
        TR0=1;
        TMOD=0X01;
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%256;
}
void main()
{
         uchar L,M;
        ulong i;
        timer0();
          while(1)
        {
                 ds_inti();
                write_byte(0xcc);
                write_byte(0x44);
                delay(10);
                ds_inti();
                write_byte(0xcc);
                write_byte(0xbe);
                L=read_byte();
                M=read_byte();
                i=M;
                i<<=8;
                i|=L;
                if((M&0x80)!=0)
                {
                        i=~i+1;
                        s=1;
                }
                else
                        s=0;
                i=i*0.0625*10000;
                if(tt==10)
                {
                        tt=0;        
                        wendu_inti(i);
                }               
          }
}

回复

使用道具 举报

ID:96682 发表于 2019-3-31 12:49 | 显示全部楼层
皆因正负数转化没处理好
回复

使用道具 举报

ID:213173 发表于 2019-3-31 21:02 | 显示全部楼层
给你改好了
无标题.jpg

  1. #include <reg52.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long

  5. sbit rs=P2^6;
  6. sbit rw=P2^5;
  7. sbit en=P2^7;
  8. sbit DS=P3^7;//温度传感器

  9. uchar TempData[8]; //存储显示值的全局变量
  10. uchar tt,s;

  11. void delay(uchar z)
  12. {
  13.         uchar x,y;
  14.         for(x=0;x<z;x++)
  15.                 for(y=0;y<110;y++);
  16. }
  17. void read_busy()
  18. {
  19.         uchar busy;
  20.         P0=0xff;
  21.         rs=0;
  22.         rw=1;
  23.         do
  24.         {
  25.                 en=1;
  26.                 busy=P0;
  27.                 en=0;       
  28.         }while(busy&0x80);
  29. }
  30. void write_cmd(uchar cmd)
  31. {
  32.         read_busy();
  33.         rs=0;
  34.         rw=0;
  35.         P0=cmd;
  36.         en=1;
  37.         en=0;
  38. }
  39. void write_dat(uchar dat)
  40. {
  41.         read_busy();
  42.         rs=1;
  43.         rw=0;
  44.         P0=dat;
  45.         en=1;
  46.         en=0;
  47. }

  48. void inti()
  49. {
  50.         write_cmd(0x38);
  51.         write_cmd(0x0c);
  52.         write_cmd(0x01);
  53.         write_cmd(0x06);
  54.         write_cmd(0x80);
  55. }

  56. void delay_us(uchar us)
  57. {
  58.          while(--us);
  59. }

  60. bit ds_inti()
  61. {
  62.         bit i;
  63.         DS=1;
  64.         delay_us(5);
  65.         DS=0;
  66.         delay_us(200);
  67.         delay_us(200);
  68.         DS=1;
  69.         delay_us(50);
  70.         i=DS;
  71.         delay_us(25);
  72.         return i;
  73. }

  74. void write_byte(uchar dat)
  75. {
  76.         uchar i;
  77.         for(i=0;i<8;i++)
  78.         {
  79.                 DS=0;
  80.                 DS=dat&0x01;
  81.                 delay_us(25);
  82.                 DS=1;
  83.                 dat>>=1;
  84.         }        
  85.         delay_us(25);
  86. }

  87. uchar read_byte()
  88. {
  89.         uchar i,j,dat;
  90.         for(i=0;i<8;i++)
  91.         {
  92.                 DS=0;
  93.                 DS=1;
  94.                 j=DS;
  95.                 delay_us(25);
  96.                 DS=1;
  97.                 dat=(j<<7)|(dat>>1);
  98.         }
  99.         return dat;
  100. }
  101. /*
  102. void wendu_inti(ulong i)
  103. {        
  104.         uchar shiwan,wan,qian,bai,shi,ge;         
  105.         shiwan=i/100000;
  106.         wan=i%100000/10000;
  107.         qian=i%10000/1000;
  108.         bai=i%1000/100;
  109.         shi=i%100/10;
  110.         ge=i%10;
  111.         inti();
  112.         write_cmd(0x80|0x05);
  113.        
  114.         if(s==1)
  115.                 write_dat(0x2d);       
  116.         write_dat(shiwan+'0');
  117.         write_dat(wan+'0');
  118.         write_dat(0x2e);
  119.         write_dat(qian+'0');        
  120.         write_dat(bai+'0');
  121.         write_dat(shi+'0');        
  122.         write_dat(ge+'0');
  123.         write_dat(0xdf);
  124.         write_dat(0x43);        
  125. }*/
  126. void timer0inti() interrupt 1
  127. {
  128.         TH0=(65535-50000)/256;
  129.         TL0=(65535-50000)%256;
  130.         tt++;
  131. }
  132. void timer0()
  133. {
  134.         EA=1;
  135.         ET0=1;
  136.         TR0=1;
  137.         TMOD=0X01;
  138.         TH0=(65535-50000)/256;
  139.         TL0=(65535-50000)%256;
  140. }

  141. void main()
  142. {
  143.         uchar L,M,i;
  144.         uint Temp;
  145.         long TempM;
  146.         uchar TempH,TempL,TempK;
  147.         timer0();
  148.         inti();
  149.         while(1)
  150.         {
  151.                 if(tt==10)
  152.                 {
  153.                         tt=0;        
  154.                         ds_inti();
  155.                         write_byte(0xcc);
  156.                         write_byte(0x44);
  157.                         delay(10);
  158.                         ds_inti();
  159.                         write_byte(0xcc);
  160.                         write_byte(0xbe);
  161.                         L=read_byte();
  162.                         M=read_byte();
  163.                         Temp=M;
  164.                         Temp<<=8;
  165.                         Temp|=L;
  166.                         if(Temp&0x8000)
  167.                         {
  168.                                 s=1;
  169.                                 Temp=~Temp;
  170.                                 Temp+=1;
  171.                         }
  172.                         else         s=0;                //正数

  173.                         TempM=Temp*0.0625*100;                        //换算为10进制温度值再放大100倍
  174.                         TempH=TempM/100;                                //分解出整数值       
  175.                         TempL=TempM%100;                                //分解出小数值
  176.                         TempL=(TempL+TempK)/2+0.5;                //小数取两次平均值加四舍五入
  177.                         TempK=TempL;

  178.                         if(s==1)
  179.                                 TempData[0]='-';//显示负号
  180.                         else if(TempH/100==0)//小于100
  181.                                 TempData[0]=' ';                                        //百位消隐
  182.                         else
  183.                                 TempData[0]=TempH/100+'0';                         //显示百位温度
  184.        
  185.                         if((TempH/100==0)&&((TempH%100)/10==0))
  186.                                 TempData[1]=' ';                                        //十位消隐
  187.                         else
  188.                                 TempData[1]=(TempH%100)/10+'0';                //显示十位温度
  189.                         TempData[2]=(TempH%100)%10+'0';                        //显示个位温度
  190.                         TempData[3]='.';                                                //显示小数点
  191.                         TempData[4]=TempL/10+'0';                                //显示温度小数1位
  192.                         TempData[5]=TempL%10+'0';                                //显示温度小数2位       
  193.                         TempData[6]=0xdf;                                                //显示.
  194.                         TempData[7]='C';                                                //显示C
  195.                         write_cmd(0x80+5);                                                //数据指针第一行起始0x80位置
  196.                         for(i=0;i<8;i++)                                                //每循环一次写一个字节数据
  197.                                 write_dat(TempData[i]);                        //写一个字节数据               
  198.                 }
  199.         }
  200. }
复制代码



评分

参与人数 1黑币 +8 收起 理由
心灵的尘埃 + 8

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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