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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3358|回復(fù): 15
收起左側(cè)

51單片機(jī)DS18B20溫度傳感器在LCD1602顯示有誤,想請教下大佬問題出在哪,小白實在....

  [復(fù)制鏈接]
ID:770162 發(fā)表于 2022-1-10 10:23 | 顯示全部樓層 |閱讀模式
#include<reg51.h>
#include<stdio.h>
#include<intrins.h>   
unsigned int  Real_temp;
unsigned int t;
/***************************************************/
sbit rs =P3^0;       //
sbit rw = P3^1;
sbit e =P3^5;   //
sbit D1=P0^0;
sbit D2=P0^1;
sbit D3=P0^2;
sbit D4=P0^3;
sbit D5=P0^4;
sbit D6=P0^5;
sbit D7=P0^6;
sbit D8=P0^7;
/**********************************************DS18B20****************************************************/
sbit DQ=P1^2;        //定義DS18b20的管腳

/*****延時子程序*****/
void delay(unsigned int t)
{
        for(;t>0;t--);
}

/*****初始化DS18B20*****/
unsigned char Init_DS18B20(void)
{
  unsigned char x=0;
  DQ = 1;      //DQ復(fù)位
  delay(8);    //稍做延時
  DQ = 0;      //單片機(jī)將DQ拉低
  delay(80);   //精確延時,大于480us
  DQ = 1;      //拉高總線
  delay(8);
  x = DQ;      //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  delay(4);
  return x;
}

/*****讀一個字節(jié)*****/
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 0;     // 給脈沖信號
    dat>>=1;
    DQ = 1;     // 給脈沖信號
    if(DQ)
            dat|=0x80;
        delay(4);
  }
  return(dat);
}

/*****寫一個字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
    DQ = dat&0x01;
        delay(4);
    DQ = 1;
    dat>>=1;
  }
  delay(4);
}

/*****讀取溫度*****/
int ReadTemperature(void)
{
          unsigned char a=0;
          unsigned char b=0;
          unsigned int t=0;
          t=Init_DS18B20();
          if(t) return Real_temp;
          WriteOneChar(0xCC);  //跳過讀序號列號的操作
          WriteOneChar(0x44);  //啟動溫度轉(zhuǎn)換
          t=Init_DS18B20();
          if(t) return Real_temp;
          WriteOneChar(0xCC);  //跳過讀序號列號的操作
          WriteOneChar(0xBE);  //讀取溫度寄存器
          a=ReadOneChar();     //讀低8位
          b=ReadOneChar();     //讀高8位
          t=b;
          t<<=8;
          t=t|a;
          if(t<=0||t>0x900)
        return Real_temp;
        t=t*0.625+0.5;
          return(t);
}

/*****************************************LCD1602*************************************************/
void write_com(unsigned char com)  //命令函數(shù)
{
        e=0;
        rs=0;
        rw=0;
        P0=com;
        delay(25);
        e=1;
        delay(100);
        e=0;
}
void write_data(unsigned char dat)         //寫入數(shù)據(jù)
{
        e=0;
        rs=1;
        rw=0;
        P0=dat;
        delay(25);
        e=1;
        delay(100);
        e=0;       
}
void write_string(unsigned char hang,unsigned char add,unsigned char *p)  //改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下write_string(1,5,"ab cd ef");
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        while(1)
        {
                if(*p == '\0')  break;
                write_data(*p);
                p++;
        }       
}
void write_zifu(unsigned char hang,unsigned char add,unsigned char date)   //LCD1602上顯示特定的字符
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(date);       
}
void write_sfm3_18B20(unsigned char hang,unsigned char add,unsigned int date)  //LCD1602上顯示兩位十進(jìn)制數(shù)
{
        if(hang==1)   
                write_com(0x80+add);
        else
                write_com(0x80+0x40+add);
        write_data(0x30+date/100%10);
        write_data(0x30+date/10%10);
        write_data(0x30+date%10);       
}
void init_1602()           //LCD1602初始化設(shè)置
{
        write_com(0x38);       
        write_com(0x0c);
        write_com(0x06);
        delay(1000);
        write_string(1,0,"sd:                 ");       
        write_string(2,0,"wd:                 ");
        write_zifu(1,12,0xdf);  //顯示度       
        write_zifu(2,12, 0xdf);  //顯示度       
}
/*****************************************主函數(shù)*************************************************/
void main()
{         Init_DS18B20();
    init_1602();
    while(1)
         {
         ReadTemperature();
         write_sfm3_18B20(2,4,t);
         }
}         
回復(fù)

