本帖最后由 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);
}
代码部分完成,实际测试数据串口数据如下
|