DS18B20.c:
  1. //---------------------------------------- DS18B20.c ----------------------------------------
  2. #include"iocc2530.h"
  3. #include"OnBoard.h"
  4. #include "ds18b20.h"
  5. //温度传感器引脚
  6. #define Ds18b20IO P1_1
  7. void Ds18b20Delay(unsigned int k);
  8. void Ds18b20InputInitial(void);
  9. void Ds18b20OutputInitial(void);
  10. unsigned char Ds18b20Initial(void);
  11. void Ds18b20Write(unsigned char infor);
  12. unsigned char Ds18b20Read(void);
  13. //时钟频率为32M
  14. void Ds18b20Delay(unsigned int k)
  15. {
  16. while (k--)
  17. {
  18. asm("NOP");
  19. asm("NOP");
  20. asm("NOP");
  21. asm("NOP");
  22. asm("NOP");
  23. asm("NOP");
  24. asm("NOP");
  25. asm("NOP");
  26. }
  27. }
  28. //设置端口为输入
  29. void Ds18b20InputInitial(void)
  30. {
  31. P0DIR &= 0xfd;
  32. }
  33. //设置端口为输出
  34. void Ds18b20OutputInitial(void)
  35. {
  36. P0DIR |= 0x02;
  37. }
  38. //ds18b20初始化 初始化成功返回0x00,失败返回0x01
  39. unsigned char Ds18b20Initial(void)
  40. {
  41. unsigned char Status = 0x00;
  42. unsigned int CONT_1 = 0;
  43. unsigned char Flag_1 = 1;
  44. Ds18b20OutputInitial();
  45. Ds18b20IO = 1; //DQ复位
  46. Ds18b20Delay(260); //稍做延时
  47. Ds18b20IO = 0; //单片机将DQ拉低
  48. Ds18b20Delay(750); //精确延时 大于 480us 小于960us
  49. Ds18b20IO = 1; //拉高总线
  50. Ds18b20InputInitial(); //设置IO输入
  51. while((Ds18b20IO != 0)&&(Flag_1 == 1)) //等待ds18b20响应,具有防止超时功能
  52. { //等待约60ms左右
  53. CONT_1++;
  54. Ds18b20Delay(10);
  55. if(CONT_1 > 8000)Flag_1 = 0;
  56. Status = Ds18b20IO;
  57. }
  58. Ds18b20OutputInitial();
  59. Ds18b20IO = 1;
  60. Ds18b20Delay(100);
  61. //返回初始化状态
  62. return Status;
  63. }
  64. void Ds18b20Write(unsigned char infor)
  65. {
  66. unsigned int i;
  67. Ds18b20OutputInitial();
  68. for(i=0;i<8;i++)
  69. {
  70. if((infor & 0x01))
  71. {
  72. Ds18b20IO = 0;
  73. Ds18b20Delay(6);
  74. Ds18b20IO = 1;
  75. Ds18b20Delay(50);
  76. }
  77. else
  78. {
  79. Ds18b20IO = 0;
  80. Ds18b20Delay(50);
  81. Ds18b20IO = 1;
  82. Ds18b20Delay(6);
  83. }
  84. infor >>= 1;
  85. }
  86. }
  87. unsigned char Ds18b20Read(void)
  88. {
  89. unsigned char Value = 0x00;
  90. unsigned int i;
  91. Ds18b20OutputInitial();
  92. Ds18b20IO = 1;
  93. Ds18b20Delay(10);
  94. for(i=0;i<8;i++)
  95. {
  96. Value >>= 1;
  97. Ds18b20OutputInitial();
  98. Ds18b20IO = 0; // 给脉冲信号
  99. Ds18b20Delay(3);
  100. Ds18b20IO = 1; // 给脉冲信号
  101. Ds18b20Delay(3);
  102. Ds18b20InputInitial();
  103. if(Ds18b20IO == 1) Value |= 0x80;
  104. Ds18b20Delay(15);
  105. }
  106. return Value;
  107. }
  108. // 温度读取函数
  109. unsigned char ReadDs18B20(void)
  110. {
  111. unsigned char V1,V2; //定义高低8位 缓冲
  112. unsigned char temp; //定义温度缓冲寄存器
  113. Ds18b20Initial();
  114. Ds18b20Write(0xcc); // 跳过读序号列号的操作
  115. Ds18b20Write(0x44); // 启动温度转换
  116. Ds18b20Initial();
  117. Ds18b20Write(0xcc); //跳过读序号列号的操作
  118. Ds18b20Write(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  119. V1 = Ds18b20Read(); //低位
  120. V2 = Ds18b20Read(); //高位
  121. temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据
  122. return temp;
  123. }
  124. //温度读取函数 带1位小数位
  125. float floatReadDs18B20(void)
  126. {
  127. unsigned char V1,V2; //定义高低8位 缓冲
  128. unsigned int temp; //定义温度缓冲寄存器
  129. float fValue;
  130. Ds18b20Initial();
  131. Ds18b20Write(0xcc); // 跳过读序号列号的操作
  132. Ds18b20Write(0x44); // 启动温度转换
  133. Ds18b20Initial();
  134. Ds18b20Write(0xcc); //跳过读序号列号的操作
  135. Ds18b20Write(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  136. V1 = Ds18b20Read(); //低位
  137. V2 = Ds18b20Read(); //高位
  138. //temp = ((V1 >> 4)+((V2 & 0x07)*16)); //转换数据
  139. temp=V2*0xFF+V1;
  140. fValue = temp*0.0625;
  141. return fValue;
  142. }

DS18B20.h:
  1. //---------------------------------------- DS18B20.h ----------------------------------------
  2. #ifndef __DS18B20_H__
  3. #define __DS18B20_H__
  4. extern unsigned char Ds18b20Initial(void);
  5. extern unsigned char ReadDs18B20(void);
  6. extern float floatReadDs18B20(void);
  7. #endif

qrcode_for_gh_e95b474fcf08_344.jpg