使用道具 舉報

ID:770162 發(fā)表于 2022-1-10 10:30 | 顯示全部樓層
顯示的結(jié)果就是全為000,參照網(wǎng)上其他程序后不知道是不是理解有誤,理解成LCD最后一個顯示函數(shù)能轉(zhuǎn)換讀取出的溫度值。
屏幕截圖 2022-01-10 102541.png
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2022-1-10 16:30 | 顯示全部樓層
1218829816 發(fā)表于 2022-1-10 10:30
顯示的結(jié)果就是全為000,參照網(wǎng)上其他程序后不知道是不是理解有誤,理解成LCD最后一個顯示函數(shù)能轉(zhuǎn)換讀取出 ...

無標(biāo)題.jpg
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. #include<intrins.h>   
  4. unsigned int Real_temp;
  5. unsigned int t;
  6. /***************************************************/
  7. sbit rs =P3^0;       //
  8. sbit rw = P3^1;
  9. sbit e =P3^5;   //
  10. sbit D1=P0^0;
  11. sbit D2=P0^1;
  12. sbit D3=P0^2;
  13. sbit D4=P0^3;
  14. sbit D5=P0^4;
  15. sbit D6=P0^5;
  16. sbit D7=P0^6;
  17. sbit D8=P0^7;
  18. /**********************************************DS18B20****************************************************/
  19. sbit DQ=P1^2;        //定義DS18b20的管腳

  20. /*****延時子程序*****/
  21. void delay(unsigned int t)
  22. {
  23.         for(;t>0;t--);
  24. }

  25. /*****初始化DS18B20*****/
  26. unsigned char Init_DS18B20(void)
  27. {
  28.   unsigned char x=0;
  29.   DQ = 1;      //DQ復(fù)位
  30.   delay(8);    //稍做延時
  31.   DQ = 0;      //單片機(jī)將DQ拉低
  32.   delay(80);   //精確延時,大于480us
  33.   DQ = 1;      //拉高總線
  34.   delay(8);
  35.   x = DQ;      //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  36.   delay(4);
  37.   return x;
  38. }

  39. /*****讀一個字節(jié)*****/
  40. unsigned char ReadOneChar(void)
  41. {
  42.   unsigned char i=0;
  43.   unsigned char dat = 0;
  44.   for (i=8;i>0;i--)
  45.   {
  46.     DQ = 0;     // 給脈沖信號
  47.     dat>>=1;
  48.     DQ = 1;     // 給脈沖信號
  49.     if(DQ)
  50.             dat|=0x80;
  51.         delay(4);
  52.   }
  53.   return(dat);
  54. }

  55. /*****寫一個字節(jié)*****/
  56. void WriteOneChar(unsigned char dat)
  57. {
  58.   unsigned char i=0;
  59.   for (i=8; i>0; i--)
  60.   {
  61.     DQ = 0;
  62.     DQ = dat&0x01;
  63.         delay(4);
  64.     DQ = 1;
  65.     dat>>=1;
  66.   }
  67.   delay(4);
  68. }

  69. /*****讀取溫度*****/
  70. int ReadTemperature(void)
  71. {
  72.         unsigned char a=0;
  73.         unsigned char b=0;
  74.         unsigned int t=0;
  75.         t=Init_DS18B20();
  76.         if(t) return Real_temp;
  77.         WriteOneChar(0xCC);  //跳過讀序號列號的操作
  78.         WriteOneChar(0x44);  //啟動溫度轉(zhuǎn)換
  79.         t=Init_DS18B20();
  80.         if(t) return Real_temp;
  81.         WriteOneChar(0xCC);  //跳過讀序號列號的操作
  82.         WriteOneChar(0xBE);  //讀取溫度寄存器
  83.         a=ReadOneChar();     //讀低8位
  84.         b=ReadOneChar();     //讀高8位
  85.         t=b;
  86.         t<<=8;
  87.         t=t|a;
  88.         if(t<=0||t>0x630)
  89.         return Real_temp;
  90.         t=t*0.625+0.5;
  91.         return (t);
  92. }


  93. /*****************************************LCD1602*************************************************/
  94. void write_com(unsigned char com)  //命令函數(shù)
  95. {
  96.         e=0;
  97.         rs=0;
  98.         rw=0;
  99.         P0=com;
  100.         delay(25);
  101.         e=1;
  102.         delay(100);
  103.         e=0;
  104. }
  105. void write_data(unsigned char dat)         //寫入數(shù)據(jù)
  106. {
  107.         e=0;
  108.         rs=1;
  109.         rw=0;
  110.         P0=dat;
  111.         delay(25);
  112.         e=1;
  113.         delay(100);
  114.         e=0;        
  115. }
  116. void write_string(unsigned char hang,unsigned char add,unsigned char *p)  //改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調(diào)用該函數(shù)如下write_string(1,5,"ab cd ef");
  117. {
  118.         if(hang==1)   
  119.         write_com(0x80+add);
  120.         else
  121.                 write_com(0x80+0x40+add);
  122.         while(1)
  123.         {
  124.                 if(*p == '\0')  break;
  125.                 write_data(*p);
  126.                 p++;
  127.         }        
  128. }
  129. void write_zifu(unsigned char hang,unsigned char add,unsigned char date)   //LCD1602上顯示特定的字符
  130. {
  131.         if(hang==1)   
  132.                 write_com(0x80+add);
  133.         else
  134.                 write_com(0x80+0x40+add);
  135.         write_data(date);        
  136. }
  137. void write_sfm3_18B20(unsigned char hang,unsigned char add,unsigned int date)  //LCD1602上顯示兩位十進(jìn)制數(shù)
  138. {
  139.         if(hang==1)   
  140.                 write_com(0x80+add);
  141.         else
  142.                 write_com(0x80+0x40+add);
  143.         write_data(0x30+date/100%10);
  144.         write_data(0x30+date/10%10);
  145.         write_data('.');  
  146.         write_data(0x30+date%10);        
  147. }
  148. void init_1602()           //LCD1602初始化設(shè)置
  149. {
  150.         write_com(0x38);        
  151.         write_com(0x0c);
  152.         write_com(0x06);
  153.         delay(1000);
  154.         write_string(1,0,"sd:                 ");        
  155.         write_string(2,0,"wd:                 ");
  156.         write_zifu(1,8,0xdf);  //顯示度        
  157.         write_zifu(1,9,'C');
  158.         write_zifu(2,8,0xdf);  //顯示度        
  159.         write_zifu(2,9,'C');
  160. }
  161. /*****************************************主函數(shù)*************************************************/
  162. void main()
  163. {
  164.         Init_DS18B20();
  165.         init_1602();
  166.         while(1)
  167.         {
  168.                 write_sfm3_18B20(2,4,ReadTemperature());
  169.         }
  170. }
