亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 51單片機讀取18B20傳感器的ROM序列碼是8個FF [打印本頁]

作者: 小橋流水不    時間: 2025-11-22 20:08
標題: 51單片機讀取18B20傳感器的ROM序列碼是8個FF
      最近搞51單片機4個18b20傳感器并聯,通過讀取ROM序列碼查詢溫度并顯示在1602液晶上,現在已經能顯示,并且使用了幾天。4個18b20的ROM序列碼是一個單獨的工程代讀出來,寫到另一個工程的數組里。現在想把兩個工程功能合并,我用之前的代碼一個一個讀取ROM序列碼時,發現有兩個能讀出來并且正確,有兩個讀出來的是8個FF,   如果把這4個并聯在又能讀出各自的溫度。 一時間不知道是傳感器問題還是時序問題。請大師指點指點這是讀取rom序列碼的代碼:
  1. #include "STC89C5xRC.H"
  2. #include "timer_drv.h"
  3. #include "key_drv.h"
  4. #include "Delay.h"
  5. #include "Display.h"
  6. #include "stdio.h"
  7. #include "Ds18b20.h"
  8. #include "intrins.h"
  9. #include "one_bus.h"


  10. // -------------------------- 5. 測試示例 --------------------------
  11. void main(void)
  12. {

  13.         unsigned char romcode[8];
  14.         unsigned char key_val;
  15.         unsigned char i;
  16.         
  17.     KeyDrvInit();  // 初始化按鍵驅動
  18.     Timer0Init();
  19.         Timer1Init();   //000818
  20.     DelayMs(1000);
  21.         Start_18B20();
  22.     ReadRomCode(romcode);
  23.     printf("The Init is ok\n");
  24.         DelayMs(1000);
  25.         for(i = 0; i < 8; i ++)
  26.         {
  27.             
  28.                 printf("0X%bX \n", romcode[i]);
  29.         }
  30.         
  31.     while(1)
  32.         {

  33.                

  34.                 key_val = GetKeyVal();
  35.          if(key_val != 0)  // 有按鍵操作時進入分支
  36.         {
  37. ///           printf("the key_val num is %u\n", key_val);
  38.                         
  39.                         switch(key_val)
  40.             {
  41.                 // KEY1操作
  42.                 case 1:    P10 = ~P10; break;  //短按                    
  43.                
  44.                     
  45.                                 
  46.                 // KEY2操作
  47.                 case 2:    P11 = ~P11; break;  // 短按                                      
  48.                
  49.                     
  50.                   
  51.                 // KEY3操作
  52.                 case 3:    P12 = ~P12; break;  // 短按                  
  53.                
  54.                                 // KEY4操作
  55.                 case 4:    P13 = ~P13; break;  // 短按   

  56.                 default:       // 無效值,可忽略
  57.                     break;
  58.             }
  59.         // 主循環可執行其他任務(無阻塞)
  60.         // ...
  61.         }
  62.     }
  63. }











  64. #include "STC89C5xRC.H"
  65. #include "one_bus.h"
  66. #include "Delay.h"
  67. #include "intrins.h"
  68. #include "Ds18b20.h"


  69. /**
  70. ***********************************************************
  71. * @brief 單總線復位
  72. * @param  
  73. * @param  
  74. * @return ack
  75. ***********************************************************
  76. */
  77. bit OneWireRst()
  78. {
  79.         bit ack;
  80.    
  81.         DS18B20 = 1;
  82.         _nop_();        //00102105   1.09us
  83.         
  84.         DS18B20 = 0;  //拉低總線,發復位脈沖
  85.         DelayUs(250);   //00279514   580.51us   (480us-960us)
  86.     DS18B20 = 1;  
  87.     DelayUs(25);    //00153103   59.68us
  88.     ack = DS18B20;//讀取IO口,DS18B20的ack
  89.     while(!DS18B20);//等待18B20釋放總線,等待存在脈沖結束

  90.     return ack;
  91. }



  92. /**
  93. ***********************************************************
  94. * @brief 單總線寫一個字節
  95. * @param  
  96. * @param  
  97. * @return
  98. ***********************************************************
  99. */
  100. void WriteOneWire(unsigned char dat)
  101. {
  102.         u8 i;
  103.         bit dstemp;
  104.         for(i = 0; i < 8; i++)
  105.         {
  106.                 dat = dat >> 1;
  107.                 dstemp = CY;
  108.                 if(dstemp)
  109.                 {
  110.                         DS18B20 = 1;
  111.                         _nop_();        //00102105   1.09us
  112.                         
  113.                         DS18B20 = 0;
  114.                         _nop_();        //00102105   1.09us
  115.                         _nop_();        //00102105   1.09us
  116.                         DS18B20 = 1;
  117.                         DelayUs(40);    //00166124   92.23us  (60-120us)
  118.                 }
  119.                 else
  120.                 {
  121.                         DS18B20 = 1;
  122.                         _nop_();        //00102105   1.09us
  123.                         
  124.                         DS18B20 = 0;
  125.                         DelayUs(40);    //00166124   92.23us  (60-120us)
  126.                 }
  127.                
  128.                
  129.         }


  130. }


  131. /**
  132. ***********************************************************
  133. * @brief 單總線讀一個字節
  134. * @param  
  135. * @param  
  136. * @return   dat
  137. ***********************************************************
  138. */
  139. unsigned char ReadOneWire()
  140. {
  141.         unsigned char dat;
  142.         unsigned char tmp;
  143.         

  144.         for(tmp = 0x01; tmp != 0; tmp <<= 1)
  145.      {
  146.             DS18B20 = 1;
  147.             _nop_();        //00102105   1.09us
  148.             DS18B20 = 0;
  149.                 _nop_();        //00102105   1.09us
  150.                 _nop_();        //00102105   1.09us
  151.                 DS18B20 = 1;
  152.                 _nop_();        //00102105   1.09us
  153.                 if(!DS18B20)
  154.                 {
  155.                    dat &= ~tmp;
  156.                 }                        
  157.             
  158.                 else
  159.                 {
  160.                    dat |= tmp;
  161.                 }
  162.                 DelayUs(50);    //此語句若延時時間太短會出現讀取數值不對
  163.          }

  164.      return dat;

  165. }













  166. #include "STC89C5xRC.h"
  167. #include "Ds18b20.h"
  168. #include "Display.h"
  169. #include "Delay.h"
  170. #include "stdio.h"
  171. #include "one_bus.h"

  172.   int temper;


  173. bit Start_18B20()
  174. {
  175.         bit ack;
  176.         ack = OneWireRst(); //1.初始化
  177.     if(ack == 0)
  178.         {
  179.                 WriteOneWire(SKIP_ROM);//2.ROM指令
  180.                 WriteOneWire(CONVERT_T);//3.功能指令 啟動溫度轉換
  181.                
  182.         }
  183.         
  184.         return ~ack;

  185. }        



  186. /**
  187. ***********************************************************
  188. * @brief DS18B20讀一個字節
  189. * @param  
  190. * @param  
  191. * @return 讀回來的數值
  192. ***********************************************************
  193. */

  194. int DsGetTem()
  195. {
  196.         u8 tem1,tem2;
  197.         
  198.         EA = 0;
  199.         Start_18B20();
  200.         WriteOneWire(0xcc);
  201.         WriteOneWire(0x44);
  202.         OneWireRst();
  203.         WriteOneWire(0xcc);
  204.         WriteOneWire(0xbe);
  205.         tem1 = ReadOneWire();
  206.         tem2 = ReadOneWire();
  207.         EA = 1;
  208.         temper = tem2;
  209.         temper = (temper << 8) | tem1;
  210.         temper = temper * 0.0625 * 10;

  211.         return temper;
  212. }


  213. /**
  214. ***********************************************************
  215. * @brief 讀取DS18B20 ROM
  216. * @param  
  217. * @param  
  218. * @return
  219. ***********************************************************
  220. */
  221. void ReadRomCode(unsigned char *romcode)
  222. {
  223.         bit ack;
  224.         unsigned char i;
  225.         ack = OneWireRst();//獲取復位脈沖
  226.         if(ack == 0)
  227.         {
  228.                 WriteOneWire(0x33);//讀取ROM指令
  229.                 for(i = 0; i < 8; i ++)
  230.                 {
  231.                         romcode[i] = ReadOneWire();//讀64位ROM碼 下面一句和這句意思一樣
  232. //                    *(romcode+i) = ReadOneWire();//讀64位ROM碼
  233.                 }
  234.         
  235.         }



  236. }


