历史上的今天
返回首页

历史上的今天

今天是:2025年01月09日(星期四)

正在发生

2020年01月09日 | 基于单片机的DHT11温度湿度采集系统

2020-01-09 来源:51hei

DHT11温度湿度采集原理图:

DHT11的单片机源程序:

***************************************************************/

#include

#define uint unsigned int 

#define uchar unsigned char

#include


typedef bit BOOL  ; 


sbit io = P1^1 ;//(口线定义)

sbit bee=P1^0;

sbit rs = P2^5 ; 

sbit rw = P2^6 ;

sbit ep = P2^7 ;

bit flag_300ms ;


sbit K1=P1^2;

sbit K2=P1^3;

sbit K3=P1^4;


uchar yemian=0;//(定义变量)

uchar flat=1;

uchar data_byte;

uchar RH,RL,TH,TL;

uchar WenDu,ShiDu;//报警的温度和湿度

#include "eeprom52.h"



/****************************延时程序****************************/

void delay(uchar ms)

{       // 延时子程序

         uchar i ;

         while(ms--)

         {

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

         }

}


void delay1()//延时10us

{

        uchar i;

        i--;

        i--;

        i--;

        i--;

        i--;

        i--;

}

void longdelay(uchar s) //长延时

{

         while(s--)

         {

                  delay(20) ;

         }

}




/******************把数据保存到单片机内部eeprom中******************/

void write_eeprom()

{

        SectorErase(0x2000);

        byte_write(0x2000, WenDu);

        byte_write(0x2001, ShiDu);

        byte_write(0x2060, a_a);        

}


/******************把数据从单片机内部eeprom中读出来*****************/

void read_eeprom()

{

        WenDu   = byte_read(0x2000);

  ShiDu = byte_read(0x2001);

        a_a      = byte_read(0x2060);

}


/**************开机自检eeprom初始化*****************/

void init_eeprom()

{

        read_eeprom();                //先读

        if(a_a != 2)                //新的单片机初始单片机内问eeprom

        {

        WenDu   = 30;

        ShiDu   = 80;

                a_a = 2;

                write_eeprom();

        }        

}




/********************报警程序部分*******************/

void warn()  //报警函数

