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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

51單片機(jī)讀取DS18B20顯示在LCD1602上,顯示的數(shù)值不正確是什么問題

[復(fù)制鏈接]
ID:216579 發(fā)表于 2024-9-5 09:05 | 顯示全部樓層 |閱讀模式
  1. #include<reg51.h>
  2. #include"delay.h"
  3. #include "LCD1602.h"
  4. #include"OneWire.h"
  5. #include"DS18B20.h"
  6. unsigned char flag;
  7. void Timer0_Init(void);
  8. void main()
  9. {       

  10.    unsigned char ack;
  11.    int temp;  //保存接受溫度數(shù)據(jù)
  12.    int intTemp,decTemp;                  //用來(lái)分離溫度數(shù)據(jù)的整數(shù)部分與小數(shù)部分
  13.    unsigned char str[12];
  14.    unsigned char len;
  15.    LCDInit();
  16.    Timer0_Init();  
  17.    Start18B20();
  18.    DelayXms(10);
  19.    while(1)
  20.    {
  21.            if(flag)
  22.            {
  23.                            flag=0;
  24.                         ack=Read18B20(&temp);
  25.                         if(ack)
  26.                         {
  27.                         intTemp=temp>>4;
  28.                         decTemp=temp&0x0f;
  29.                         len=IntegrtTorStr(intTemp,str);
  30.                         str[len++]='.';
  31.                         decTemp=(decTemp*100)/16;//0.0625
  32.                         str[len++]=decTemp/10+'0' ;
  33.                         str[len++]=decTemp%10+'0' ;
  34.                         str[len]='\0';
  35.                         LCDShowStr(1,1,str);
  36.                         }
  37.                         Start18B20();
  38.                         }
  39.            }
  40.    
  41.    }



  42. void Timer0_Init(void)                //10毫秒@12.000MHz
  43. {
  44. //        AUXR &= 0x7F;                        //定時(shí)器時(shí)鐘12T模式
  45.         TMOD &= 0xF0;                        //設(shè)置定時(shí)器模式
  46.         TMOD |= 0x01;                        //設(shè)置定時(shí)器模式
  47.         TL0 = 0xF0;                                //設(shè)置定時(shí)初始值
  48.         TH0 = 0xD8;                                //設(shè)置定時(shí)初始值
  49.         TF0 = 0;                                //清除TF0標(biāo)志
  50.         ET0=1;                                        //打開定時(shí)計(jì)數(shù)器中斷
  51.         EA=1;                                        //打開總中斷
  52.         TR0 = 1;                                //定時(shí)器0開始計(jì)時(shí)
  53. }


  54. void Timer0_ISR()  interrupt 1
  55. {
  56.   static unsigned char timer0Cnt=0;
  57.     TR0=0;
  58.         TL0 = 0xF0;                                //設(shè)置定時(shí)初始值
  59.         TH0 = 0xD8;                                //設(shè)置定時(shí)初始值
  60.     timer0Cnt++ ;
  61.    if(timer0Cnt>=100)
  62.    {
  63.                    timer0Cnt=0;
  64.                 flag=1;

  65.    }
  66.         TR0=1;
  67. }
復(fù)制代碼
  1. #ifndef __DS18B20_H__
  2. #define __DS18B20_H__
  3. #include <reg51.h>
  4. #include"OneWire.h"
  5. //ROM指令
  6. #define SEARCH_ROM        0xf0             //搜索ROM指令
  7. #define READ_ROM          0x33             //讀取ROM指令
  8. #define MATH_ROM          0x55                    //匹配ROM指令
  9. #define SKIP_ROM          0xcc                 //跳過ROM指令
  10. #define ALARM_SEARCH      0xec                 //報(bào)警搜索指令
  11. //暫存器指令
  12. #define CONVERT_T          0x44                 //溫度轉(zhuǎn)換指令
  13. #define WRITE_REGISTER     0x4e                 //寫暫存器指令
  14. #define READ_REGISTER      0xbe                 //讀取暫存器指令
  15. #define RECALL_E2          0xb8                 //召回EEPROM指令
  16. #define COPY_REGISTER      0x48                 //讀取暫存器指令
  17. #define READ_POWER_SUPPLY  0xb4                 //讀取電源模式指令
  18. bit Read18B20(int *temp);
  19. bit Start18B20();
  20. #endif
