[STM8] STM8驱动DS18B20,无法读取温度。

[复制链接]
2474|0
 楼主| Shaopus 发表于 2013-11-3 16:57 | 显示全部楼层 |阅读模式
  1. #include "stm8s.h"
  2. #include "ds18b20.h"
  3. #include "delay.h"




  4. //-----复位-----
  5. void resetOnewire(void)
  6. {
  7.         OUT_DQ();
  8.         SET_DQ();
  9.         delay_us(750);
  10.         CLR_DQ();
  11.         delay_us(100);
  12.         IN_DQ();
  13.         //while(GET_DQ());
  14.         while(!(GET_DQ()));
  15.         OUT_DQ();
  16.         SET_DQ();
  17. }

  18. //-----读数据-----
  19. u8 rOnewire(void)
  20. {
  21.         u8 data=0,i=0;
  22.         OUT_DQ();
  23.         SET_DQ();
  24.          for(i=0;i<8;i++)
  25.         {
  26.                 data=data>>1;
  27.                 OUT_DQ();
  28.                 CLR_DQ();
  29.                 delay_us(5);
  30.                 SET_DQ();
  31.                 delay_us(5);
  32.                 IN_DQ();
  33.                 if(GET_DQ()) data|=0x80;
  34.                 else data&=0x7f;
  35.                 delay_us(65);
  36.                 SET_DQ();
  37.         }
  38.         return(data);
  39. }
  40. //-----写数据-----
  41. void wOnewire(u8 data)
  42. {
  43.         u8 i=0;
  44.         OUT_DQ();
  45.         for(i=0;i<8;i++)
  46.         {
  47.                 CLR_DQ();
  48.                 delay_us(10);
  49.                 if(data&0x01)
  50.                 {
  51.                 SET_DQ();
  52.                 }
  53.                 else
  54.                 {
  55.                 CLR_DQ();
  56.                 }
  57.                 delay_us(70);  //65
  58.                 SET_DQ();
  59.                 delay_us(10);
  60.                 data=data>>1;
  61.                
  62.         }
  63. }

  64. //-----DS18B20转换温度-----
  65. void convertDs18b20(void)
  66. {
  67.         resetOnewire();
  68.         wOnewire(0xcc);
  69.         wOnewire(0x44);
  70. }
  71. //------------DS18BB0读温度----------
  72. u8 readTemp(void)
  73. {
  74.         u8 temp1,temp2;
  75.         convertDs18b20();
  76.         resetOnewire();
  77.         wOnewire(0xcc);
  78.         wOnewire(0xbe);        
  79.         temp1=rOnewire();
  80.         temp2=rOnewire();
  81.        
  82.         return (((temp2<<8)|temp1)*6.25);
  83. }
这是.C部分
  1. #ifndef __DS18B20_H__
  2. #define __DS18B20_H__


  3. #define SET_DQ()                                                 GPIO_WriteHigh(GPIOD,GPIO_PIN_0) //拉高
  4. #define CLR_DQ()                                                 GPIO_WriteLow(GPIOD,GPIO_PIN_0) //拉低
  5. #define IN_DQ()                                                             GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_IN_FL_NO_IT)//浮空
  6. #define OUT_DQ()                                                            GPIO_Init(GPIOD,GPIO_PIN_0,GPIO_MODE_OUT_PP_HIGH_FAST)//推挽
  7. #define GET_DQ()                                                GPIO_ReadInputPin(GPIOD, GPIO_PIN_0)//DQ值

  8. u8 readTemp(void);
  9. void resetOnewire(void);
  10. u8 rOnewire(void);
  11. void wOnewire(u8 data);
  12. void convertDs18b20(void) ;

  13. #endif
这是IO的配置。就是无法显示温度,串口一直显示f9。
求各位大神帮忙!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部