AHT10温湿度传感器读取例程(51单片机)

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<<8)|byte_4th)>>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:笔者水平有限,如有纰漏或不足之处欢迎指正

你可能感兴趣的:(单片机,传感器)