DHT22(AM2302)STM32程序

更新时间:2023-03-18 03:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/*程序测试平台STM32F103CxT6* RCC时钟配置PCLK(APB2总线时钟)为72MHz*/

/*使用SYSTICK滴答定时器进行精确延时,延时函数Delay_us(u32 nTime); 需进行声明并将SYSTICK.C文件包含于指定工作组内(V3.5固件库),并在stm32f10x_it.c中添加systick的中断服务函数*/

/*单总线接口使用PB9,模式初始化为输出开漏(GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;)*/

以下是头文件AM2302.H内容: #ifndef __AM2302_H #define __AM2302_H

#include \//#include \

/*模拟IIC端口输出输入定义*/

#define DAT_H GPIOB->BSRR = GPIO_Pin_9 #define DAT_L GPIOB->BRR = GPIO_Pin_9

#define DAT_R GPIOB->IDR & GPIO_Pin_9

void COM(void); void RH(void);

#endif

//置位 //复位 //端口读寄存器

以下是AM2302.C文件内容: #include \ #include \

u8 U8FLAG=0,U8temp=0;

u8 U8T_data_H=0,U8T_data_L=0,U8RH_data_H=0,U8RH_data_L=0,U8checkdata=0; u8

U8T_data_H_temp=0,U8T_data_L_temp=0,U8RH_data_H_temp=0,U8RH_data_L_temp=0,U8checkdata_temp=0;

u8 U8comdata=0; int humi=0,temper=0; //湿度和温度暂存数据

void COM(void) //从AM2302中读取一个字节 {

u8 i;

for(i=0;i<8;i++) { U8FLAG=2; while((!(DAT_R))&&U8FLAG++); if(U8FLAG==1)break; Delay_us(30); U8temp=0; if(DAT_R)U8temp=1; U8FLAG=2; while((DAT_R)&&U8FLAG++); }

//超时则跳出for循环 if(U8FLAG==1)break; //判断数据位是0还是1

// 如果高电平高过预定0高电平值则数据位为 1 U8comdata<<=1;

U8comdata|=U8temp; //0 }

//-------------------------------- //-----湿度读取子程序 ------------ //--------------------------------

//----以下变量均为全局变量-------- //----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //--------------------------------

void RH(void) { //主机拉低18ms DAT_L; Delay_us(18000); DAT_H; //总线由上拉电阻拉高 主机延时20us

Delay_us(30);

//主机设为输入 判断从机响应信号

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(DAT_R)U8FLAG=1; while(!(DAT_R)) {

U8FLAG=2;

//判断从机是否发出 80us 的低电平响应信号是否结束 while((!(DAT_R))&&U8FLAG++); if(U8FLAG==1)break; U8FLAG=2;

//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

while((DAT_R)&&U8FLAG++); if(U8FLAG==1)break;

//数据接收状态 COM();

if(U8FLAG==1)break;

U8T_data_H_temp=U8comdata; COM();

if(U8FLAG==1)break;

//温度的高8位数据

U8T_data_L_temp=U8comdata; //温度的低8位数据 COM();

if(U8FLAG==1)break;

U8RH_data_H_temp=U8comdata; //湿度的高8位数据 COM(); if(U8FLAG==1)break; U8RH_data_L_temp=U8comdata; //湿度的低8位数据 COM(); if(U8FLAG==1)break; U8checkdata_temp=U8comdata; //校验字节数据 break; } DAT_H; //数据校验

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) //若校验通过 { U8RH_data_H=U8T_data_H_temp; U8RH_data_L=U8T_data_L_temp;

}

U8T_data_H=U8RH_data_H_temp; U8T_data_L=U8RH_data_L_temp; U8checkdata=U8checkdata_temp; humi = (int)U8RH_data_H*256+(int)U8RH_data_L; //合成并暂存16位湿度数据 temper = (int)U8T_data_H*256+(int)U8T_data_L; //合成并暂存16位温度数据 }

DAT_H;

本文来源:https://www.bwwdw.com/article/qkrf.html

Top