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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3049|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+ds18b20溫度讀取錯(cuò)誤 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
是不是代碼錯(cuò)誤了

  1. #include"temp.h"
  2. /*******************************************************************************
  3. * 函 數(shù) 名         : Delay1ms
  4. * 函數(shù)功能                   : 延時(shí)函數(shù)
  5. * 輸    入         : 無
  6. * 輸    出         : 無
  7. *******************************************************************************/

  8. void Delay1ms(uint y)
  9. {
  10.         uint x;
  11.         for( ; y>0; y--)
  12.         {
  13.                 for(x=110; x>0; x--);
  14.         }
  15. }
  16. /*******************************************************************************
  17. * 函 數(shù) 名         : Ds18b20Init
  18. * 函數(shù)功能                   : 初始化
  19. * 輸    入         : 無
  20. * 輸    出         : 初始化成功返回1,失敗返回0
  21. *******************************************************************************/

  22. uchar Ds18b20Init()
  23. {
  24.         uchar i;
  25.         DSPORT = 0;                         //將總線拉低480us~960us
  26.         i = 70;        
  27.         while(i--);//延時(shí)642us
  28.         DSPORT = 1;                        //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
  29.         i = 0;
  30.         while(DSPORT)        //等待DS18B20拉低總線
  31.         {
  32.                 i++;
  33.                 if(i>5)//等待>5MS
  34.                 {
  35.                         return 0;//初始化失敗
  36.                 }
  37.                 Delay1ms(1);        
  38.         }
  39.         return 1;//初始化成功
  40. }

  41. /*******************************************************************************
  42. * 函 數(shù) 名         : Ds18b20WriteByte
  43. * 函數(shù)功能                   : 向18B20寫入一個(gè)字節(jié)
  44. * 輸    入         : com
  45. * 輸    出         : 無
  46. *******************************************************************************/

  47. void Ds18b20WriteByte(uchar dat)
  48. {
  49.         uint i, j;

  50.         for(j=0; j<8; j++)
  51.         {
  52.                 DSPORT = 0;                       //每寫入一位數(shù)據(jù)之前先把總線拉低1us
  53.                 i++;
  54.                 DSPORT = dat & 0x01;  //然后寫入一個(gè)數(shù)據(jù),從最低位開始
  55.                 i=6;
  56.                 while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60us
  57.                 DSPORT = 1;        //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值
  58.                 dat >>= 1;
  59.         }
  60. }
  61. /*******************************************************************************
  62. * 函 數(shù) 名         : Ds18b20ReadByte
  63. * 函數(shù)功能                   : 讀取一個(gè)字節(jié)
  64. * 輸    入         : com
  65. * 輸    出         : 無
  66. *******************************************************************************/


  67. uchar Ds18b20ReadByte()
  68. {
  69.         uchar byte, bi;
  70.         uint i, j;        
  71.         for(j=8; j>0; j--)
  72.         {
  73.                 DSPORT = 0;//先將總線拉低1us
  74.                 i++;
  75.                 DSPORT = 1;//然后釋放總線
  76.                 i++;
  77.                 i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定
  78.                 bi = DSPORT;         //讀取數(shù)據(jù),從最低位開始讀取
  79.                 /*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/
  80.                 byte = (byte >> 1) | (bi << 7);                                                  
  81.                 i = 4;                //讀取完之后等待48us再接著讀取下一個(gè)數(shù)
  82.                 while(i--);
  83.         }                                
  84.         return byte;
  85. }
  86. /*******************************************************************************
  87. * 函 數(shù) 名         : Ds18b20ChangTemp
  88. * 函數(shù)功能                   : 讓18b20開始轉(zhuǎn)換溫度
  89. * 輸    入         : com
  90. * 輸    出         : 無
  91. *******************************************************************************/

  92. void  Ds18b20ChangTemp()
  93. {
  94.         Ds18b20Init();
  95.         Delay1ms(1);
  96.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  97.         Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令
  98. //        Delay1ms(100);        //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了
  99.    
  100. }
  101. /*******************************************************************************
  102. * 函 數(shù) 名         : Ds18b20ReadTempCom
  103. * 函數(shù)功能                   : 發(fā)送讀取溫度命令
  104. * 輸    入         : com
  105. * 輸    出         : 無
  106. *******************************************************************************/

  107. void  Ds18b20ReadTempCom()
  108. {        

  109.         Ds18b20Init();
  110.         Delay1ms(1);
  111.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  112.         Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
  113. }
  114. /*******************************************************************************
  115. * 函 數(shù) 名         : Ds18b20ReadTemp
  116. * 函數(shù)功能                   : 讀取溫度
  117. * 輸    入         : com
  118. * 輸    出         : 無
  119. *******************************************************************************/

  120. int Ds18b20ReadTemp()
  121. {
  122.         int temp = 0;
  123.         uchar tmh, tml;
  124.         Ds18b20ChangTemp();                                 //先寫入轉(zhuǎn)換命令
  125.         Ds18b20ReadTempCom();                        //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  126.         tml = Ds18b20ReadByte();                //讀取溫度值共16位,先讀低字節(jié)
  127.         tmh = Ds18b20ReadByte();                //再讀高字節(jié)
  128.         temp = tmh;
  129.         temp <<= 8;
  130.         temp |= tml;
  131.         return temp;
  132. }


復(fù)制代碼

03.png (58.36 KB, 下載次數(shù): 23)

仿真圖

仿真圖

仿真和程序.zip

145.02 KB, 下載次數(shù): 3

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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2020-8-15 21:13 | 只看該作者
給你修改一下,經(jīng)驗(yàn)證正常。
  1. #include"temp.h"
  2. /*------------------------------------------------
  3. * 函 數(shù) 名         : DelayUs2x 長度如下 T=tx2+5 uS
  4. * 函數(shù)功能         : 延時(shí)函數(shù)
  5. * 輸    入         : 無
  6. * 輸    出         : 無
  7. ------------------------------------------------*/
  8. void DelayUs2x(uchar t)
  9. {   
  10.         while(--t);
  11. }
  12. /*******************************************************************************
  13. * 函 數(shù) 名         : Delay1ms
  14. * 函數(shù)功能         : 延時(shí)函數(shù)
  15. * 輸    入         : 無
  16. * 輸    出         : 無
  17. *******************************************************************************/

  18. void Delay1ms(uint y)
  19. {
  20.         while(y--)
  21.         {
  22.                 //大致延時(shí)1mS
  23.                 DelayUs2x(245);
  24.                 DelayUs2x(245);
  25.         }
  26. }
  27. /*******************************************************************************
  28. * 函 數(shù) 名         : Ds18b20Init
  29. * 函數(shù)功能         : 初始化
  30. * 輸    入         : 無
  31. * 輸    出         : 初始化成功返回1,失敗返回0
  32. *******************************************************************************/

  33. bit Ds18b20Init()
  34. {
  35.         bit dat=0;
  36.         DSPORT = 1;    //DSPORT復(fù)位
  37.         DelayUs2x(5);   //稍做延時(shí)
  38.         DSPORT = 0;         //單片機(jī)將DSPORT拉低
  39.         DelayUs2x(200); //精確延時(shí) 大于 480us 小于960us
  40.         DelayUs2x(200);
  41.         DSPORT = 1;        //拉高總線
  42.         DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖
  43.         dat=DSPORT;        //如果x=0則初始化成功, x=1則初始化失敗
  44.         DelayUs2x(25); //稍作延時(shí)返回
  45.         return dat;
  46. }

  47. /*******************************************************************************
  48. * 函 數(shù) 名         : Ds18b20WriteByte
  49. * 函數(shù)功能         : 向18B20寫入一個(gè)字節(jié)
  50. * 輸    入         : com
  51. * 輸    出         : 無
  52. *******************************************************************************/

  53. void Ds18b20WriteByte(uchar dat)
  54. {
  55.         uchar i=0;
  56.         for(i=8; i>0; i--)
  57.         {
  58.                 DSPORT = 0;
  59.                 DSPORT = dat&0x01;
  60.                 DelayUs2x(25);
  61.                 DSPORT = 1;
  62.                 dat>>=1;
  63.         }
  64.         DelayUs2x(25);
  65. }
  66. /*******************************************************************************
  67. * 函 數(shù) 名         : Ds18b20ReadByte
  68. * 函數(shù)功能         : 讀取一個(gè)字節(jié)
  69. * 輸    入         : com
  70. * 輸    出         : 無
  71. *******************************************************************************/
  72. uchar Ds18b20ReadByte()
  73. {
  74.         uchar i=0;
  75.         uchar dat = 0;
  76.         for (i=8;i>0;i--)
  77.         {
  78.                 DSPORT = 0; // 給脈沖信號
  79.                 dat>>=1;
  80.                 DSPORT = 1; // 給脈沖信號
  81.                 if(DSPORT)
  82.                 dat|=0x80;
  83.                 DelayUs2x(25);
  84.         }
  85.         return(dat);
  86. }
  87. /*******************************************************************************
  88. * 函 數(shù) 名         : Ds18b20ChangTemp
  89. * 函數(shù)功能         : 讓18b20開始轉(zhuǎn)換溫度
  90. * 輸    入         : com
  91. * 輸    出         : 無
  92. *******************************************************************************/

  93. void  Ds18b20ChangTemp()
  94. {
  95.         Ds18b20Init();
  96. //        Delay1ms(1);
  97.         Ds18b20WriteByte(0xcc);                //跳過ROM操作命令                 
  98.         Ds18b20WriteByte(0x44);            //溫度轉(zhuǎn)換命令
  99.         Delay1ms(10);                                                //等待轉(zhuǎn)換成功
  100. }
  101. /*******************************************************************************
  102. * 函 數(shù) 名         : Ds18b20ReadTempCom
  103. * 函數(shù)功能         : 發(fā)送讀取溫度命令
  104. * 輸    入         : com
  105. * 輸    出         : 無
  106. *******************************************************************************/

  107. void  Ds18b20ReadTempCom()
  108. {        
  109.         Ds18b20Init();
  110. //        Delay1ms(1);
  111.         Ds18b20WriteByte(0xcc);         //跳過ROM操作命令
  112.         Ds18b20WriteByte(0xbe);         //發(fā)送讀取溫度命令
  113. }
  114. /*******************************************************************************
  115. * 函 數(shù) 名         : Ds18b20ReadTemp
  116. * 函數(shù)功能                   : 讀取溫度
  117. * 輸    入         : com
  118. * 輸    出         : 無
  119. *******************************************************************************/

  120. int Ds18b20ReadTemp()
  121. {
  122.         int temp = 0;
  123.         uchar tmh, tml;
  124.         Ds18b20ChangTemp();         //先寫入轉(zhuǎn)換命令
  125.         Ds18b20ReadTempCom();       //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
  126.         tml = Ds18b20ReadByte();    //讀取溫度值共16位,先讀低字節(jié)
  127.         tmh = Ds18b20ReadByte();    //再讀高字節(jié)
  128.         temp = tmh<<8|tml;
  129.         return temp;
  130. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:745303 發(fā)表于 2020-8-17 13:21 | 只看該作者
wulin 發(fā)表于 2020-8-15 21:13
給你修改一下,經(jīng)驗(yàn)證正常。

你好,你的函數(shù)在35到48這一段出現(xiàn)了Ds18b20Init重新定義的問題
回復(fù)

使用道具 舉報(bào)

地板
ID:213173 發(fā)表于 2020-8-17 17:47 | 只看該作者
66584 發(fā)表于 2020-8-17 13:21
你好,你的函數(shù)在35到48這一段出現(xiàn)了Ds18b20Init重新定義的問題

把temp.h頭文件里函數(shù)聲明也改成bit Ds18b20Init();即可。
回復(fù)

使用道具 舉報(bào)

5#
ID:814418 發(fā)表于 2020-8-17 18:37 | 只看該作者
Ds18b20Init定義有問題
回復(fù)

使用道具 舉報(bào)

6#
ID:745303 發(fā)表于 2020-8-18 15:06 | 只看該作者
wulin 發(fā)表于 2020-8-17 17:47
把temp.h頭文件里函數(shù)聲明也改成bit Ds18b20Init();即可。

可以了謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:745303 發(fā)表于 2020-8-20 14:29 | 只看該作者
楓城落 發(fā)表于 2020-8-17 18:37
Ds18b20Init定義有問題

可以幫忙再修改下嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:745303 發(fā)表于 2020-8-21 14:08 | 只看該作者

你好我把實(shí)物做了出來之后有時(shí)會(huì)出現(xiàn)數(shù)據(jù)讀取錯(cuò)誤的現(xiàn)象,是不是在源代碼中l(wèi)cd顯示時(shí)溫度值得計(jì)算有錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久久久 | 午夜视频在线 | 国产在线精品一区二区三区 | 少妇特黄a一区二区三区88av | 婷婷一级片 | 亚洲国产精品久久 | 亚洲啪啪 | 日韩中文字幕在线观看视频 | 91精品国产综合久久久久久丝袜 | 精品在线一区二区 | 国产精品视频二区三区 | 亚洲国产中文字幕 | 91久久精品国产 | 三级av免费 | 国产精品成人一区二区三区夜夜夜 | 久久久做 | 欧美午夜精品理论片a级按摩 | 成年人在线电影 | 国偷自产av一区二区三区 | 一级毛片黄片 | 国产真实精品久久二三区 | 国产精品1区 | 欧美日韩一区精品 | 精品久久久久久久久久久久 | 国产精品欧美一区二区三区不卡 | 久久人操 | 欧美激情欧美激情在线五月 | 亚洲成人一区 | 精精国产xxxx视频在线播放 | 国产91九色 | 精品一区欧美 | 一级黄色播放 | 综合一区二区三区 | 亚洲视频中文字幕 | 国产精品99免费视频 | 成人精品一区亚洲午夜久久久 | 国产高清性xxxxxxxx | 国产视频福利一区 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 性欧美精品一区二区三区在线播放 | 黄片毛片|