在上一期的测评中,使用AVR128DB48 Curiosity Nano成功驱动了温湿度传感器,
【CuriosityNano测评报告】+使用IO驱动单总线温湿度传感器DHT22
https://bbs.21ic.com/icview-3119748-1-1.html
这里就不再介绍DHT22了,这次将代码移植到PIC18F16Q40 Curiosity Nano上,有2个需要注意的地方:1是MCC生成的关于gpio设置上拉的接口不一致,MCC为AVR128DB48生成的代码gpiox_SetPullUp()而为PIC18F16Q40生成的代码是gpiox_SetPullup()。呵呵哒,仅仅是一个大小写的问题,为啥api接口不一致呢???
2是PIC18F16Q40 的串口printf函数可以打印浮点数,而AVR128DB48的不行。
因此两者的驱动略有区别,稍微修改即可。
dht.h文件内容如下:
/*
* File: dht.h
* Author: qldeng
*
* Created on May 29, 2021, 12:17 PM
*/
#ifndef DHT_H
#define DHT_H
#ifdef __cplusplus
extern "C" {
#endif
#include "mcc_generated_files/mcc.h"
#define delay_ms(d) DELAY_milliseconds(d)
#define delay_us(d) DELAY_microseconds(d)
#define u8 uint8_t
#define u16 uint16_t
u8 DHT22_Init(void);
u8 DHT22_Read_Data(float *temperature,float *humidity);
u8 DHT22_Read_Byte(void);
u8 DHT22_Read_Bit(void);
u8 DHT22_Check(void);
void DHT22_Rst(void);
#ifdef __cplusplus
}
#endif
#endif /* DHT_H */
dht.c文件内容如下:
#include "dht.h"
//工作电压 :3.3V ~ 5.5 V
//复位DHT22
void DHT22_Rst(void)
{
DHT22_SetDigitalOutput();
DHT22_SetLow(); //拉低DQ
delay_ms(30); //拉低至少18ms
DHT22_SetHigh(); //DQ=1
delay_us(30); //主机拉高20~40us
}
//等待DHT22的回应
//返回1:未检测到DHT22的存在
//返回0:存在
u8 DHT22_Check(void)
{
u8 retry=100;
DHT22_SetDigitalInput();
DHT22_SetPullup();
while ((DHT22_GetValue())&&retry)//DHT22会拉低40~80us
{
retry--;
delay_us(1);
};
if(retry<1) return 1;
else retry=100;
while (!DHT22_GetValue()&&retry)//DHT22拉低后会再次拉高40~80us
{
retry--;
delay_us(1);
};
if(retry<1)
return 1;
return 0;
}
//从DHT22读取一个位
//返回值:1/0
u8 DHT22_Read_Bit(void)
{
u8 dat=0;
u8 retry=100;
while((DHT22_GetValue())&&retry)//等待变为高电平
{
retry--;
delay_us(1);
}
retry=100;
while(!DHT22_GetValue()&&retry)//等待变低电平
{
retry--;
delay_us(1);
}
delay_us(40);//wait 40us
if(DHT22_GetValue())
dat=1;
else
dat=0;
return dat;
}
//从DHT22读取一个字节
//返回值:读到的数据
u8 DHT22_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT22_Read_Bit();
}
return dat;
}
//从DHT22读取一次数据
//temp:温度值(范围:-40°C ~ 80°C 分辨率:0.1°C 精度:±0.5℃)
//humi:湿度值(范围:0%RH ~ 99.9%RH 分辨率:0.1%RH 精度:±2%RH (25°C))
//返回值:0,正常;1,读取失败
u8 DHT22_Read_Data(float *temperature,float *humidity)
{
u8 buf[5];
u8 i;
u8 sum;
*humidity=0;
*temperature=0;
DHT22_Rst();
if(DHT22_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT22_Read_Byte();
}
sum = buf[0]+buf[1]+buf[2]+buf[3];
if(sum == buf[4])
{
*humidity=(float)((buf[0]<<8)+buf[1])/10.0;
*temperature=(float)((buf[2]<<8)+buf[3])/10.0;
}
else
{
*humidity=(float)((buf[0]<<8)+buf[1])/10.0;
*temperature=(float)((buf[2]<<8)+buf[3])/10.0;
}
}
else
{
return 1;
}
return 0;
}
//初始化DHT22同时检测DHT22的存在
//返回1:不存在
//返回0:存在
u8 DHT22_Init(void)
{
DHT22_SetDigitalOutput();
DHT22_SetHigh();
DHT22_Rst();
return DHT22_Check();
}
主函数调用驱动并打印结果:
接线:使用的是RC2
串口打印结果:
测试工程源码
PIC18F16Q40CuriosityNanoTest.X.rar
(705.66 KB)
|