復(fù)制代碼
  1. #include"OneWire.h"
  2. #include "intrins.h"

  3. bit OneWierRet()
  4. {
  5.    bit ack;
  6.    EA=0;
  7.   DS18B20=0;   //總線拉低,發(fā)復(fù)位脈沖
  8.   Delay600us();//480-960US之間
  9.   DS18B20=1;  
  10.   Delay60us(); //15-60us取60us
  11.   ack=DS18B20;          //讀取IO口DS18B20的ACK
  12.   while(!DS18B20);        //等待18B20釋放總線,等待存在脈沖結(jié)束
  13.   EA=1;
  14.   return ack;

  15. }
  16. void WriteOneWire(unsigned char dat)                   //寫一個(gè)位函數(shù)
  17. {
  18.          unsigned char tmp;
  19.          EA=0;
  20.          for(tmp=0x01;tmp!=0;tmp<<=1) //0000 0010
  21.          {
  22.                  DS18B20=0;           //總線拉低至少1us
  23.                 _nop_();
  24.                    _nop_();
  25.                   if((dat&tmp)==0)        //判斷是0還是1
  26.                  DS18B20=0;                         //為0則寫0
  27.                  else
  28.                 DS18B20=1;                         //否則寫1
  29.                   Delay60us();
  30.                 DS18B20=1;
  31.          }
  32.          EA=1;

  33. }
  34. unsigned char ReadOneWire()
  35. {
  36.   unsigned char dat;
  37.   unsigned char tmp;
  38.   EA=0;       
  39.   for(tmp=0x01;tmp!=0;tmp<<=1)//         0000 0110
  40.   {                                                           //0000 0010 tmp
  41.           DS18B20=0;                                   //dat 0000 0001
  42.         _nop_();                                        //         1111 1101
  43.         _nop_();
  44.         DS18B20=1;
  45.         _nop_();
  46.         _nop_();

  47.         if(!DS18B20)
  48.           dat&=~tmp;
  49.           else
  50.           dat|=tmp;
  51.             Delay60us();
  52.   }
  53.   EA=1;
  54.   return dat;

  55. }
