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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5088|回復: 1
收起左側

單片機+DS18B20多點溫度測試程序+詳細教程資料

  [復制鏈接]
ID:535176 發表于 2020-3-30 14:22 | 顯示全部樓層 |閱讀模式
DS18B20溫度傳感器
一、簡介:
1.png 圖示有字的一面,注意GNDVCC不要接反。工作電壓3.0v~5.5V,采集溫度-55度到正125度,可編程溫度9-12位,精度分別是0.5度,0.25度,0.1250.0625度,默認都是12位,12位轉換時間是750ms9位是93.75ms,電壓負壓特性(不會因電源接反發熱燒壞)。
二、電路連接:
2.png
接一個上拉電阻。
三、通信方式:
單總線通信:
單總線是一種具有一個總線主機和一個或若干個從機的系統。嚴格按照器件的時間要求進行復位,寫命令,讀寫數據等。整個過程在一條線上進行。
四、DS18B20的內部結構:
3.png
64位光刻ROM,溫度傳感器,非易失性的溫度報警觸發器THTL,配置寄存器。出廠前ROM的排列是:開始8位產品類型標號(28H),接著48位是DS18B20全球唯一序列號,最后8位是前面56位的循環冗余校驗碼。
DS18B20存儲器:
4.png
Byte0Byte1分別存儲溫度寄存器的低字節和高字節,這兩個字節是只讀的。我們一般只操作這兩個字節。
5.png
五、DS18B20的指令:
命令有兩種,一種ROM的指令,一種暫存器的指令。
6.png
六、操作時序:
分為4個步驟:
1. 復位:單片機發一個低電平給DS18B20DS18B20返回一個低電平給單片機,完成喚醒握手。
2. 發送ROM命令
3. 發送暫存器指令
4. 發送數據或接受數據
單個溫度測試代碼:
  1. #include<All.h>

  2. uchar xdata DS18B20_Buffer[2]=0;//保存溫度的數據

  3. void Delay500us()        //@24.000MHz

  4. {

  5. unsigned char i, j;

  6. i = 16;

  7. j = 147;

  8. do

  9. {

  10. while (--j);

  11. } while (--i);

  12. }

  13. void Delay80us()        //@24.000MHz

  14. {

  15. unsigned char i, j;

  16. _nop_();

  17. _nop_();

  18. i = 3;

  19. j = 123;

  20. do

  21. {

  22. while (--j);

  23. } while (--i);

  24. }

  25. void Delay60us()        //@24.000MHz

  26. {

  27. unsigned char i, j;

  28. _nop_();

  29. i = 2;

  30. j = 220;

  31. do

  32. {

  33. while (--j);

  34. } while (--i);

  35. }

  36. void Delay10us()        //@24.000MHz

  37. {

  38. unsigned char i;

  39. i = 78;

  40. while (--i);

  41. }

  42. void Delay2us()        //@24.000MHz

  43. {

  44. unsigned char i;

  45. i = 14;

  46. while (--i);

  47. }

  48. /*********************************

  49. * @函數名:DS18B20_Reset

  50. * @描   述:復位

  51. * @說   明:

  52. * @參   數:無

  53. * @返回值:無

  54. *********************************/

  55. void DS18B20_Reset()

  56. {

  57.     DS18B20_DQ=0;//總線拉低

  58. Delay500us();//保持500us

  59. DS18B20_DQ=1;//短暫拉高

  60. Delay80us();//80us



  61. //等待拉低

  62. Delay500us();//返回一個106us的低電平

  63. DS18B20_DQ=1;

  64. _nop_();//短暫拉高

  65. _nop_();

  66. }

  67. /*********************************

  68. * @函數名:DS18B20_Write_Com

  69. * @描   述:寫寄存器指令

  70. * @說   明:

  71. * @參   數:dat 要寫入的數據

  72. * @返回值:無

  73. *********************************/

  74. void DS18B20_Write_Com(uchar com)

  75. {

  76. uchar idata i;

  77. for(i=0;i<8;i++)

  78. {

  79.       DS18B20_DQ=0;

  80.    Delay10us();//先拉低15us

  81. _nop_();

  82. DS18B20_DQ=(bit)(com&0x01);//先發低位

  83. com>>=1;//移位

  84. Delay60us();//繼續拉低15us

  85. DS18B20_DQ=1;//短暫拉高

  86. Delay2us();

  87. }

  88. }

  89. /*********************************

  90. * @函數名:DS18B20_Read_Data

  91. * @描   述:讀數據

  92. * @說   明:

  93. * @參   數:無

  94. * @返回值:dat  讀出的數據

  95. *********************************/

  96. uchar DS18B20_Read_Data()

  97. {

  98. uchar idata i,value;

  99. for(i=0;i<8;i++)

  100. {

  101. DS18B20_DQ=0;

  102. Delay10us();

  103. value>>=1;

  104. DS18B20_DQ=1;

  105. //Ds18B20會返回值。,無論是0還是1,都延遲15us

  106. Delay2us();

  107. //        Delay15us();//先拉低15us

  108. if(DS18B20_DQ)//是1

  109. value|=0x80;//最低位

  110. Delay60us();

  111. }

  112. return value;

  113. }

  114. /*********************************

  115. * @函數名:DS18B20_Handle

  116. * @描   述:溫度處理

  117. * @說   明:1. 復位 2.發送ROM命令 3.發送暫存器指令 讀RAM 4.數據

  118. * @參   數:無

  119. * @返回值:無

  120. *********************************/

  121. void DS18B20_Handle()

  122. {

  123. uchar xdata value_High,value_Low;

  124. float num;//保存小數

  125.     DS18B20_Reset();//復位

  126. DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作

  127. //DS18B20_Write_Com(0x33);//讀64位ROM

  128. DS18B20_Write_Com(0x44);//發送指令44H,啟動溫度轉換

  129. Delay10us();

  130. DS18B20_Reset();//復位

  131. DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作

  132. DS18B20_Write_Com(0xbe);//發送指令BEH,讀取9字節RAM數據的前兩個數據

  133. Delay10us();

  134. value_Low=DS18B20_Read_Data();//先讀低字節Byte0

  135. value_High=DS18B20_Read_Data();//高字節Byte1


  136. value_High<<=4;//整數的高3位

  137. value_High+=(value_Low&0xf0)>>4;//整數的低4位

  138. DS18B20_Buffer[0]=value_High;//整數

  139. num=(value_Low&0x0f)*0.0625;//小數

  140. DS18B20_Buffer[1]=(uchar)(num*100);//小數

  141. }
