标题:
基于STM32的DHT22温湿度检测12864显示程序
[打印本页]
作者:
King97
时间:
2019-4-18 18:50
标题:
基于STM32的DHT22温湿度检测12864显示程序
温湿度检测DHT22+12864显示
单片机源程序如下:
#include "humiture.h"
#include "systick.h"
char RHData_H_Temp,RHData_L_Temp,TData_H_Temp,TData_L_Temp,CheckData_Temp; //温湿度数据校验前存放位置
char RHData_H,RHData_L,TData_H,TData_L,CheckData; //最终温湿度数据存放处
char check_temp;
void Humitureport_outputinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure_A; //声明一个结构体变量,用来初始化GPIO_A ; A PORT AS OUTPUT
//SystemInit(); //system CLK initial
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
/* 配置GPIO_A的模式和IO口 */
GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //选择你要设置的IO口
GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
}
void Humitureport_inputinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure_A; //声明一个结构体变量,用来初始化GPIO_A ; A PORT AS OUTPUT
//SystemInit(); //system CLK initial
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //enable APB2 external clock
/* 配置GPIO_A的模式和IO口 */
GPIO_InitStructure_A.GPIO_Pin = Humiture_Port; //选择你要设置的IO口
GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_IPU; //设置为上拉输入模式
GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(GPIOA,&GPIO_InitStructure_A); //init GPIOA port by GPIO_InitStructure structure
}
char Bit_Select(void)
{
uchar i,temp;
uchar Byte_Data = 0; //存放每字节温湿度的数据
// Byte_Data = 0;
// Humitureport_inputinit();
for(i=0;i<8;i++)
{
//FLAG=2;
//while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断数据位是0还是1
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断数据位是0还是1
delay_us(30); //如果30微秒过后引脚还为高电平则为1
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))
temp = 1;
else
temp = 0;
//FLAG=2;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12));
// if(FLAG == 1)break; //超时则跳出for循环
Byte_Data<<=1;
Byte_Data|= temp;
}
return Byte_Data;
}
/*******************************************************************************
* 函 数 名 : HumitureRead
* 函数功能 : 温湿度数据读取
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void HumitureRead(void)
{
Humitureport_outputinit(); //端口配置为输出模式
GPIO_ResetBits(GPIOA,GPIO_Pin_12); //主机拉低18ms
delay_ms(1);
GPIO_SetBits(GPIOA,GPIO_Pin_12); //主机由上拉电阻拉高延时30us
delay_us(30);
Humitureport_inputinit(); //主机设为输入模式
if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)) //判断DHT22是否有响应信号输出
{
// FLAG=2;
// while((!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断DHT22的80us响应信号是否结束
// FLAG=2;
// while((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12))&&FLAG++); //判断DHT22是否发出80us高电平,如果是进入数据接受状态
//FLAG=2;
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断DHT22的80us响应信号是否结束
//FLAG=2;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12)); //判断DHT22是否发出80us高电平,如果是进入数据接受状态
RHData_H_Temp = Bit_Select();
RHData_L_Temp = Bit_Select();
TData_H_Temp = Bit_Select();
TData_L_Temp = Bit_Select();
CheckData_Temp = Bit_Select();
// GPIO_ResetBits(GPIOA,GPIO_Pin_12); //DHT22拉低总线50us
delay_us(50);
Humitureport_outputinit(); //端口配置为输出模式
GPIO_SetBits(GPIOA,GPIO_Pin_12); //主机拉高总线
check_temp = (RHData_H_Temp + RHData_L_Temp + TData_H_Temp + TData_L_Temp);
if(check_temp == CheckData_Temp)
{
RHData_H = RHData_H_Temp;
RHData_L = RHData_L_Temp;
TData_H = TData_H_Temp;
TData_L = TData_L_Temp;
CheckData= CheckData_Temp;
}
}
}
/*******************************************************************************
* 函 数 名 : Humitureoutput
* 函数功能 : 温湿度数据输出
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Humitureoutput(void)
{
HumitureRead();
HumitureData[0] = RHData_H;
HumitureData[1] = RHData_L;
HumitureData[2] = TData_H;
HumitureData[3] = TData_L;
HumitureData[4] = CheckData;
}
复制代码
所有资料51hei提供下载:
基于STM32的DHT22驱动程序.7z
(201.2 KB, 下载次数: 116)
2019-4-19 17:36 上传
点击文件名下载附件
基于STM32的温湿度检测
下载积分: 黑币 -5
作者:
jemery1030
时间:
2019-8-25 21:50
感謝分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1