打印
[AT32L021]

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

[复制链接]
62|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
#ifndef __HK1020_H
#define __HK1020_H   

#include "at32l021_gpio.h"
#include "delay.h"

#define HK1020_Clr() gpio_bits_reset(GPIOB,GPIO_PINS_10)
#define HK1020_Set() gpio_bits_set(GPIOB,GPIO_PINS_10)
#define HK1020_RD  gpio_input_data_bit_read(GPIOB,GPIO_PINS_10)

u8 HK1020_Init(void);//初始化HK1020
u8 HK1020_Read_Data(u8 *temp);//读取温湿度
u8 HK1020_Read_Byte(void);//读出一个字节
u8 HK1020_Read_Bit(void);//读出一个位
u8 HK1020_Check(void);//检测是否存在HK1020
void HK1020_Rst(void);//复位HK1020
void HK1020_Get_ROM(u8 size);
short HK1020_Get_Temp(void);
void Temperaturedisplay(void);
#endif


hk1020.c
#include "hk1020.h"
#include "delay.h"

void HK1020_IO_IN(void)
{
    gpio_init_type gpio_initstructure;
    gpio_default_para_init(&gpio_initstructure);
    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstructure.gpio_mode = GPIO_MODE_INPUT;
    gpio_initstructure.gpio_pins = GPIO_PINS_10;
    gpio_initstructure.gpio_pull = GPIO_PULL_UP;
    gpio_init(GPIOB, &gpio_initstructure);
}
void HK1020_IO_OUT(void)
{
    gpio_init_type gpio_initstructure;
    gpio_default_para_init(&gpio_initstructure);
    gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
    gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
    gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
    gpio_initstructure.gpio_pins = GPIO_PINS_10;
    gpio_initstructure.gpio_pull = GPIO_PULL_UP;
    gpio_init(GPIOB, &gpio_initstructure);
}

//复位HK1020
void HK1020_Rst(void)
{
    HK1020_IO_OUT(); //SET OUTPUT
    HK1020_Clr();  //GPIO_ResetBits(GPIOB,GPIO_Pin_3);
    //Delay_Ms(1);
    delay_us(500);  //拉低500Us
    HK1020_Set();  //GPIO_SetBits(GPIOB,GPIO_Pin_3);
    delay_us(50);   //拉高50US   时间必须保证足够!!!!!
}
//等待HK1020的回应
//返回1:未检测到HK1020的存在
//返回0:存在
u8 HK1020_Check(void)
{
    u8 retry=0;
    HK1020_IO_IN();    //SET INPUT
    while(HK1020_RD&&retry<200)
    {
        retry++;
        delay_us(1);
    };
    if(retry>=200)
    {
        return 1;
    }
    else
    {
        retry=0;
        while(!HK1020_RD &&retry<240)
        {
            retry++;
            delay_us(1);
        };
        if(retry>=240) return 1;
    }
    return 0;
}
//从HK1020读取一个位
//返回值:1/0
u8 HK1020_Read_Bit(void)
{
    u8 data;
    HK1020_IO_OUT();
    HK1020_Clr();
    delay_us(2);
    HK1020_Set();
    HK1020_IO_IN();
    delay_us(12);
    if(HK1020_RD)
    {
        data=1;
    }
    else data=0;
    delay_us(50);
    return data;
}
//从HK1020读取一个字节
//返回值:读到的数据
u8 HK1020_Read_Byte(void)
{
    u8 i,j,dat;
    dat=0;
    for (i=1;i<=8;i++)
    {
        j=HK1020_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}
//写一个字节到HK1020
//dat:要写入的字节
void HK1020_Write_Byte(u8 dat)
{
    u8 j;
    u8 testb;
    HK1020_IO_OUT();
    for (j=1;j<=8;j++)
    {
        testb=dat&0x01;
        dat=dat>>1;
        if (testb)
        {
            HK1020_Clr();
            delay_us(2);
            HK1020_Set();
            delay_us(60);
        }
        else
        {
            HK1020_Clr();
            delay_us(60);
            HK1020_Set();
            delay_us(2);
        }
    }
}
//开始温度转换
void HK1020_Start(void)
{
    HK1020_Rst();
    HK1020_Check();
    HK1020_Write_Byte(0xcc); // skip rom
    HK1020_Write_Byte(0x44); // convert
}
//初始化HK1020的IO口 DQ 同时检测HK1020的存在
//返回1:不存在
//返回0:存在
u8 HK1020_Init(void)
{
    HK1020_IO_OUT();
    HK1020_Set();

    HK1020_Rst();  //复位HK1020
    HK1020_Get_ROM(8);
    HK1020_Rst();  //复位HK1020
    return HK1020_Check();//等待HK1020的回应
}
//从HK1020得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short HK1020_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
    short tem;
    HK1020_Start ();           // HK1020 start convert
    HK1020_Rst();
    HK1020_Check();
    HK1020_Write_Byte(0xcc); // skip rom
    HK1020_Write_Byte(0xbe); // convert
    TL=HK1020_Read_Byte(); // LSB
    TH=HK1020_Read_Byte(); // MSB
    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;                 //温度为负
    }else temp=1;               //温度为正
    tem=TH;                     //获得高八位
    tem<<=8;
    tem+=TL;                        //获得底八位
    tem=(float)tem*0.625;       //转换
    if(temp)return tem;     //返回温度值
    else return -tem;
}
void HK1020_Get_ROM(u8 size)
{
    u8 datap[8]={0};
    u8 i;
    HK1020_Start ();           // HK1020 start convert
    HK1020_Rst();
    HK1020_Check();
    HK1020_Write_Byte(0x33); // convert
    for(i=0;i<size;i++)
    {
        datap[i]= HK1020_Read_Byte();
        printf("0x%02X ", datap[i] );
    }
    printf("\r\n");
}
void Temperaturedisplay(void)
{
    printf("Temperature: %d.%d\r\n", HK1020_Get_Temp()/10, HK1020_Get_Temp()%10);
}



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





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

716

帖子

2

粉丝