復制代碼
多點測試:(兩個)
步驟:
1. 先讀出每個傳感器的唯一ROM序列;
  1. /*********************************

  2. * @函數名:DS18B20_Read_64Rom

  3. * @描   述:讀64位的ROM 唯一標識

  4. * @說   明:

  5. * @參   數:*buffer 讀出的8個字節的數據

  6. * @返回值:無

  7. *********************************/

  8. void DS18B20_Read_64Rom(uchar *buffer)

  9. {

  10.           uchar i;

  11.     DS18B20_Reset();//復位

  12. DS18B20_Write_Com(0x33);//讀64位ROM

  13. for(i=0;i<8;i++) //讀取64個字節

  14. buffer[i]=DS18B20_Read_Data();
  15. }
復制代碼
7.png
2. 用兩個數組存讀出來的序列號:
8.png
3.寫入ROm序列號,并啟動轉換溫度:
  1. /*********************************

  2. * @函數名:DS18B20_Write_Rom

  3. * @描   述:寫64ROM

  4. * @說   明:發送匹配ROM命令 0x55再寫入8字節的ROM

  5. * @參   數:*buffer 要發送的存放ROM的數組

  6. * @返回值:無

  7. *********************************/

  8. void DS18B20_Write_Rom(uchar *buffer)

  9. {

  10. uchar i;

  11.    DS18B20_Write_Com(0x55); //ROM匹配

  12. for(i = 0;i < 8;i++)

  13. DS18B20_Write_Com(buffer[i]); //寫入8個字節的ROM

  14. }

  15. /*********************************

  16. * @函數名:DS18B20_Handle

  17. * @描   述:溫度處理

  18. * @說   明:1. 復位 2.發送ROM命令 3.發送暫存器指令 讀RAM 4.數據

  19. * @參   數:無

  20. * @返回值:無

  21. *********************************/

  22. void DS18B20_Handle(uchar *buffer)

  23. {

  24. uchar xdata value_High,value_Low;

  25. float num;//保存小數

  26.     DS18B20_Reset();//復位

  27. //DS18B20_Write_Com(0xcc);//發送指令CCH,跳過ROM操作

  28. //DS18B20_Write_Com(0x33);//讀64位ROM

  29.     DS18B20_Write_Rom(buffer); //匹配ROM 并寫入64ROM

  30. DS18B20_Write_Com(0x44);//發送指令44H,啟動溫度轉換

  31. Delay10us();

  32. DS18B20_Reset();//復位

  33. DS18B20_Write_Rom(buffer); //匹配ROM 并寫入64ROM

  34. DS18B20_Write_Com(0xbe);//發送指令BEH,讀取9字節RAM數據的前兩個數據

  35. Delay10us();

  36. value_Low=DS18B20_Read_Data();//先讀低字節Byte0

  37. value_High=DS18B20_Read_Data();//高字節Byte1


  38. value_High<<=4;//整數的高3位

  39. value_High+=(value_Low&0xf0)>>4;//整數的低4位

  40. DS18B20_Buffer[0]=value_High;//整數

  41. num=(value_Low&0x0f)*0.0625;//小數

  42. DS18B20_Buffer[1]=(uchar)(num*100);//小數

  43. }
