[stm32lxx系列] 真心被ds18b20虐了!

2019-07-14 23:00发布

我知道ds18b20很简单,但是不知道为什么我调时序调了3天竟然还是读不出来温度。自己用51单片机可以读出来,但是换成STM32l152就一直读出温度为0,每个延时函数我都使用示波器看过了。
  1. #include "ds18b20.h"
  2. #include "delay.h"
  3. //¸´Î»DS18B20
  4. uint8_t DS18B20_Rst(void)   //2015.1.5 OK
  5. {
  6. uint8_t Countlook;

  7. DS18B20_IO_OUT(HIGH);

  8. delay2us();

  9. DS18B20_IO_OUT(LOW);
  10. delayx100us(6);
  11. DS18B20_IO_OUT(HIGH);
  12. delay15us();delay15us();delay15us();
  13. DS18B20_IO_IN();
  14. Countlook=GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0);

  15. delayx100us(2);delay2us();
  16. return Countlook;
  17. //  while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
  18. }
  19. uint8_t DS18B20_Check(void)
  20. {
  21. uint8_t retry=0;
  22. DS18B20_IO_IN();
  23. //  while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
  24. //  while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));
  25. while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)&&retry<120)
  26. {
  27.   retry++;
  28.   delay2us();
  29. }
  30. if(retry>=120)
  31.   return 1;
  32. else
  33.   retry=0;
  34. while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0)&&retry<240)
  35. {
  36.   retry++;
  37.   delay2us();
  38. }
  39. if(retry>=240)
  40.   return 1;
  41. return 0;
  42. }
  43. void DS18B20_Init(void)
  44. {
  45. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
  46.   GPIO_DeInit(GPIOE);
  47. DS18B20_IO_OUT(HIGH);
  48. }
  49. void DS18B20_Start(void)
  50. {
  51. DS18B20_Rst();
  52. DS18B20_Check();
  53. DS18B20_Write_Byte(0xcc);
  54. DS18B20_Write_Byte(0x44);
  55. }
  56. void DS18B20_Write_Byte(uint8_t dat)
  57. {
  58. uint8_t j,testb;
  59. DS18B20_IO_OUT(HIGH);
  60. //need to set PE0 output
  61. for(j=0;j<8;j++)
  62. {
  63.   DS18B20_IO_OUT(HIGH);
  64.   testb=dat&0x01;
  65.   dat>>=1;
  66.   if(0x01==testb)
  67.   {
  68.    DS18B20_IO_OUT(LOW);
  69.    delay2us();
  70.    DS18B20_IO_OUT(HIGH);
  71.    delay60us();
  72.   }
  73.   else
  74.   {
  75.    DS18B20_IO_OUT(LOW);
  76.    delay60us();
  77.    DS18B20_IO_OUT(HIGH);
  78.    delay2us();
  79.   }
  80. }
  81. }
  82. uint8_t DS18B20_Read_Bit(void)
  83. {
  84. uint8_t dat;
  85. DS18B20_IO_OUT(HIGH);
  86. DS18B20_IO_OUT(LOW);
  87. delay2us();
  88. DS18B20_IO_OUT(HIGH);
  89. delay2us();
  90. DS18B20_IO_IN();
  91. delay2us();
  92. if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0))
  93.   dat=1;
  94. else
  95.   dat=0;
  96. delay50us();
  97. return dat;

  98. }
  99. uint8_t DS18B20_Read_Byte(void)
  100. {
  101. uint8_t i,j,TEMP_dat;
  102. TEMP_dat=0;
  103. for(i=0;i<8;i++)
  104. {
  105.   j=DS18B20_Read_Bit();
  106.   TEMP_dat=(j<<7)|(TEMP_dat>>1);
  107. }
  108. return TEMP_dat;
  109. }
  110. void DS18B20_IO_OUT(IO_State NewState)
  111. {
  112. GPIO_InitTypeDef  GPIO_InitStructure;
  113. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
  114.   GPIO_DeInit(GPIOE);
  115. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //LED0-->PE.7 ¶Ë¿ÚÅäÖÃ
  116. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
  117. GPIO_InitStructure.GPIO_Speed =GPIO_Speed_40MHz;
  118. GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
  119. GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  120.   GPIO_Init(GPIOE, &GPIO_InitStructure);      //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOE.7
  121. if(NewState==LOW)
  122.   GPIO_ResetBits(GPIOE,GPIO_Pin_0);       //PE.7 Êä³ö¸ß
  123. else
  124.   GPIO_SetBits(GPIOE,GPIO_Pin_0);
  125. }
  126. void DS18B20_IO_IN()
  127. {
  128. GPIO_InitTypeDef  GPIO_InitStructure;
  129. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);
  130.   GPIO_DeInit(GPIOE);
  131. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //LED0-->PE.7 ¶Ë¿ÚÅäÖÃ
  132. GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN;
  133. GPIO_InitStructure.GPIO_OType=GPIO_OType_OD;
  134. GPIO_InitStructure.GPIO_Speed =GPIO_Speed_40MHz;
  135. GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  136.   GPIO_Init(GPIOE, &GPIO_InitStructure);      //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOE.7
  137. }
  138. uint16_t DS18B20_Get_Temp(void)
  139. {
  140. uint8_t temp;
  141. uint8_t TL,TH;
  142. uint16_t tem;
  143. DS18B20_Rst();
  144. delayx100us(8);
  145. DS18B20_Write_Byte(0xcc);
  146.   DS18B20_Write_Byte(0x44);
  147. DS18B20_IO_IN();
  148. while(!GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_0));

  149. DS18B20_Rst();
  150. delayx100us(8);
  151. DS18B20_Write_Byte(0xcc);
  152.   DS18B20_Write_Byte(0xbe);
  153. TL=DS18B20_Read_Byte();
  154. TH=DS18B20_Read_Byte();
  155. if(TH>7)
  156. {
  157.   TH=~TH;
  158.   TL=~TL;
  159.   temp=0;
  160. }
  161. else
  162.   temp=1;
  163. tem=TH;
  164. tem<<=8;
  165. tem|=TL;
  166. tem=tem*0.0625;
  167. return tem;
  168. if(temp)
  169.   return tem;
  170. else
  171.   return -tem;
  172. }
复制代码

代码很乱... ...因为刚开始使用的是一个基于stm32f1xx系列芯片的驱动,没有调试好我就按照自己写的51程序调,导致现在程序不伦不类,谁能给指点一下吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。