找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5322|回复: 5
收起左侧

基于STM32的DHT11 oled显示源码

[复制链接]
ID:282147 发表于 2018-7-14 17:33 | 显示全部楼层 |阅读模式
通过DHT11测出温湿度值,oled显示出来。
#include "stm32f10x.h"
#include "DHT11.h"
#include "Delay.h"
#include "bsp_usart.h"
#include "oled.h"
DHT11_Data DHT11;

void DHT11_GPIO_IN(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置浮空输入
GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}

/********************************************************
函数:DHT11_GPIO_OUT
描述:设置GPIO口为输出状态
参数:无
返回:无
********************************************************/
void DHT11_GPIO_OUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        
GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
}

/********************************************************
函数:DHT11WriteStart
描述:发起开始信号
参数:无
返回:无
********************************************************/
void DHT11WriteStart(void)//开始标志
{
DHT11_GPIO_OUT(); //设置io为输出模式
DHT11_DATA_OUT(1); //拉高
DHT11_DATA_OUT(0); //拉低
Delay_Ms(20); //主机拉低总线必须大于18ms
DHT11_DATA_OUT(1); //拉高
Delay_Us(30); //主机发送开始信号结束后延时等待20-40us
DHT11_GPIO_IN(); //启动信号开始后,为如数据将io设置设置为输入模式
}

/********************************************************
函数:DHT11ReadByte
描述:从DHT11中读取一位数据
参数:无
返回:返回读出来的数据
********************************************************/
u8 DHT11ReadByte(void)
{
u8 temp=0,i;
for(i=0;i<8;i++)//读取8位数据
{
while(DHT11_DATA_IN()==0);//等待变高电平[DHT在单片机采集DATA引脚输出低电平时,从低功耗模式转至高速模式,等待DATA引脚变为高电平]
/*DHT11 以26us~28us的高电平表示“0”,以70us的高电平表示“1”
每一bit数据都以50us低电平时隙开始,当检测到60us后的电平区别状态*/
Delay_Us(60);//1.DHT输出 60us低电平 作为应答信号2.DHT输出 80us高电平 通知微处理器准备接受数据
if(DHT11_DATA_IN()==1) //60us后还是高电平则是“1”
{
while(DHT11_DATA_IN()==1);
temp|=(u8)(0x01<<(7-i));
}
else //否则是“0”
{
temp&=(u8)~(0x01<<(7-i));
}
}
return temp;
}

/********************************************************
函数:DHT11Read
描述:采样当前温湿度值
参数:
RH:湿度值的整数部分
RL: 湿度值的小数部分
TH: 温度值的整数部分
TL: 温度值的小数部分
返回:
********************************************************/
char a[5];
int temp;
void DHT11Read(void)
{
DHT11WriteStart(); //发起开始信号
if(DHT11_DATA_IN()==0)
{
while(DHT11_DATA_IN()==0);
while(DHT11_DATA_IN()==1);
DHT11.RH= DHT11ReadByte(); //湿度高8位
DHT11.RL= DHT11ReadByte(); //湿度低8位
DHT11.TH= DHT11ReadByte(); //温度高8位
DHT11.TL= DHT11ReadByte(); //温度低8位
DHT11.sum= DHT11ReadByte(); //校验和

DHT11_GPIO_OUT(); //采样结束后设置io口为输出,等待下一次开始信号
DHT11_DATA_OUT(1); //设置总线空闲状态为高电平
}
if(DHT11.sum== DHT11.RH+DHT11.RL+DHT11.TH+DHT11.TL) //校验和与计算出的数据相等
        {
//                OLED_ShowString(6,6,"c");
//                printf("当前环境湿度为%d.%d﹪,当前环境温度为%d.%d℃\r\n",DHT11.RH,DHT11.RL,DHT11.TH,DHT11.TL);
//                DHT11.TL=2;
               
                OLED_16x16CNStr(0,0,"23");
                OLED_ShowChar(32,0,':');
               
                temp=(int)DHT11.RH;
                sprintf(a,"%d",temp);
                OLED_ShowString(48,0,a);
               
                OLED_ShowChar(64,0,'.');
               
                temp=(int)DHT11.RL;
                sprintf(a,"%d",temp);
                OLED_ShowString(72,0,a);
                OLED_ShowChar(80,0,'%');
               
                OLED_16x16CNStr(0,2,"45");
                OLED_ShowChar(32,2,':');
               
                temp=(int)DHT11.TH;
                sprintf(a,"%d",temp);
                OLED_ShowString(48,2,a);
               
                OLED_ShowChar(64,2,'.');
               
                temp=(int)DHT11.TL;
                sprintf(a,"%d",temp);
                OLED_ShowString(72,2,a);
                OLED_16x16CNStr(80,2,"6");
               
}

}



DHT11.rar

41.99 KB, 下载次数: 221, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:494287 发表于 2019-3-25 22:51 | 显示全部楼层
顶一下,看懂再回来。哈哈
回复

使用道具 举报

ID:393260 发表于 2019-4-9 08:35 来自手机 | 显示全部楼层
昨天把两个历程兑一起,死在oled初始化了,过来借鉴一下
回复

使用道具 举报

ID:204748 发表于 2019-4-13 17:03 | 显示全部楼层
下载来看看,刚好用到
回复

使用道具 举报

ID:548519 发表于 2019-6-9 18:21 | 显示全部楼层
下载来研究下,非常感谢!
回复

使用道具 举报

ID:610983 发表于 2019-9-14 10:25 | 显示全部楼层
为啥烧进去,OLED不亮,是管脚定义有问题吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表