找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 165|回复: 0
打印 上一主题 下一主题
收起左侧

GD32_F470的DS18B20程序

[复制链接]
跳转到指定楼层
楼主
ID:1075158 发表于 2024-3-8 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码片段1为“DS18B20.h”
代码片段2为“DS18B20.c”
在main函数初始化部分直接调用“DQ_GPIO_Init();//初始化函数 使用时直接调用到主函数”
在main函数主循环中调用“Temp_Check();                //温度获取”即可获取温度

  1. #ifndef _DS18B20_H_
  2. #define _DS18B20_H_


  3. #include "gd32f4xx.h"

  4. //DQ_GPIO
  5. #define DQ_GPIO_Port          GPIOC            //GPIO分组编号 范围A-E
  6. #define DQ_Pin                GPIO_PIN_13       //GPIO针脚号   范围0-15
  7. //#define SET                                     GPIO_PIN_SET
  8. //#define RESET                                   GPIO_PIN_RESET


  9. //总线的电平
  10. typedef enum
  11. {
  12.         DQ_LEVEL_LOW = 0,
  13.         DQ_LEVEL_HIGHT
  14. }DQ_LEVEL_Type;

  15. /* 引脚写高低电平 */
  16. #define DQ_Write(Level)     if(Level) \
  17.                                                                                 gpio_bit_set(DQ_GPIO_Port,DQ_Pin); \
  18.                                                     else  \
  19.                                                                                 gpio_bit_reset(DQ_GPIO_Port,DQ_Pin);

  20.                                                                
  21. #define DQ_Write_LOW     gpio_bit_set(DQ_GPIO_Port,DQ_Pin)
  22.                                                                
  23.                                                                
  24. #define DQ_Write_HIGH    gpio_bit_reset(DQ_GPIO_Port,DQ_Pin)

  25.                                                                
  26. /*读取总线电平*/
  27. #define DQ_Read        gpio_input_bit_get(DQ_GPIO_Port,DQ_Pin)                                                                                                

  28. //ROM指令
  29. #define SKIP_ROM         0xCC     //跳过 ROM
  30. #define CONVERT_TEMP     0x44    //转换温度
  31. #define READ_SCRATCHPAD  0xBE   //读取暂存器内容
  32.                                                                                                 
  33. /*************************相关函数************************************************/        

  34. void DQ_GPIO_Init(void);                       //初始化函数 使用时直接调用到主函数                                                
  35. uint8_t Ds18b20_Init(void);        //初始化函数 使用时直接调用到主函数
  36. float Ds18b20_Get_Temp(void);                         //获取温度函数,使用时直接调用                                                                        
  37. void Temp_Check(void);                                                         //温度获取函数,直接显示并调用,用于测试      


  38. #endif
