AHT10温湿度传感器读取例程(51单片机)
所需材料:
名称 | 个数 |
---|---|
AHT10温湿度传感器 | 1 |
51单片机 | 1 |
连接线缆 | 若干 |
概述:
AHT10温湿度传感器是以I2C为接口传送数据的器件,所以我们编写程序时是以I2C协议为主,这里我们使用软件模拟的方法来实现I2C通信。
器件简介:
AHT10 配有一个全新设计的 ASIC专用芯片、一个经过改进的MEMS半导体电容式湿度传感元件和一个标准的片上温度传感元件,其性能已经大大提升甚至超出了前一代传感器的可靠性水平,新一代温湿度传感器,经过改进使其在恶劣环境下的性能更稳定。
代码:
#define AHT10AddWr 0x70 //AHT10写数据地址
#define AHT10AddRd 0x71 //AHT10读数据地址
void AHT10Init() //AHT10初始化
{
Start_I2c();
SendByte(AHT10AddWr);
SendByte(0xe1); //初始化指令
SendByte(0x08);
SendByte(0x00);
Stop_I2c();
}
void AHT10_Init() //初始化
{
DelayMs(45);
AHT10Init();
if(AHT10_CalEN()==0)
{
while(AHT10_CalEN()==0)
{
AHT10_RST();
DelayMs(25);
AHT10Init();
if(AHT10_CalEN()==1)
{
break;
}
}
}
}
void AHT10_RST() //软复位
{
Start_I2c();
SendByte(AHT10AddWr);
SendByte(0xba);
Stop_I2c();
}
void AHT10_Mea() //触发测量
{
Start_I2c();
SendByte(AHT10AddWr);
SendByte(0xac); //触发测量指令
SendByte(0x33);
SendByte(0x00);
Stop_I2c();
}
unsigned char AHT10_Status() //读取AHT10状态寄存器
{
unsigned char byte_first;
Start_I2c();
SendByte(AHT10AddRd);
byte_first = RcvByte(); //接收数据
NoAck_I2c(); //非应答
Stop_I2c();
return byte_first;
}
unsigned char AHT10_CalEN() //判断AHT10校准使能
{
unsigned char val;
val = AHT10_Status();
if((val & 0x68)==0x08)
return 1;
else return 0;
}
void AHT11_Read_Data(unsigned long *ct) //接收湿度温度数据
{
volatile unsigned char byte_1th=0;
volatile unsigned char byte_2th=0;
volatile unsigned char byte_3th=0;
volatile unsigned char byte_4th=0;
volatile unsigned char byte_5th=0;
volatile unsigned char byte_6th=0;
unsigned long retudata=0;
unsigned char cnt=0;
AHT10_Mea(); //触发测量
DelayMs(80); //延时80毫秒
cnt=0;
while(((AHT10_Status() & 0x80)==0x80))
{
DelayMs(3);
if(cnt++>=100)
{
break;
}
}
Start_I2c();
SendByte(AHT10AddRd);
byte_1th = RcvByte(); //状态数据
Ack_I2c(); //应答
byte_2th = RcvByte(); //湿度数据
Ack_I2c();
byte_3th = RcvByte(); //湿度数据
Ack_I2c();
byte_4th = RcvByte(); //高4位为湿度 低4位为温度
Ack_I2c();
byte_5th = RcvByte(); //温度数据
Ack_I2c();
byte_6th = RcvByte(); //温度数据
NoAck_I2c();
Stop_I2c();
retudata = 0; //原始湿度数据合成
retudata = (byte_2th<<8)|byte_3th;
retudata = ((retudata<>4;
retudata = retudata & 0x000fffff;
ct[0] = retudata;
retudata = 0; //原始温度数据合成
retudata = ((byte_4th % 16)<<8)|byte_5th;
retudata = (retudata<<8)|byte_6th;
retudata = retudata & 0x000fffff;
ct[1] = retudata;
}
注:
1.在编程时先调用初始化函数,在调用读取数据函数。
2.在读取到原始数据后,我们还需要对原始数据进行计算,算出所对应的 温度值和湿度值
计算温湿度公式:
h1 = (dt[0]*1000/1024/1024); //计算湿度
t1 = (dt[1]*200*10/1024/1024-500); //计算温度
参考文献:
1.AHT10数据手册
ps:笔者水平有限,如有纰漏或不足之处欢迎指正!