OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4862|回复: 5

为什么ds18b20传感器温度一直显示温度为0,显示模块确定没问题,有没有大佬帮忙看看代码有没有问题

[复制链接]

4

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-1-8
在线时间
11 小时
发表于 2021-2-26 14:50:05 | 显示全部楼层 |阅读模式
5金钱
  1. <font color="#ff0000" size="5">stm32f407zg   </font>
复制代码

.h文件
  1. #ifndef __DS18B20_H
  2. #define __DS18B20_H

  3. #include "main.h"

  4. #include "stm32f4xx.h"                  // Device header

  5. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

  8. #define GPIOA_ODR_Addr    (GPIOA_BASE+12)
  9. #define GPIOB_ODR_Addr    (GPIOB_BASE+12)
  10. #define GPIOC_ODR_Addr    (GPIOC_BASE+12)
  11. #define GPIOD_ODR_Addr    (GPIOD_BASE+12)
  12. #define GPIOE_ODR_Addr    (GPIOE_BASE+12)
  13. #define GPIOF_ODR_Addr    (GPIOF_BASE+12)
  14. #define GPIOG_ODR_Addr    (GPIOG_BASE+12)

  15. #define GPIOA_IDR_Addr    (GPIOA_BASE+8)
  16. #define GPIOB_IDR_Addr    (GPIOB_BASE+8)
  17. #define GPIOC_IDR_Addr    (GPIOC_BASE+8)
  18. #define GPIOD_IDR_Addr    (GPIOD_BASE+8)
  19. #define GPIOE_IDR_Addr    (GPIOE_BASE+8)
  20. #define GPIOF_IDR_Addr    (GPIOF_BASE+8)
  21. #define GPIOG_IDR_Addr    (GPIOG_BASE+8)

  22. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)
  23. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)

  24. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)
  25. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)

  26. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)
  27. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)

  28. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)
  29. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)

  30. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)
  31. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)

  32. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)
  33. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)

  34. #define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)
  35. #define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)


  36. //IO方向设置
  37. #define DS18B20_IO_IN()  {GPIOA->BSRR&=0XFFFFFFF0;GPIOA->BSRR|=8<<0;}
  38. #define DS18B20_IO_OUT() {GPIOA->BSRR&=0XFFFFFFF0;GPIOA->BSRR|=3<<0;}

  39. //IO操作函数
  40. #define        DS18B20_DQ_OUT  PAout(2) //数据端口        PA0
  41. #define        DS18B20_DQ_IN   PAin(2)  //数据端口        PA0
  42.           
  43. uint8_t DS18B20_Init(void);                        //初始化DS18B20
  44. short DS18B20_Get_Temp(void);                //获取温度
  45. void DS18B20_Start(void);                        //开始温度转换
  46. void DS18B20_Write_Byte(uint8_t dat);//写入一个字节
  47. uint8_t DS18B20_Read_Byte(void);        //读出一个字节
  48. uint8_t DS18B20_Read_Bit(void);                //读出一个位
  49. uint8_t DS18B20_Check(void);                //检测是否存在DS18B20
  50. void DS18B20_Rst(void);                                //复位DS18B20
  51. #endif
复制代码
main.c文件
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */
  5.   

  6.   /* MCU Configuration--------------------------------------------------------*/

  7.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  8.   HAL_Init();

  9.   /* USER CODE BEGIN Init */

  10.   /* USER CODE END Init */

  11.   /* Configure the system clock */
  12.   SystemClock_Config();

  13.   /* USER CODE BEGIN SysInit */
  14. //OLED_Init();                        //初始化OLED  
  15. //        OLED_Clear(0);
  16. DS18B20_Init();
  17.   /* USER CODE END SysInit */

  18.   /* Initialize all configured peripherals */
  19.   MX_GPIO_Init();
  20.   MX_USART1_UART_Init();
  21.   /* USER CODE BEGIN 2 */

  22.        
  23.   /* USER CODE END 2 */



  24.   /* Infinite loop */
  25.   /* USER CODE BEGIN WHILE */
  26.   while (1)
  27.   {
  28.     /* USER CODE END WHILE */

  29.     /* USER CODE BEGIN 3 */
  30.                        

  31.                 uint32_t   T;
  32.                 HAL_Delay (500);
  33.                 T= DS18B20_Get_Temp();
  34.                 printf("T=%d \r\n",T);

  35.   }
  36.   /* USER CODE END 3 */
  37. }
复制代码



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8466
金钱
8466
注册时间
2020-5-11
在线时间
3917 小时
发表于 2021-2-26 15:56:58 | 显示全部楼层
在T= DS18B20_Get_Temp();后加一句DS18B20_Start()试试。
专治疑难杂症
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-1-8
在线时间
11 小时
 楼主| 发表于 2021-2-26 16:22:56 | 显示全部楼层
LcwSwust 发表于 2021-2-26 15:56
在T= DS18B20_Get_Temp();后加一句DS18B20_Start()试试。

还是没用
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-1-8
在线时间
11 小时
 楼主| 发表于 2021-2-26 16:56:56 | 显示全部楼层
有没有大佬有测试代码,stm32f407的
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2021-2-26 17:15:05 | 显示全部楼层
还是时序上的问题
回复

使用道具 举报

4

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-1-8
在线时间
11 小时
 楼主| 发表于 2021-2-26 17:21:19 | 显示全部楼层
jiangyy 发表于 2021-2-26 17:15
还是时序上的问题

那上面的问题怎么解决呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 12:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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