国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

8路DS18B20溫度采集串口發送數據帶仿真程序

[復制鏈接]
樓主
coolice 發表于 2020-1-31 23:55:57 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
采用51單片機8路溫度采集
完整代碼和仿真文件: 8路溫度采集,串口發送溫度數據.zip (169.7 KB, 售價: 1 E幣)
部分代碼
  1. /序列號匹配
  2. void MatchROM(const unsigned char *pMatchData)
  3. {
  4. unsigned char i;

  5. Initialization();
  6. WriteByte(0x55);
  7. for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));       
  8. }

  9. //得到64位ROM序列(在P1口顯示,必須與Proteus聯調且在單步調試下才能得到)
  10. /*void GetROMSequence()
  11. {
  12. unsigned char i;

  13. Initialization();
  14. WriteByte(READ_ROM);
  15. for (i = 0; i < 8; i++)
  16. P1 = ReadByte();       
  17. }*/

  18. //讀取溫度值
  19. bit ReadTemperature(TEMPDATA * pTempData)
  20. {
  21. unsigned int iTempDataH;
  22. unsigned char btDot, iTempDataL;
  23. static unsigned char i = 0;

  24. pTempData->btNegative = 0;        //為0溫度為正
  25. i++;
  26. if (i == 9) i = 1;
  27. Initialization();
  28. WriteByte(0xCC);        //跳過ROM匹配
  29. WriteByte(0x44);        //啟動轉換
  30. Delay1ms(65);

  31. //Initialization();

  32. //多個芯片的時候用MatchROM(ROMData)換掉WriteByte(SKIP_ROM)
  33. switch (i)
  34. {
  35. case 1 : MatchROM(ROMData1); break;        //匹配1
  36. case 2 : MatchROM(ROMData2); break;        //匹配2
  37. case 3 : MatchROM(ROMData3); break;        //匹配3
  38. case 4 : MatchROM(ROMData4); break;        //匹配4       
  39. case 5 : MatchROM(ROMData5); break;        //匹配5
  40. case 6 : MatchROM(ROMData6); break;        //匹配6
  41. case 7 : MatchROM(ROMData7); break;        //匹配7
  42. case 8 : MatchROM(ROMData8); break;        //匹配8
  43. }
  44. //WriteByte(SKIP_ROM);        //跳過ROM匹配(單個芯片時用這句換掉上面的switch)
  45. WriteByte(0xBE);        //讀數據
  46. iTempDataL = ReadByte();
  47. iTempDataH = ReadByte();       
  48. iTempDataH <<= 8;
  49. iTempDataH |= iTempDataL;

  50. if (iTempDataH & 0x8000)
  51. {
  52. pTempData->btNegative = 1;
  53. iTempDataH = ~iTempDataH + 1;        //負數求補
  54. }

  55. //為了省去浮點運算帶來的開銷,而采用整數和小數部分分開處理的方法(沒有四舍五入)
  56. btDot = (unsigned char)(iTempDataH & 0x000F);        //得到小數部分
  57. iTempDataH >>= 4;        //得到整數部分
  58. btDot *= 5; //btDot*10/16得到轉換后的小數數據
  59. btDot >>= 3;

  60. //數據處理
  61. pTempData->btThird = (unsigned char)iTempDataH / 100;
  62. pTempData->btSecond = (unsigned char)iTempDataH % 100 / 10;
  63. pTempData->btFirst = (unsigned char)iTempDataH % 10;
  64. pTempData->btDecimal = btDot;       

  65. return 1;
  66. }


  67. //數據顯示處理子程序
  68. void DataProcess()
  69. {
  70. ReadTemperature(&m_TempData);
  71. if (m_TempData.btNegative) DisplayOne(1, 6, '-', 0);
  72. else DisplayOne(1, 6, m_TempData.btThird, 1);
  73. DisplayOne(1, 7, m_TempData.btSecond, 1);
  74. DisplayOne(1, 8, m_TempData.btFirst, 1);
  75. DisplayOne(1, 10, m_TempData.btDecimal, 1);
  76. }
  77. //溫度數據串口發送程序
  78. void tempdatalist()
  79. { u8 i;
  80. for(i=0;i<8;i++)
  81. {

  82. ReadTemperature(&m_TempData);

  83. if (m_TempData.btNegative)
  84. { DisplayOne(1, 6, '-', 0);
  85. zhenfu[i]='-';
  86. temp[i]=( m_TempData.btThird*1000+m_TempData.btSecond*100+m_TempData.btFirst*10+m_TempData.btDecimal);
  87. }
  88. else {
  89. DisplayOne(1, 6, m_TempData.btThird, 1);
  90. zhenfu[i]='+';
  91. DisplayOne(1, 7, m_TempData.btSecond, 1);
  92. DisplayOne(1, 8, m_TempData.btFirst, 1);

  93. DisplayOne(1, 10, m_TempData.btDecimal, 1);
  94. temp[i]=( m_TempData.btThird*1000+m_TempData.btSecond*100+m_TempData.btFirst*10+m_TempData.btDecimal);
  95. Delay1ms(1000);
  96. }

  97. }
  98. for(i=0;i<8;i++)
  99. {
  100. UART_SendOneByte(zhenfu[i]);
  101. UART_SendNum(temp[i]);
  102. UART_SendString(":");

  103. }
  104. UART_SendString("\r\n");

  105. }
復制代碼
8路DS18B20溫度采集串口發送數據帶仿真程序 1.jpg 8路DS18B20溫度采集串口發送數據帶仿真程序 2.jpg
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 01:10

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表