復(fù)制代碼
  1. #include "LCD1602.h"
  2. #include "delay.h"

  3. //unsigned char code str[][8]={0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00};
  4. void LCDReadBF() //忙位檢測(cè)函數(shù)
  5. {
  6.   unsigned char state;
  7.          unsigned char i;
  8.         LCD1602_DB=0xFF;//io口置1做輸入
  9.         LCD1602_RS=0;
  10.         LCD1602_RW=1;
  11.         do
  12.         {
  13.         state=LCD1602_DB;// 值讀到參數(shù)中
  14.         LCD1602_EN=1;
  15.         DelayXms(5);
  16.         LCD1602_EN=0;
  17.                 i++;
  18.                 if(i>50)
  19.                         break;
  20.         }
  21.        
  22.         while(state&0x80);
  23. }
  24. //寫入命令
  25. void LCDWriteCmd(unsigned char cmd)
  26. {
  27.         LCDReadBF();//等待忙檢測(cè),不忙時(shí)操作
  28.         LCD1602_RS=0;
  29.         LCD1602_DB=cmd;
  30.         LCD1602_RW=0;

  31.         LCD1602_EN=1;
  32.         DelayXms(5);
  33.         LCD1602_EN=0;

  34. }

  35. //寫入數(shù)據(jù)
  36. void LCDWritedata(unsigned char dat)
  37. {
  38.         LCDReadBF();//等待忙檢測(cè),不忙操作
  39.         LCD1602_RS=1;
  40.         LCD1602_DB=dat;
  41.         LCD1602_RW=0;
  42.         LCD1602_EN=1;
  43.         DelayXms(5);
  44.         LCD1602_EN=0;

  45. }
  46. //初始化
  47. void LCDInit()
  48. {
  49.                 LCDWriteCmd(LCD_MODE_PIN8);                //顯示模式設(shè)置 2行 5*8點(diǎn)陣
  50.           DelayXms(5);
  51.                 LCDWriteCmd(LCD_MODE_PIN8);
  52.                 LCDWriteCmd(LCD_DIS_ON);                   //顯示開,光標(biāo)關(guān)
  53.                 LCDWriteCmd(LCD_CURSOR_RIGHT); //        光標(biāo)右移
  54.                 LCDWriteCmd(LCD_SCREEN_CLR);  //清屏
  55.           LCDWriteCmd(0x80);
  56. }

  57. void LCDSetPosition(unsigned char x,unsigned char y)
  58. {
  59.         if(0==y)
  60. {
  61.                 LCDWriteCmd(0x80|x);

  62.         }
  63.         else
  64.         {

  65.                 LCDWriteCmd(0x80|(0x40+x));
  66.         }


  67. }
  68. void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str)

  69. {
  70.         LCDSetPosition(x,y);
  71.         while(*str!='\0')//逐次寫入顯示字符,直到最后一個(gè)字符"0"
  72.   {
  73.     LCDWritedata(*str);//寫入當(dāng)前字符并顯示
  74.         str++;//地址指針加1,指向下一個(gè)待寫字符
  75.   }
  76. }

  77. //第一種寫法
  78. // void LCDWriteCGRAM()
  79. // {
  80. //     unsigned char i;
  81. //         LCDWriteCmd(0x48);  //1、構(gòu)造自定義字符
  82. //         for(i=0;i<64;i++)
  83. //         {   
  84. //                 LCDWritedata(str[i]);
  85. //         }
  86.         //顯示字符
  87. //         LCDWriteCmd(0x80|0x00);
  88. //         LCDWritedata(0x01);

  89. //第二種方法
  90. void LCDSetChar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str)
  91. {
  92.         unsigned char i;
  93.         //先構(gòu)造自定義字符 確定位置 CGRAM
  94.         for(i=0;i<8;i++)
  95.         {
  96.                 LCDWriteCmd(0x40+pos*8+i);
  97.                 LCDWritedata(*(str+i));



  98.   }
  99.         //顯示
  100.         LCDSetPosition(x,y);//設(shè)置顯示位置DDRAM
  101.         LCDWritedata(0x00+pos);//顯示代碼




  102. }

  103. unsigned char IntegrtTorStr(long dat,unsigned char *str)
  104. {
  105.          unsigned char i=0;
  106.          unsigned char len=0;
  107.          unsigned char buf[11];
  108.          if(dat<0)
  109.          {
  110.            dat=-dat;//如果是負(fù)數(shù),去絕對(duì)值
  111.            *str='-';
  112.            len++;
  113.          }
  114.           do
  115.           {
  116.                    buf[i++]=dat%10+'0';        //dat%10+0x30;buf[0]=8          buf[1]=7  buf[2]=6
  117.                  dat/=10;
  118.           
  119.           
  120.           }
  121.                   while(dat>0);
  122.             len+=i;
  123.                 while(i-->0)
  124.                 {
  125.                   *str++=buf[i];
  126.        
  127.                 }
  128.                  *str='\0';
  129.                  return len;
  130. }







  131. //         while(*str)
  132. //         {
  133. //         LCDWritedata(*str);
  134. //                 str++;
  135. //         }

  136. // }