復(fù)制代碼



回復(fù)

使用道具 舉報

ID:8222 發(fā)表于 2022-1-10 17:04 | 顯示全部樓層
18B20讀寫時,總線拉低后沒有延時15微秒就讀寫,造成讀寫失敗。

評分

參與人數(shù) 1黑幣 +21 收起 理由
1218829816 + 21 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-1-10 18:05 | 顯示全部樓層
unsigned char ReadOneChar(void)
{
  unsigned char i=0;
  unsigned char dat = 0;
  for (i=8;i>0;i--)
  {
    DQ = 1;     // 給脈沖信號<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<先拉高
    DQ = 0;     // 給脈沖信號
    dat>>=1;
    DQ = 1;     // 給脈沖信號
    if(DQ)
            dat|=0x80;
        delay(4);
  }
  return(dat);
}

/*****寫一個字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 1;     // 給脈沖信號<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<先拉高
    DQ = 0;
    DQ = dat&0x01;
        delay(4);
    DQ = 1;
    dat>>=1;
  }
  delay(4);
}


/*****************************************主函數(shù)*************************************************/
void main()
{   Init_DS18B20();
    init_1602();
    while(1)
    {
        t = ReadTemperature();//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<取得反回值
        write_sfm3_18B20(2,4,t);
    }
}



你的ReadTemperature();中已有一個區(qū)域變數(shù)t
混肴了全域變數(shù)t
其實全域變數(shù)t由始致終都是0
LCD才會顯示000


命名變數(shù)時不要貪方便只用單字
特別是全域變數(shù)

評分

參與人數(shù) 1黑幣 +30 收起 理由
1218829816 + 30 贊一個!

查看全部評分

回復(fù)

