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

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值