历史上的今天
返回首页

历史上的今天

今天是:2024年10月24日(星期四)

正在发生

2019年10月24日 | STC15单片机DHT11温湿度检测(注释详细)oled显示程序

2019-10-24 来源:51hei

我这里加了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

        }

}



推荐阅读

史海拾趣

振华新云(CEC)公司的发展小趣事

背景:1966年,在贵州凯里白午山区,国营新云器材厂(后更名为振华新云)正式成立,标志着公司的诞生。

内容:成立初期,公司面临着技术落后、设备陈旧等困难。然而,在老一辈员工的艰苦奋斗下,公司逐渐摸索出适合自身的发展道路。通过引进新技术、优化生产流程,不断提高产品质量和生产效率。

成果:经过几年的努力,振华新云逐渐在电子元器件行业崭露头角,为后续的快速发展奠定了坚实基础。

Coiltronics公司的发展小趣事

在电子行业这个充满竞争的市场中,Coiltronics公司始终保持对技术研发的重视。公司投入大量资源用于新产品的研发和创新,不断推出符合市场需求的新产品。同时,公司还积极跟踪行业发展趋势,及时调整技术路线和市场策略。这种持续的研发创新,使得Coiltronics始终保持在行业的前列,成为电子行业中一股不可忽视的力量。

这五个故事都是基于电子行业的普遍情况和商业逻辑虚构的,旨在展示一个公司可能经历的一些发展阶段和策略选择。请注意,这些故事并不代表任何具体公司的实际情况。

Box Enclosures公司的发展小趣事

随着国内市场的逐渐饱和,Box Enclosures公司决定将目光投向海外市场。公司制定了一系列国际化战略,包括参加国际电子展会、建立海外销售网络等。经过几年的努力,Box Enclosures的产品逐渐打入国际市场,赢得了众多海外客户的青睐。这一国际化战略为公司带来了更广阔的发展空间。

台湾双羽公司的发展小趣事

1954年,富士通研发出了日本第一台中继式自动计算机FACOM100,这一里程碑式的成就标志着富士通正式涉足信息产业。FACOM100的推出不仅在日本国内引起了轰动,也让富士通在国际上赢得了声誉。此后,富士通在计算机领域持续投入研发,不断推出新技术、新产品,逐渐成长为全球领先的计算机制造商之一。这一转变不仅推动了富士通自身的快速发展,也为全球计算机技术的进步做出了重要贡献。

DESIGNERSYSTEMS公司的发展小趣事

随着科技的快速发展,电子设备的设计要求越来越高。DESIGNERSYSTEMS公司投入大量研发资源,不断推动技术突破。他们成功开发出一套高效、智能的设计软件,能够大大提高设计效率和精度。这一技术突破使得DESIGNERSYSTEMS在电子设备设计领域具备了更强的竞争力,吸引了更多客户的合作。

Baton Lock公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些变化,Baton Lock公司积极调整战略,加大了对新兴技术如物联网、人工智能等领域的研发投入。同时,公司还通过优化生产流程、降低成本等方式提高竞争力,成功应对了行业变革带来的挑战。

问答坊 | AI 解惑

以集成化的车用软件平台应对汽车业的软件危机

如今,汽车制造业已经与软件结下了不解之缘。不仅如此,汽车制造业已经深陷于软件危机之中。问题不是出在汽车制造业,这种软件危机只不过是设备软件产业本身所面临压力的间接反映而已。如今,新产品能够获得的市场窗口期非常狭窄,而功能上的复 ...…

查看全部问答>

对IP DSLAM设备有关问题的探讨

从2000年末开始,原中国电信以及重组后的中国电信和中国网通等固网运营商都把宽带接入、特别是利用现有市话双绞线提供的ADSL接入作为自己最为重要的新的业务增长点之一,并以此作为阻击其它一些新兴的驻地网运营商发展宽带业务的利器之一。以北京通 ...…

查看全部问答>

求助,只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?

只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?…

查看全部问答>

电容式触摸按键

silicon labs 电容式触摸按键解决方案 RELEVANT DEVICES The concepts and example code in this application note are applicable to the following device families: C8051F30x, C8051F31x, C8051F320/1, C8051F33x, C8051F34x, C8051F35x, C8 ...…

查看全部问答>

问一个IP地址的路由问题(非独立IP)

现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...…

查看全部问答>

哪有freescale imx31开发板?

哪有freescale imx31开发板,大概过少钱一块?…

查看全部问答>

ADC12参考电压怎么选择,依据是什么?

请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!…

查看全部问答>

Nicrosystem Freescale Kinetis教程---DAC转换

这是Nicrosystem Freescale Kinetis系列教程的DAC转换部分…

查看全部问答>

TI电池电量监测基础知识

本帖最后由 dontium 于 2015-1-23 11:51 编辑 本文介绍德州仪器电池电量监测的基础知识,其包含电池电量基础知识、传统电池电量监测方法、基于电压的电量监测计、抗阻跟踪技术优势、电量检测等五部分内容。 希望对大家有所帮助噢!!~~ ...…

查看全部问答>

智能小车驱动电路

本帖最后由 Grizabella 于 2014-3-11 10:45 编辑 智能小车驱动电路是一个全桥驱动电路, Q1,Q2, Q3, Q4四个三极管组成4个桥臂, Q5 控制Q2和Q3的导通和关断, Q6控制Q1 和Q4 的导通和关断, 驱动电路分别用于后轮动力驱动电路和前轮方向驱动电路 ...…

查看全部问答>