[AT32L021] 【AT-START-L021测评】HK1020温度计-5

[复制链接]
 楼主| trucyw 发表于 2024-12-25 18:20 | 显示全部楼层 |阅读模式
本帖最后由 muyichuan2012 于 2024-12-26 15:37 编辑

突然发现桌面还有一颗之前做老化试验使用的温度监测sensor(HK1020)
那么温度计就一定安排上
HK1020这颗sensor和DS18B20差不一样,类似一颗插件的三极管TO-92封装(规格书显示兼容DS18B20)

和DS18B20一样也具有64bit独一无二编码,0x28 0x3E 0x7C 0x01 0x00 0x00 0x00 0x23 这一串是目前使用这颗sensor的身份识别码
hk1020.h
  1. #ifndef __HK1020_H
  2. #define __HK1020_H   

  3. #include "at32l021_gpio.h"
  4. #include "delay.h"

  5. #define HK1020_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_10)
  6. #define HK1020_Set() gpio_bits_set(GPIOB,GPIO_PINS_10)
  7. #define HK1020_RD  gpio_input_data_bit_read(GPIOB,GPIO_PINS_10)

  8. u8 HK1020_Init(void);//初始化HK1020
  9. u8 HK1020_Read_Data(u8 *temp);//读取温湿度
  10. u8 HK1020_Read_Byte(void);//读出一个字节
  11. u8 HK1020_Read_Bit(void);//读出一个位
  12. u8 HK1020_Check(void);//检测是否存在HK1020
  13. void HK1020_Rst(void);//复位HK1020
  14. void HK1020_Get_ROM(u8 size);
  15. short HK1020_Get_Temp(void);
  16. void Temperaturedisplay(void);
  17. #endif


  18. hk1020.c
  19. #include "hk1020.h"
  20. #include "delay.h"

  21. void HK1020_IO_IN(void)
  22. {
  23.     gpio_init_type gpio_initstructure;
  24.     gpio_default_para_init(&gpio_initstructure);
  25.     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  26.     gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  27.     gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;
  28.     gpio_initstructure.gpio_pins = GPIO_PINS_10;
  29.     gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  30.     gpio_init(GPIOB, &gpio_initstructure);
  31. }
  32. void HK1020_IO_OUT(void)
  33. {
  34.     gpio_init_type gpio_initstructure;
  35.     gpio_default_para_init(&gpio_initstructure);
  36.     gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  37.     gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  38.     gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  39.     gpio_initstructure.gpio_pins = GPIO_PINS_10;
  40.     gpio_initstructure.gpio_pull = GPIO_PULL_UP;
  41.     gpio_init(GPIOB, &gpio_initstructure);
  42. }

  43. //复位HK1020
  44. void HK1020_Rst(void)
  45. {
  46.     HK1020_IO_OUT(); //SET OUTPUT
  47.     HK1020_Clr();  //GPIO_ResetBits(GPIOB,GPIO_Pin_3);
  48.     //Delay_Ms(1);
  49.     delay_us(500);  //拉低500Us
  50.     HK1020_Set();  //GPIO_SetBits(GPIOB,GPIO_Pin_3);
  51.     delay_us(50);   //拉高50US   时间必须保证足够!!!!!
  52. }
  53. //等待HK1020的回应
  54. //返回1:未检测到HK1020的存在
  55. //返回0:存在
  56. u8 HK1020_Check(void)
  57. {
  58.     u8 retry=0;
  59.     HK1020_IO_IN();    //SET INPUT
  60.     while(HK1020_RD&&retry<200)
  61.     {
  62.         retry++;
  63.         delay_us(1);
  64.     };
  65.     if(retry>=200)
  66.     {
  67.         return 1;
  68.     }
  69.     else
  70.     {
  71.         retry=0;
  72.         while(!HK1020_RD &&retry<240)
  73.         {
  74.             retry++;
  75.             delay_us(1);
  76.         };
  77.         if(retry>=240) return 1;
  78.     }
  79.     return 0;
  80. }
  81. //从HK1020读取一个位
  82. //返回值:1/0
  83. u8 HK1020_Read_Bit(void)
  84. {
  85.     u8 data;
  86.     HK1020_IO_OUT();
  87.     HK1020_Clr();
  88.     delay_us(2);
  89.     HK1020_Set();
  90.     HK1020_IO_IN();
  91.     delay_us(12);
  92.     if(HK1020_RD)
  93.     {
  94.         data=1;
  95.     }
  96.     else data=0;
  97.     delay_us(50);
  98.     return data;
  99. }
  100. //从HK1020读取一个字节
  101. //返回值:读到的数据
  102. u8 HK1020_Read_Byte(void)
  103. {
  104.     u8 i,j,dat;
  105.     dat=0;
  106.     for (i=1;i<=8;i++)
  107.     {
  108.         j=HK1020_Read_Bit();
  109.         dat=(j<<7)|(dat>>1);
  110.     }
  111.     return dat;
  112. }
  113. //写一个字节到HK1020
  114. //dat:要写入的字节
  115. void HK1020_Write_Byte(u8 dat)
  116. {
  117.     u8 j;
  118.     u8 testb;
  119.     HK1020_IO_OUT();
  120.     for (j=1;j<=8;j++)
  121.     {
  122.         testb=dat&0x01;
  123.         dat=dat>>1;
  124.         if (testb)
  125.         {
  126.             HK1020_Clr();
  127.             delay_us(2);
  128.             HK1020_Set();
  129.             delay_us(60);
  130.         }
  131.         else
  132.         {
  133.             HK1020_Clr();
  134.             delay_us(60);
  135.             HK1020_Set();
  136.             delay_us(2);
  137.         }
  138.     }
  139. }
  140. //开始温度转换
  141. void HK1020_Start(void)
  142. {
  143.     HK1020_Rst();
  144.     HK1020_Check();
  145.     HK1020_Write_Byte(0xcc); // skip rom
  146.     HK1020_Write_Byte(0x44); // convert
  147. }
  148. //初始化HK1020的IO口 DQ 同时检测HK1020的存在
  149. //返回1:不存在
  150. //返回0:存在
  151. u8 HK1020_Init(void)
  152. {
  153.     HK1020_IO_OUT();
  154.     HK1020_Set();

  155.     HK1020_Rst();  //复位HK1020
  156.     HK1020_Get_ROM(8);
  157.     HK1020_Rst();  //复位HK1020
  158.     return HK1020_Check();//等待HK1020的回应
  159. }
  160. //从HK1020得到温度值
  161. //精度:0.1C
  162. //返回值:温度值 (-550~1250)
  163. short HK1020_Get_Temp(void)
  164. {
  165.     u8 temp;
  166.     u8 TL,TH;
  167.     short tem;
  168.     HK1020_Start ();           // HK1020 start convert
  169.     HK1020_Rst();
  170.     HK1020_Check();
  171.     HK1020_Write_Byte(0xcc); // skip rom
  172.     HK1020_Write_Byte(0xbe); // convert
  173.     TL=HK1020_Read_Byte(); // LSB
  174.     TH=HK1020_Read_Byte(); // MSB
  175.     if(TH>7)
  176.     {
  177.         TH=~TH;
  178.         TL=~TL;
  179.         temp=0;                 //温度为负
  180.     }else temp=1;               //温度为正
  181.     tem=TH;                     //获得高八位
  182.     tem<<=8;
  183.     tem+=TL;                        //获得底八位
  184.     tem=(float)tem*0.625;       //转换
  185.     if(temp)return tem;     //返回温度值
  186.     else return -tem;
  187. }
  188. void HK1020_Get_ROM(u8 size)
  189. {
  190.     u8 datap[8]={0};
  191.     u8 i;
  192.     HK1020_Start ();           // HK1020 start convert
  193.     HK1020_Rst();
  194.     HK1020_Check();
  195.     HK1020_Write_Byte(0x33); // convert
  196.     for(i=0;i<size;i++)
  197.     {
  198.         datap[i]= HK1020_Read_Byte();
  199.         printf("0x%02X ", datap[i] );
  200.     }
  201.     printf("\r\n");
  202. }
  203. void Temperaturedisplay(void)
  204. {
  205.     printf("Temperature: %d.%d\r\n", HK1020_Get_Temp()/10, HK1020_Get_Temp()%10);
  206. }



代码部分完成,实际测试数据串口数据如下





时光迷宫 发表于 2025-1-9 17:56 | 显示全部楼层
这就是1-WRITE通信吗,就一根线
 楼主| trucyw 发表于 2025-1-10 08:19 | 显示全部楼层
时光迷宫 发表于 2025-1-9 17:56
这就是1-WRITE通信吗,就一根线

是的
OceanDepths 发表于 2025-1-20 16:17 | 显示全部楼层
这个一般都是IO直接模拟时序就行了吧,有没有其他方式
 楼主| trucyw 发表于 2025-1-21 09:02 | 显示全部楼层
OceanDepths 发表于 2025-1-20 16:17
这个一般都是IO直接模拟时序就行了吧,有没有其他方式

确实都是IO模拟时序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

750

帖子

2

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