找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數(shù): 4066 | 評論數(shù): 2 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2019-3-31 10:59

正文摘要:

用LCD顯示ds18b20的溫度值,顯示的正溫度值正常,負溫度值顯示的不正常,求解決,謝謝! #include <reg52.h> #define uchar unsigned char #define uint unsigned int #define ulong unsigned ...

回復

ID:213173 發(fā)表于 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;                //正數(shù)

  173.                         TempM=Temp*0.0625*100;                        //換算為10進制溫度值再放大100倍
  174.                         TempH=TempM/100;                                //分解出整數(shù)值       
  175.                         TempL=TempM%100;                                //分解出小數(shù)值
  176.                         TempL=(TempL+TempK)/2+0.5;                //小數(shù)取兩次平均值加四舍五入
  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]='.';                                                //顯示小數(shù)點
  191.                         TempData[4]=TempL/10+'0';                                //顯示溫度小數(shù)1位
  192.                         TempData[5]=TempL%10+'0';                                //顯示溫度小數(shù)2位       
  193.                         TempData[6]=0xdf;                                                //顯示.
  194.                         TempData[7]='C';                                                //顯示C
  195.                         write_cmd(0x80+5);                                                //數(shù)據(jù)指針第一行起始0x80位置
  196.                         for(i=0;i<8;i++)                                                //每循環(huán)一次寫一個字節(jié)數(shù)據(jù)
  197.                                 write_dat(TempData[i]);                        //寫一個字節(jié)數(shù)據(jù)               
  198.                 }
  199.         }
  200. }
復制代碼



評分

參與人數(shù) 1黑幣 +8 收起 理由
心靈的塵埃 + 8

查看全部評分

ID:96682 發(fā)表于 2019-3-31 12:49
皆因正負數(shù)轉化沒處理好

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表