復制代碼
其他的都和單個測試是一樣的。
測試結果:
9.png
另外附上主函數:
  1. /*********************************

  2. * @函數名:main

  3. * @描   述:main函數,程序入口

  4. * @說   明:

  5. * @參   數:無

  6. * @返回值:無

  7. *********************************/

  8. void main()

  9. {

  10. //uchar a[8];//存放讀出來的ROM

  11. Uart1_Init();//串口初始化

  12. Send_String("多點溫度測試:\n");

  13.   while(1)

  14. {

  15.     DS18B20_Handle(DS18B20_Rom1);

  16. printf("溫度1:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度

  17.         putchar_End();//換行

  18. //        DS18B20_Read_64Rom(a);

  19. //        Send_String(a);

  20.             Delay1000ms();

  21. DS18B20_Handle(DS18B20_Rom2);

  22. printf("溫度2:%bd.%bd",DS18B20_Buffer[0],DS18B20_Buffer[1]);//串口打印溫度

  23. Delay1000ms();

  24. putchar_End();//換行

  25. }
  26. }
復制代碼
DS18B20程序和資料: DS18B20.zip (4.21 MB, 下載次數: 113)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:798201 發表于 2021-1-11 11:57 | 顯示全部樓層
寫得非常詳細,謝謝分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九热久久免费视频 | 精品一区二区三区不卡 | 亚洲国产精品人人爽夜夜爽 | 国产精品极品美女在线观看免费 | 日本午夜一区二区三区 | 欧美一区二区三区一在线观看 | 亚洲影音 | 黄色中文字幕 | 性高湖久久久久久久久aaaaa | 日韩一区二区三区在线看 | 成人国产a | 天天操天天干天天曰 | 成人精品网| 午夜小影院 | 91九色网站 | 国产精品污www一区二区三区 | 99久9| 国产精品久久精品 | 精品一区二区三区四区在线 | 999久久久久久久久 国产欧美在线观看 | 国产精品色av | 在线综合视频 | 精品视频在线播放 | 日日摸日日添日日躁av | 91视频一区二区 | 亚洲国产精品一区在线观看 | 97国产精品视频人人做人人爱 | 久久久激情视频 | 国产高清视频一区 | 亚洲精品一区二区三区在线观看 | 91中文字幕在线观看 | 中文字幕国产视频 | 午夜视频网站 | 欧美精品一区二区三区在线 | 国产视频精品免费 | 午夜影院在线观看视频 | 日韩电影一区二区三区 | 观看毛片 | 久久精品国产久精国产 | 成人激情视频在线观看 | 五月天天丁香婷婷在线中 |