使用道具 舉報

ID:770162 發(fā)表于 2022-1-10 18:08 | 顯示全部樓層
溫xyz 發(fā)表于 2022-1-10 17:04
18B20讀寫時,總線拉低后沒有延時15微秒就讀寫,造成讀寫失敗。

大佬,18B20讀寫字節(jié)部分在總線拉低后都進(jìn)行了延時,但還是一樣,是不是還有其他問題。
回復(fù)

使用道具 舉報

ID:770162 發(fā)表于 2022-1-10 18:10 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-10 18:05
unsigned char ReadOneChar(void)
{
  unsigned char i=0;

可以了,太謝謝大佬了,我再去多了解下區(qū)域變數(shù)和全域變數(shù)
回復(fù)

使用道具 舉報

ID:711951 發(fā)表于 2022-6-5 10:50 來自觸屏版 | 顯示全部樓層
樓主是怎么解決的呀
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-6-5 15:07 | 顯示全部樓層
wqy12345 發(fā)表于 2022-6-5 10:50
樓主是怎么解決的呀

參考我5樓的回貼
回復(fù)

使用道具 舉報

ID:64283 發(fā)表于 2022-6-5 22:36 | 顯示全部樓層
分兩步來做,每一步,查看18B20能不能讀出數(shù)據(jù)
第二步,LCD1602以膛能正常顯示
這兩個驅(qū)動解決后,你需要將18B20讀出來的數(shù)值化為相應(yīng)的字符,顯示到1602相應(yīng)的位置上
就是這么簡單
回復(fù)

使用道具 舉報

ID:61140 發(fā)表于 2022-6-7 21:26 | 顯示全部樓層
1218829816 發(fā)表于 2022-1-10 18:10
可以了,太謝謝大佬了,我再去多了解下區(qū)域變數(shù)和全域變數(shù)

應(yīng)該叫局部變量和全局變量
回復(fù)

使用道具 舉報

ID:1033546 發(fā)表于 2022-6-9 17:38 來自觸屏版 | 顯示全部樓層
lkc8210 發(fā)表于 2022-6-5 15:07
參考我5樓的回貼

那如果是LCD屏直接不顯示應(yīng)該是怎么辦呀?
回復(fù)

使用道具 舉報

ID:1049557 發(fā)表于 2023-5-13 20:43 | 顯示全部樓層
來了來了噗 發(fā)表于 2022-6-9 17:38
那如果是LCD屏直接不顯示應(yīng)該是怎么辦呀?

請問解決了嗎
回復(fù)

使用道具 舉報

ID:1064915 發(fā)表于 2023-7-18 17:02 | 顯示全部樓層
在我的51學(xué)習(xí)板上,卻是運行正常
回復(fù)

使用道具 舉報

ID:40039 發(fā)表于 2023-8-27 18:42 | 顯示全部樓層
  t=t*0.625+0.5;
這在單片機(jī)上無法運算呀?
回復(fù)

使用道具 舉報

ID:1092048 發(fā)表于 2023-8-27 21:27 | 顯示全部樓層
P3_5在溫度讀取期間應(yīng)該置1,不然就會讀取出錯
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 毛片高清 | 国产精品久久久亚洲 | 日日干干 | 热99精品视频 | 亚洲在线电影 | 日韩在线资源 | 欧美大片一区 | 日韩视频在线播放 | 狠狠操电影 | 久久久久www| 成人网视频 | 成年精品 | 亚洲精品一区中文字幕乱码 | 欧美亚洲高清 | 日韩一区在线播放 | 国产乱码精品一区二区三区五月婷 | 蜜桃视频成人 | 国产乱肥老妇国产一区二 | 欧美高清性xxxxhd | 久久久久久国产精品免费免费男同 | 狠狠躁18三区二区一区 | 久久国产精品99久久久久久丝袜 | 久久久久国产一区二区三区 | 国产高清一区二区三区 | 热re99久久精品国产99热 | 日韩成人av在线 | 精品91视频| 久久精品| 亚洲第一黄色网 | 亚洲码欧美码一区二区三区 | 免费黄色的网站 | 夜夜艹天天干 | 91传媒在线观看 | 99久久婷婷国产综合精品电影 | 欧美在线一区二区三区 | 盗摄精品av一区二区三区 | 国产精品免费一区二区 | 久久国产精品免费 | 福利片在线观看 | 九九av| 操操日|