找回密码
 注册

QQ登录

只需一步,快速开始

搜索

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. }
复制代码
1.jpg 2.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-25 16:06

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表