复制代码

  1. #include "DS18B20.h"
  2. #include "systick.h"


  3. float Tem = 0.0;
  4. char Data[20] = {0};


  5. //温度检测函数 检测环境温度 单精度浮点型
  6. void Temp_Check(void)
  7. {
  8.         Tem = Ds18b20_Get_Temp();
  9. //        sprintf(Data,"%f",Tem);
  10. }


  11. //DS18B20输出IO口初始化
  12. void DQ_GPIO_Init(void)
  13. {
  14.         rcu_periph_clock_enable(RCU_GPIOC);                        //使能GPIO_C 时钟

  15.         //DS18B20输出   输出模式(推挽输出) 速度50MHz
  16.         gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
  17.   gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);

  18. }


  19. //输出初始化
  20. void DQ_GPIO_OUT(void)
  21. {

  22.         rcu_periph_clock_enable(RCU_GPIOC);                        //使能GPIO_C 时钟

  23.         //DS18B20输出   输出模式(推挽输出) 速度50MHz
  24.         gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
  25.   gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
  26.         
  27. }

  28. //输入初始化
  29. void DQ_GPIO_IN(void)
  30. {
  31.         rcu_periph_clock_enable(RCU_GPIOC);                        //使能GPIO_C 时钟

  32.         //DS18B20输入   输入模式 速度50MHz
  33.         gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
  34.   gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
  35.         
  36. }


  37. //DS18B20复位
  38. void Ds18b20_Reset(void)
  39. {
  40.         
  41.         DQ_GPIO_OUT();
  42.         
  43.         DQ_Write_LOW;
  44.         delay_us(750);
  45.         
  46.         DQ_Write_HIGH;
  47.         delay_us(15);
  48. }


  49. //扫描内存
  50. uint8_t Ds18B20_CheckPulse(void)
  51. {
  52.         
  53.         uint8_t Time_Count = 0;
  54.         
  55.         DQ_GPIO_IN();
  56.         
  57.         while (DQ_Read && Time_Count < 100)
  58.         {
  59.                 Time_Count++;
  60.                 delay_us(1);
  61.         }
  62.         
  63.         if (Time_Count >= 100)
  64.                 return 1;   

  65.         else
  66.                 Time_Count = 0;
  67.         
  68.         while (!DQ_Read && Time_Count < 240)
  69.         {
  70.                 Time_Count++;
  71.                 delay_us(1);
  72.         }
  73.         
  74.         if (Time_Count >= 240)
  75.                 return 1;
  76.         else
  77.                 return 0;   
  78. }


  79. //读取位
  80. uint8_t Ds18b20_Read_Bit(void)
  81. {
  82.         uint8_t dat;

  83.         DQ_GPIO_OUT();        

  84.         DQ_Write_LOW;
  85.         delay_us(15);        

  86.         DQ_GPIO_IN();        
  87.         if (DQ_Read == 1)
  88.                 dat = 1;
  89.         else
  90.                 dat = 0;

  91.         delay_us(50);
  92.         return dat;
  93. }


  94. //读取字节
  95. uint8_t Ds18B20_Read_Byte(void)
  96. {
  97.         uint8_t data = 0x00,mask;
  98.         
  99.         for (mask = 0x01;mask != 0;mask <<= 1)
  100.         {
  101.                 if (Ds18b20_Read_Bit() == SET)
  102.                         data |= mask;
  103.                 else
  104.                         data &= ~mask;
  105.         }
  106.         return data;
  107. }


  108. //写字节
  109. void Ds18B20_Write_Byte(uint8_t data)
  110. {
  111.         uint8_t mask;
  112.         
  113.         for (mask = 0x01;mask != 0;mask <<= 1)
  114.         {
  115.                 DQ_GPIO_OUT();


  116.                 if ((data & mask) == RESET)
  117.                 {
  118.                         DQ_Write_LOW;
  119.                         delay_us(70);
  120.                         
  121.                         DQ_Write_HIGH;
  122.                         delay_us(2);
  123.                 }
  124.                 else
  125.                 {
  126.                         DQ_Write_LOW;
  127.                         delay_us(9);
  128.                         
  129.                         DQ_Write_HIGH;
  130.                         delay_us(55);
  131.                 }
  132.         }
  133. }


  134. //DS18B20初始化
  135. uint8_t Ds18b20_Init(void)
  136. {
  137.         Ds18b20_Reset();
  138.         
  139.         return Ds18B20_CheckPulse();
  140. }




  141. //获取温度
  142. float Ds18b20_Get_Temp(void)
  143. {
  144.         uint8_t tpmsb, tplsb;
  145.         short s_tem;
  146.         float f_tem;
  147.         
  148.         Ds18b20_Reset();           
  149.         Ds18B20_CheckPulse();         
  150.         Ds18B20_Write_Byte(SKIP_ROM);                                       
  151.         Ds18B20_Write_Byte(CONVERT_TEMP);                                   
  152.         
  153.         Ds18b20_Reset();           
  154.         Ds18B20_CheckPulse();         
  155.         Ds18B20_Write_Byte(SKIP_ROM);                                       
  156.         Ds18B20_Write_Byte(READ_SCRATCHPAD);                        
  157.         
  158.         tplsb = Ds18B20_Read_Byte();                 
  159.         tpmsb = Ds18B20_Read_Byte();
  160.         
  161.         s_tem = tpmsb << 8;
  162.         s_tem = s_tem | tplsb;
  163.         
  164.         if( s_tem < 0 )               
  165.                 f_tem = (~s_tem+1) * 0.0625;        
  166.         else
  167.                 f_tem = s_tem * 0.0625;
  168.         
  169.         return f_tem;         
  170. }


复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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