復制代碼





0c9eafe5a4759376f6bb4f8554403bf8.png (13.43 KB, 下載次數: 0)

0c9eafe5a4759376f6bb4f8554403bf8.png

作者: WL0123    時間: 2025-11-23 08:22
單線多點18b20的測溫需要先讀出各分支器件的序列號并保存,通常采用“二讀法”,再根據序列號匹配各分支器件,才能正確獲取各分支器件的溫度值。
作者: 小橋流水不    時間: 2025-11-23 19:12
WL0123 發表于 2025-11-23 08:22
單線多點18b20的測溫需要先讀出各分支器件的序列號并保存,通常采用“二讀法”,再根據序列號匹配各分支器 ...

這4個18b20我是知道序列號的,是之前讀出來做好記錄的,如果現在將這4個序列號寫到數組里能讀出并顯示溫度,我現在想加一個功能是插一個傳感器,按下按鍵,讀出ROM碼再保存到eep。這個功能是為了方便更換傳感器不用重新燒錄,F在遇到的問題是我單獨只能讀出2個正確的rom碼,另外兩個讀出來都是8個FF。你要說傳感器壞了吧,把這個傳感器之前讀出來的ROM碼寫進去又能讀出溫度。
作者: jeff1837    時間: 2025-11-23 21:04
問題太多,還有啟動溫度轉換之后要等一定時間才能讀取到準確數據
作者: WL0123    時間: 2025-11-24 08:34
小橋流水不 發表于 2025-11-23 19:12
這4個18b20我是知道序列號的,是之前讀出來做好記錄的,如果現在將這4個序列號寫到數組里能讀出并顯示溫 ...