{

        

  if(TH>=WenDu)  //检测的温度高于设定温度报警值

                                             

     { 

      bee=0; //报警

                        

     }      

                 

        if(RH>=ShiDu)  //检测的湿度高于设定的湿度值

                                             

     { 

      bee=0; //报警

     }      


                 

        if( TH    {

                  bee=1; //停止报警

                }

                 

  

}


/************************LCD模块******************************************/


BOOL lcd_bz()//测试LCD忙碌状态

{      

         BOOL result ;

         rs = 0 ;

         rw = 1 ;

         ep = 1 ;

         result = (BOOL)(P0 & 0x80) ;

         ep = 0 ;

         return result ; 

}


void write_cmd(uchar cmd)// 写指令

{       

        while(lcd_bz()) ;

        rs = 0 ;

        rw = 0 ;

        ep = 0 ;

        P0 = cmd ;

        ep = 1 ;

        ep = 0 ;  

}


void write_addr(uchar addr)//写地址

{       

        write_cmd(addr|0x80) ;

}


void write_byte(uchar dat)//写字节

{      

        while(lcd_bz()) ;

          rs = 1 ;

          rw = 0 ;

          ep = 0 ;

          P0 = dat ;

          ep = 1 ;

          ep = 0 ; 

}


void lcd_init()// 初始化

{       

         write_cmd(0x38) ; 

         delay(1);

         write_cmd(0x08) ;  

         delay(1);

         write_cmd(0x01) ; 

         delay(1);

         write_cmd(0x06) ;

         delay(1);

         write_cmd(0x0c) ; 

         delay(1);

}


void display(uchar addr, uchar q)//在某一地址上显示一字节

{          

         delay(1) ;

         write_addr(addr) ;

   write_byte(q) ;

         delay(1) ;

         

}


/*********************** DHT11测试模块***************************************/


void start()//开始信号

{

        io=1;

        delay1();

        io=0;

        delay(20);//>18ms

        io=1;

        delay1();//20-40us

        delay1();

        delay1();

        delay1();

        delay1();

}

uchar receive_byte()//接收一个字节

{

        uchar i,temp,count;

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

        {

        temp=0;

                delay1();delay1();delay1();delay1();

                if(io==1)temp=1;

                count=2;

                while((io)&&count++);

                if(count==1)break;

                data_byte<<=1;        

                data_byte|=temp;

        }

        return data_byte;

}

void receive()//接收数据

{

        uchar T_H,T_L,R_H,R_L,check,num_check;

        uchar count;

        start();//开始信号

        io=1;

        if(!io)//读取DHT11响应信号

        {

        

        while((io)&&count++);

        R_H=receive_byte();

        R_L=receive_byte();

        T_H=receive_byte();

        T_L=receive_byte();

        check=receive_byte();

        io=0;//拉低延时50us

        delay1();delay1();delay1();delay1();delay1();

        io=1;

        num_check=R_H+R_L+T_H+T_L;

        if(num_check=check)

        {

                RH=R_H;

                RL=R_L;

                TH=T_H;

                TL=T_L;

                check=num_check;

        }

        }

}



void showw()   // 问候语函数

{      

           lcd_init(); //初始化

            delay(10);

        

     display(0x05,'W');

     display(0x06,'e');

                 display(0x07,'l');

                 display(0x08,'c');

                 display(0x09,'o');

                 display(0x0a,'m');

     display(0x0b,'e');

           delay(250); //短暂延时

           delay(250);

           delay(250);

           


/*********************************/

/*

           display(0x40,' ') ;

                 display(0x41,'h');

                 display(0x42,'e');

                

*/

}



/*************定时器0初始化程序***************/

void time_init()          

{

        EA   = 1;                   //开总中断

        TMOD = 0X01;          //定时器0、定时器1工作方式1

推荐阅读

史海拾趣

HELUKABEL公司的发展小趣事

HELUKABEL(和柔)公司在电子行业中以其卓越的电缆产品和解决方案而闻名,其发展历程中充满了多个值得一提的故事。以下是五个关于HELUKABEL在电子行业中发展起来的相关故事:

1. 从德国起源到全球扩张

HELUKABEL成立于1969年(也有资料提及为1978年),最初便专注于高品质电缆的生产。公司总部位于德国,凭借其卓越的产品质量和客户服务,迅速在欧洲市场站稳脚跟。随着全球化进程的加速,HELUKABEL开始实施国际化战略,逐步在全球37个国家建立了60多个子公司,形成了覆盖全球的销售和服务网络。这一过程中,HELUKABEL不仅将德国的技术和质量标准带到了世界各地,还根据当地市场需求进行产品调整和优化,实现了本土化经营。

2. 工业4.0时代的机器人电缆解决方案

随着工业4.0和智能制造的兴起,机器人成为制造业不可或缺的一部分。然而,机器人作业环境的复杂性和多轴运动对电缆提出了极高的要求。HELUKABEL凭借其深厚的电缆技术积累,研发出了适用于各种工业机器人的管线包技术。这些管线包不仅安装简便、空间占用小,还能确保机器人在高速、高负荷运行下的稳定性和可靠性。Robotec作为HELUKABEL旗下的子公司,更是专注于机器人电缆和组件的研发与生产,为全球机器人制造商提供了优质的解决方案。

3. 汽车轻量化进程中的电缆应用

汽车轻量化是近年来汽车行业的重要趋势之一,旨在提高燃油效率、降低排放。HELUKABEL凭借其丰富的电缆产品线和技术实力,积极参与到了这一进程中。公司提供的轻量化电缆不仅具有优异的电气性能和机械强度,还能有效减轻汽车整体重量。例如,在力劲集团的汽车轻量化生产车间中,HELUKABEL的电缆产品被广泛应用于控制柜和测量系统中,为汽车轻量化生产提供了坚实的电气连接保障。

4. 供应链优化与本土化战略

面对全球供应链的不确定性和挑战,HELUKABEL积极实施本土化战略以应对市场变化。公司在中国等关键市场建立了生产基地和供应链体系,实现了从原材料采购到成品生产的本地化。这一战略不仅缩短了产品交付周期、降低了物流成本,还提高了供应链的灵活性和抗风险能力。特别是在疫情期间,HELUKABEL通过本土化供应链体系确保了产品的稳定供应,赢得了客户的信赖和好评。

5. 技术创新与产品多样化

HELUKABEL始终将技术创新作为企业发展的核心驱动力。公司不断投入研发资源,推出了一系列具有自主知识产权的新产品和新技术。这些产品涵盖了低压至中压范围内的各类连接和控制用电器设备所需的电缆和线缆产品。同时,HELUKABEL还积极代理欧洲、美国等地区的知名品牌产品,为客户提供更加多样化的选择。通过技术创新和产品多样化战略的实施,HELUKABEL在电子行业中保持了领先地位并持续拓展市场份额。

Chenmoun Enterprise Ltd公司的发展小趣事

随着公司业务的不断扩张,Chenmoun Enterprise Ltd开始实施全球化战略布局。公司在全球范围内设立了研发中心和生产基地,充分利用各地的资源优势和人才优势,提升产品的竞争力。同时,公司积极开拓国际市场,与多家国际知名企业建立了紧密的合作关系,实现了业务的快速增长。

Genesis Microchip公司的发展小趣事

随着战后的经济复苏和科技的快速发展,GI开始积极寻求业务多元化和国际化的发展道路。公司不仅继续深耕电子技术领域,还逐渐涉足通信、计算机等多个领域,推出了包括通信设备、计算机硬件在内的多款新产品。同时,GI也积极开拓海外市场,通过设立分支机构、与当地企业合作等方式,成功将产品销往全球多个国家和地区。这一阶段的成功,使GI成为了名副其实的跨国电子巨头。

DBM REFLEX公司的发展小趣事

DBM REFLEX公司成立于本世纪初,初期以提供光学组件的小规模定制服务为主。创始人对光学技术的深刻理解和对市场的精准把握,使公司迅速在光学器件领域崭露头角。随着技术的不断积累和市场需求的增长,DBM REFLEX逐渐扩大了产品线,开始为LED市场设计、铸模和生产高质量的光学器件。

Geyer Electronic E K公司的发展小趣事

在光学器件领域,技术创新是企业发展的关键。DBM REFLEX深知这一点,因此不断投入研发资源,致力于技术创新和产品创新。公司成功研发出了一系列具有高性能、高可靠性和高稳定性的光学器件,这些产品不仅满足了市场的需求,还为公司赢得了良好的口碑。

长江微电(cjiang)公司的发展小趣事

长江微电(CJIANG)自创立以来,始终专注于电感产品的材料研发、技术研发、生产工艺和生产设备的研发和改进。面对国外品牌在电感技术领域的领先地位,长江微电并未退缩,而是选择迎难而上。通过多年的努力,其技术团队基于对磁性材料的深入研究和对生产工艺的不断改进,成功突破了VISHAY等国外品牌的技术壁垒,拥有了全系列的一体成型电感产品。这一突破不仅彰显了长江微电的技术实力,也为公司的发展奠定了坚实基础。

问答坊 | AI 解惑

Getting a task done in another clock domain

If the clkA domain has a task that needs to be completed in the clkB domain, you can use the following design. Here\'s one way to do it module TaskAck_CrossDomain(    clkA, TaskStart_clkA, TaskBusy_clkA, TaskDone_clk ...…

查看全部问答>

招聘软、硬件开发工程师

软件开发工程师   5人     任职资格: 1、 大学本科及以上学历,光信息科学与技术、光通信等相关专业; 2、 熟练掌握C/C++编程语言及主流的工具平台; 3、 熟练掌握windows编程; 4、 2年以上软件工程经验、数据库开发 ...…

查看全部问答>

T5500不支持虚拟技术是什么意思?

T5500不支持虚拟技术是不是指的不支持VMWEAR虚拟机等,无法安装LINUX,VISTA,JAVA虚拟机等。还是cpu虚拟技术和虚拟机根本就是两回事,如果是两回事请分别说明下,谢谢!!!…

查看全部问答>

关于PROTEUS,在PROTEUS里面由汇编语言生成".HEX"文件

最近一直在使用PROTEUS.但是如果使用PROTEUS本身来编译"ASM"文件,怎么老说不能生成".OBJ"文件,用的是AVR单片机. 软件装的应该没问题的. 谢谢!头都大了!…

查看全部问答>

在煤矿中做个性化语音提示器

语音: 井下考勤室到了,请您下车 地面井口到,请您下车 15号煤水平到了,请您下车 620水平到了,请您下车 695水平到了,请您下车 前方来车请注意安全 正在行车严禁行人 这些都可以用WT588D来做,而且电路设计简单,灵活性强,用客可以随 ...…

查看全部问答>

大家现在MSP430G2系列用的多吗?

MSP430G2系列的现在价格大概是多少¥ 啊?     大家都应用在哪个领域啊》…

查看全部问答>

建议ST出些大RAM的STM32.

目前与STM20同档次的LM 32K相比都少了12K。出大RAM以满足大量数据流通与处理而程序并不复杂的应用。…

查看全部问答>

stm32gcc可以用吗,哪里有下载?

                                 stm32 gcc可以用吗,哪里有下载?…

查看全部问答>

串口发送数据不正确是怎么回事?

当只发一个数据时,数据是正确的,但是当用查询的方式,连续发送数据的时候,数据就是错误的,而且当判断是否接收到数据结束码时,用查询方式也不能使数据连续发送,屏蔽此条语句后便可连续发送。用串口调试助手接收数据。是先采集数据,然后再发到 ...…

查看全部问答>