×
单片机 > 单片机程序设计 > 详情

STC15单片机DHT11温湿度检测(注释详细)oled显示程序

发布时间:2020-08-21 发布时间:
|

我这里加了oled用来显示温湿度,采用STC15,dht11模块


#include

#include "intrins.h"//用于提供_nop_();函数

#include "OLED_Contrul_Hygrothermograph.c"//OLED控制函数


sbit YLED=P3^1;

sbit RLED=P3^0;

sbit DHT=P3^5;//DHT11模块


unsigned int Temperature[3]={1,1,1};//前两位为整数部分,后一位为小数部分

unsigned int Humidity[2]={1,1};//传回的湿度数据只有整数部分


unsigned char Data_Receive[5];

/*##############################################################################################

设计名称:基于DHT11的温湿度计(Hygrothermograph)

设计者:清河


平台:STC15F104W

硬件部分

显示:采用OLED12864显示温度和湿度

测量,采用DHT11模块,模块信息如下:

ASATR

-----

NA:DHT11

OC:3.3-5.5V

U1:5-95%RH

U2:-20-60℃

U3:±5%RH±2℃

SN:A1712882A


为保证延时准确,晶振设置为12MHz


借用了http://www.51hei.com/bbs/dpj-38067-1.html上的部分程序,在此表示感谢

##############################################################################################*/


void Delay30us()//@12.000MHz

{

        unsigned char i;

        i=87;

        while(--i);

}


void Delay20ms()//@12.000MHz

{

        unsigned char i,j,k;

        i=1;

        j=234;

        k=113;

        do

        {

                do

                {

                        while(--k);

                }while(--j);

        }while(--i);

}


void Delay1s()//@12.000MHz

{

        unsigned char i,j,k;

        i=46;

        j=153;

        k=245;

        do

        {

                do

                {

                        while(--k);

                }while(--j);

        }while(--i);

}


void OLED_Display()//OLED显示驱动函数

{

        OLED_DataDisplay_T(56,4,Temperature);//在指定位置显示温度

        OLED_DataDisplay_H(56,6,Humidity);//在指定位置显示湿度

}


void DHT_Collect()//温度采集函数

{

        unsigned char i,j;//for循环变量

        unsigned char t;//超时判断

        unsigned char dat8=0;//一次读取的8位数据,需要读5次

        unsigned int CheckValue=0;//校验和

        

        DHT=0;//主机发起始信号

        Delay20ms();//主机拉低总线至少18ms

        DHT=1;//主机拉高总线20~40us

        Delay30us();

        

        t=80;//设置超时等待时间

        while(DHT&&t--);//等待DHT11拉低总线

        if(t==0)//超时

        {

                DHT=1;

        }

        t=250;//设置超时等待时间

        while(!DHT&&t--);//等待DHT11拉高总线

        if(t==0)//超时

        {

                DHT=1;

        }

        t=250;//设置超时等待时间

        while(DHT&&t--);//等待DHT11拉低总线

        if(t==0)//超时

        {

                DHT=1;

        }


        for(j=0;j<5;j++)//5次读取

        {

                for(i=0;i<8;i++)//1次8个位

                {

        //等待50us开始时隙

                        t=150;//设置超时等待时间

                        while(!DHT&&t--);//等待DHT11拉高总线

                        if(t==0)//超时

                        {

                                DHT=1;

                        }

                        t=0;//记录时间清零

                        while(DHT&&++t);//等待并记录高电平持续时间

                        dat8<<=1;

                        if(t>30)//高电平持续时间较长(70us)

                        dat8+=1;//传输值为1

                }

                Data_Receive[j]=dat8;

        }

        

        Delay30us();//等待DHT11拉低50us

        Delay30us();

        DHT=1;


        for(i=0;i<4;i++)

        {

                CheckValue+=Data_Receive[i];//计算校验值

        }

        if((unsigned char)CheckValue==Data_Receive[4])//比对

        {

                Temperature[0]=Data_Receive[2]/10;

                Temperature[1]=Data_Receive[2]%10;

                Temperature[2]=Data_Receive[3]%10;

                Humidity[0]=Data_Receive[0]/10;

                Humidity[1]=Data_Receive[0]%10;

        }

}


void sys_init()//系统初始化函数

{

        YLED=1;

        RLED=1;

        OLED_Init(); //OLED初始化

        OLED_CLS();//清屏

        

        OLED_FormTitle(0,0);//显示标题文字Linyar Lab.

        OLED_FormName(0,2);//显示Hygrothermograph名称

        OLED_FormLine(0,3);//显示一条横线

        OLED_FormTemp(8,4);//显示温度文字

        OLED_FormHumi(16,6);//显示湿度文字

        OLED_AnyChar_16X16(96,4,TempChar);//在行4(每行高16像素),列96像素位置显示摄氏度℃字符

        OLED_AnyChar_8X16(88,6,HumiChar);//在行6(每行高16像素),列88像素位置显示百分号%字符

        OLED_AnyChar_8X16(72,4,PointChar);//在行4(每行高16像素),列72像素位置显示冒号:字符

}


void main()

{

        P3M0=0X00;

        P3M1=0X00;

        sys_init();

        

        while(1)

        {

                DHT_Collect();//DHT11数据采集

                YLED=1;RLED=0;//灯状态转换

                OLED_Display();//OLED显示函数

                RLED=1;YLED=0;//灯状态转换

                Delay1s();

                Delay1s();//注意:长时间的延时必须要有,不然会读出0

        }

}



关键字:STC15  单片机  DHT11  温湿度检测  oled显示 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计