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

|