復(fù)制代碼
  1. #ifndef __LCD1602_H__
  2. #define __LCD1602_H__

  3. #include <reg51.h>

  4. //IO口聲明
  5. #define LCD1602_DB P0
  6. sbit LCD1602_RS=P2^5;
  7. sbit LCD1602_RW=P2^6;
  8. sbit LCD1602_EN=P2^7;
  9. //unsigned char code str[];
  10. //顯示模式設(shè)置指令

  11. #define LCD_MODE_PIN8    0x38                  //8位數(shù)據(jù)口,兩行,5*8點(diǎn)陣
  12. #define LCD_MODE_PIN4    0x28                  //4位數(shù)據(jù)口,兩行,5*8點(diǎn)陣

  13. #define LCD_SCREEN_CLR   0X01                  //清屏
  14. #define LCD_CURSOR_RST   0x02                  //光標(biāo)復(fù)位
  15. //顯示開關(guān)控制指令
  16. #define LCD_DIS_CUR_BLK_ON 0x0F  //顯示開,光標(biāo)開,光標(biāo)閃爍
  17. #define LCD_DIS_CUR_ON           0x0E  //顯示開,光標(biāo)開,光標(biāo)不閃爍
  18. #define LCD_DIS_ON                     0x0C  //顯示開,光標(biāo)關(guān),光標(biāo)不閃爍
  19. #define LCD_DIS_OFF        0X08  //顯示關(guān),光標(biāo)關(guān),光標(biāo)不閃爍
  20. //顯示模式控制
  21. #define LCD_CURSOR_RIGHT          0x06 //光標(biāo)右移,顯示不移動(dòng)
  22. #define LCD_CURSOR_LEFT           0x04 //光標(biāo)左移,顯示不移動(dòng)
  23. #define LCD_DIS_MODE_LEFT          0x07 //操作后,AC自增,畫面平移
  24. #define LCD_DIS_MODE_RIGHT  0x05 //操作后,AC自減,畫面平移
  25. //光標(biāo)、顯示移動(dòng)指令
  26. #define LCD_CUR_MODE_LEFT   0X10 //光標(biāo)左移
  27. #define LCD_CUR_MODE_RIGHT  0x14 //光標(biāo)右移
  28. #define LCD_DIS_MODE_LEFT1   0x18 //顯示右移
  29. #define LCD_DIS_MODE_RIGHT1  0x1C //顯示左移

  30. void LCDReadBF();
  31. void LCDWriteCmd(unsigned char cmd);
  32. void LCDWritedata(unsigned char dat);
  33. void LCDInit();
  34. void LCDShowStr(unsigned char x,unsigned char y,unsigned char *str);
  35. void LCDSetPosition(unsigned char x,unsigned char y);
  36. void LCDSetChar(unsigned char x,unsigned char y,unsigned char pos,unsigned char *str);
  37. //CGRAM地址設(shè)置
  38. //0  1  A5
  39. unsigned char IntegrtTorStr(long dat,unsigned char *str);
  40. #endif
復(fù)制代碼


LCD1602.jpg

9.18B20顯示溫度 (1).zip

357.7 KB, 下載次數(shù): 4

回復(fù)

使用道具 舉報(bào)

ID:1131410 發(fā)表于 2024-9-5 10:14 | 顯示全部樓層
很多年前用過這個(gè),DS18B20刷新速度不宜太快不然溫度就不準(zhǔn),我記得當(dāng)時(shí)是1秒讀一次溫度的
回復(fù)

使用道具 舉報(bào)

ID:1034262 發(fā)表于 2024-9-5 11:39 | 顯示全部樓層
程序時(shí)序不正確
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人免费观看男女羞羞视频 | 天天夜干| 97伊人| 亚洲精品一区二三区不卡 | 欧美精品区 | 在线一区 | 亚洲网在线 | 超碰97人人人人人蜜桃 | 亚洲精品二三区 | 性欧美hd| 欧美日本高清 | 国产一区二区 | 精品乱码一区二区三四区 | 午夜爽爽爽男女免费观看 | 北条麻妃一区二区三区在线视频 | 国产精品成人国产乱一区 | 91影院在线观看 | 成人久久久久 | 久久久.com| 精品区| 国产高清在线视频 | 亚洲精品在线免费观看视频 | 国产亚洲精品久久午夜玫瑰园 | 欧美日韩国产免费 | 亚洲精品视频在线看 | 一级免费毛片 | 亚洲国产中文字幕 | 免费视频一区 | 亚洲成人福利在线观看 | 91精品久久 | 久久久久久久久中文字幕 | 欧美综合一区二区 | 日韩精品在线播放 | 亚洲精选一区 | 久操国产| 少妇精品亚洲一区二区成人 | 日韩中文字幕高清 | 国产在线不卡 | 精品国产青草久久久久96 | 欧美亚洲一级 | 亚洲精品一区二区网址 |