HT66F2390单片机与AM2320温湿度传感器单总线通讯
AM2320 数字温湿度传感器是一款含有己校准数字信号输出的温湿度复合型传感器,采用单总线、标准 I²C 两种通信方式。
本文基于HT66F2390单片机,采用单总线通讯,实现AM2320传感器数据获取,关于AM2320传感器的使用,可参考AM2320产品手册。
AM2320资料链接:https://pan.baidu.com/s/1B5c9MSYykXByCMxZVks2vg
提取码:2320
下面是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 _pd3
void 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
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();
}
void AM2320_Rst(void)
{
GPIO_AM2320=0; //输出模式
PIN_AM2320=0; //拉低
delay_ms(20); //拉低至少18ms
PIN_AM2320=1; //拉高
GCC_DELAY(120); //Pull up 20~40us
}
u8 AM2320_Check(void) //检查
{
u8 retry=0;
AM2320_IO_IN(); //输入模式
while (PIN_AM2320&&retry<100) //DHT11 Pull down 40~80us
{
retry++;
GCC_DELAY(4);
};
if(retry>=100)
{
return 1;
}
else
retry=0;
while (!PIN_AM2320&&retry<100) //DHT11 Pull up 40~80us
{
retry++;
GCC_DELAY(4);
};
if(retry>=100)
{
return 1; //chack error
}
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
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++)
{
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;
}
return 0;
}
建议直接使用官方的GCC_DELAY()函数,自定义的延时函数会造成延时不准从而无法获取传感器数据。