久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4014|回復: 2
打印 上一主題 下一主題
收起左側

單片機ds18b20正溫度值顯示正常,負溫度值顯示不正常

[復制鏈接]
跳轉到指定樓層
樓主
用LCD顯示ds18b20的溫度值,顯示的正溫度值正常,負溫度值顯示的不正常,求解決,謝謝!




#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);
                }               
          }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:96682 發表于 2019-3-31 12:49 | 只看該作者
皆因正負數轉化沒處理好
回復

使用道具 舉報

板凳
ID:213173 發表于 2019-3-31 21:02 | 只看該作者
給你改好了


  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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久狠狠| 久久久久国产精品午夜一区 | 精品国产一区二区三区性色av | 黄色成人免费在线观看 | 波多野结衣中文字幕一区二区三区 | 奇米四色在线观看 | 欧美精品综合 | 国产在线观看一区二区三区 | 中文字幕福利视频 | 国产成人在线一区 | 欧美精品在线一区 | 人人爱干| 国产成人免费一区二区60岁 | 久久久久久久久99精品 | 噜啊噜在线 | 欧美精品v国产精品v日韩精品 | 波波电影院一区二区三区 | 成人亚洲一区 | 久久一区精品 | 国产一区2区 | 国产成人在线观看免费 | 久久专区 | 天天操天天操 | 99热精品在线观看 | 99精品欧美一区二区蜜桃免费 | 免费在线h视频 | 精品在线看 | 99精品欧美一区二区三区综合在线 | 国产精品久久久久久久久久东京 | 美女视频h | 欧美日韩一区不卡 | 中文字幕国产精品 | 亚洲精品视频在线观看免费 | 国产清纯白嫩初高生在线播放视频 | 一区二区三区四区视频 | 免费人成激情视频在线观看冫 | 亚洲免费在线视频 | 美女张开腿露出尿口 | 成年人在线观看视频 | 在线视频亚洲 | 日本精品一区二区在线观看 |