在已知多器件的序列號的條件下,需要發匹配命令0x55,匹配成功才能正確讀取指定器件返回的溫度值。例如:
  1. //匹配多通道DS18B20序列號
  2. void SeriesNumber(u8 ch)
  3. {
  4.         u8 i;
  5.         DS18B20_WriteByte(0x55); //發送匹配 ROM 命令
  6.         for(i=0;i<8;i++)
  7.                 DS18B20_WriteByte(table[ch][i]);
  8. }
  9. //讀取多通道DS18B20溫度函數
  10. u16 ReadTemperature(u8 ch)
  11. {
  12.         u16 TempH, TempL, Temperature;
  13.         DS18B20_Reset();                //設備復位
  14.         DS18B20_WriteByte(0xCC);        //跳過ROM匹配
  15.         DS18B20_WriteByte(0x44);        //啟動轉換
  16.         while (!DQ);                    //等待轉換完成
  17.         DS18B20_Reset();                //設備復位
  18.         SeriesNumber(ch);               //匹配 ROM
  19.         DS18B20_WriteByte(0xBE);        //讀暫存存儲器命令
  20.         TempL = DS18B20_ReadByte();     //讀溫度低字節
  21.         TempH = DS18B20_ReadByte();     //讀溫度高字節       
  22.         if(TempH & 0xf8)                //判斷是否位負數
  23.         {
  24.                 MinusFlag = 1;              //設置負數標志
  25.                 Temperature = (TempH<<8) | TempL;
  26.                 Temperature = ~Temperature + 1;
  27.                 Temperature *= 0.625;       //0.0625 * 10,保留1位小數點
  28.         }
  29.         else
  30.         {
  31.                 MinusFlag = 0;              //清除負數標志
  32.                 Temperature = (((TempH<<8) | TempL) * 0.625); //0.0625 * 10,保留1位小數點
  33.         }       
  34.         return Temperature;
  35. }
復制代碼





作者: lmn2005    時間: 2025-11-24 09:17
我覺得多半是時序不對
作者: univers    時間: 2025-12-1 15:45
這個數據表格里肯定有說,單總線多個并聯。也可以分開多個IO口。




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1