历史上的今天
今天是: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
下一篇:点亮第一个LED灯
史海拾趣
|
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不支持虚拟技术是不是指的不支持VMWEAR虚拟机等,无法安装LINUX,VISTA,JAVA虚拟机等。还是cpu虚拟技术和虚拟机根本就是两回事,如果是两回事请分别说明下,谢谢!!!… 查看全部问答> |
|
关于PROTEUS,在PROTEUS里面由汇编语言生成".HEX"文件 最近一直在使用PROTEUS.但是如果使用PROTEUS本身来编译"ASM"文件,怎么老说不能生成".OBJ"文件,用的是AVR单片机. 软件装的应该没问题的. 谢谢!头都大了!… 查看全部问答> |
|
语音: 井下考勤室到了,请您下车 地面井口到,请您下车 15号煤水平到了,请您下车 620水平到了,请您下车 695水平到了,请您下车 前方来车请注意安全 正在行车严禁行人 这些都可以用WT588D来做,而且电路设计简单,灵活性强,用客可以随 ...… 查看全部问答> |
|
当只发一个数据时,数据是正确的,但是当用查询的方式,连续发送数据的时候,数据就是错误的,而且当判断是否接收到数据结束码时,用查询方式也不能使数据连续发送,屏蔽此条语句后便可连续发送。用串口调试助手接收数据。是先采集数据,然后再发到 ...… 查看全部问答> |




