1、说明
AM2320 数字温湿度传感器采用单总线、标准 I²C 两种通信方式。本文主要基于HT66F2390单片机,采用单总线通讯,实现AM2320传感器数据获取。关于AM2320传感器的使用,可参考AM2320产品手册。在文章最后,分享了AM2320的相关资料,里面有我写的STM32的例程,大家可以参考一下。
2、AM2320单总线通讯
3、代码
下面是基于HT66F2390的AM2320传感器开发代码:
AM2320.h
#ifndef __AM2320_H
#define __AM2320_H
#include "HT66F2390.h"
//#include "sys.h"
#include "Type.h"#define GPIO_AM2320 _pdc3
#define PIN_AM2320 _pd3void AM2320_IO_OUT(void);
void AM2320_IO_IN(void);
void AM2320_DQ_OUT(u8 i);
u8 AM2320_DQ_IN(void);
u8 AM2320_Init(void);
void AM2320_Rst(void);
u8 AM2320_Check(void);
u8 AM2320_Read_Bit(void);
u8 AM2320_Read_Byte(void);
u8 AM2320_Read_Data(float *temperature,float *humidity);#endif
sys.h文件为系统时钟配置头文件,没用到可以不调用。
Type.h文件主要是结构体类型的重定义,方便后面调用。
Type.h
typedef unsigned char u8;
typedef char s8;
typedef unsigned short u16;
typedef short s16;
typedef unsigned long u32;
typedef long s32;
AM2320.c
#include"AM2320.h"/* 输出模式 */
void AM2320_IO_OUT(void)
{GPIO_AM2320=0;
}
/* 输入模式 */
void AM2320_IO_IN(void)
{GPIO_AM2320=1;_pgpu1=1; //上拉使能
}/* AM2320初始化 */
u8 AM2320_Init(void)
{ GPIO_AM2320=0; //输入模式PIN_AM2320=1; //输出AM2320_Rst(); //发送开始信号return AM2320_Check(); //检测AM2320的响应
} void AM2320_Rst(void)
{ GPIO_AM2320=0; //输出模式PIN_AM2320=0; //拉低delay_ms(20); //拉低至少800usPIN_AM2320=1; //拉高 GCC_DELAY(120); //拉高20~40us
}u8 AM2320_Check(void) //检查
{ u8 retry=0;AM2320_IO_IN(); //输入模式 while (PIN_AM2320&&retry<100) //AM2320会拉低80us{retry++;GCC_DELAY(4);}; if(retry>=100) //超时未响应/未收到开始信号,退出检测{return 1; }else retry=0;while (!PIN_AM2320&&retry<100) //AM2320拉低后会再次拉高80us{retry++;GCC_DELAY(4);};if(retry>=100){return 1; //超时,AM2320工作出错,退出检测}return 0; //设备正常响应,可以正常工作
}
/* 读1位 */
u8 AM2320_Read_Bit()
{u8 retry=0;while(PIN_AM2320&&retry<100)//等待变成低电平,开始数据接收准备{retry++;GCC_DELAY(4);}retry=0;while(!PIN_AM2320&&retry<100)//等待变成高电平,数据开始传输{retry++;GCC_DELAY(4);}GCC_DELAY(160); //等待40us//0信号为26-28us,1信号则为70us,所以说超过40us去读取引脚状态就可以知道传输的值了if(PIN_AM2320){return 1;}else{return 0;}
}
/* 读8位 */
u8 AM2320_Read_Byte(void)
{ u8 i,dat;dat=0;for (i=0;i<8;i++) {dat<<=1; dat|=AM2320_Read_Bit();} return dat;
}/* 读温湿度 */
u8 AM2320_Read_Data(float *temperature,float *humidity)
{ u8 buf[5]; u8 i;u8 sum;*humidity=0;*temperature=0;AM2320_Rst();if(AM2320_Check()==0) //设备响应正常{for(i=0;i<5;i++)//读取40位数据{buf[i]=AM2320_Read_Byte();}AM2320_IO_OUT(); //输出模式PIN_AM2320=1; //拉高 sum = buf[0]+buf[1]+buf[2]+buf[3];if(sum == buf[4]) //校验数据接收是否正确{*humidity=(float)buf[0]*25.6+(float)0.1*buf[1]; //湿度高8位*temperature=(float)buf[2]*25.6+(float)0.1*buf[3]; //温度高八位和低八位}}else {return 1; //设备未成功响应,返回1}return 0; //读取数据成功返回0
}
建议直接使用官方的GCC_DELAY()函数,自定义的延时函数会造成延时不准从而无法获取传感器数据。
4、资源分享
链接:https://pan.baidu.com/s/17HEFl1VQY7macNFTNDbYig
提取码:2320
本链接是AM2320的资料包,其中有PDF的传感器说明书,还有STM32、Arduino和51的开发例程。因为某些原因,合泰的开发例程没有放进去。如果本文对你有用,点赞收藏支持一下呗,蟹蟹大家啦。