




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附录1:#include <regx52.h>#include <intrins.h>#include "DHT11.H"#include "DHT11.C"unsigned char range4=55,75,10,30; /温湿度上下限初值unsigned char Humi_Temp_Tab8=6,9,0,0,7,8,0,0; /数码管显示初值unsigned char numt1=0; /T1中断计数标志unsigned char numt0=0;unsigned char code Tab_Seg10=0x3f,0x06
2、,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管段码 0-9unsigned char code Tab_Dig8=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe; /位选第一位到第八位unsigned char code units4=0x39,0x71,0x77,0x76; /单位C/F/RH/*/* 温湿度采集函数 */*/void getdata() if(start_DHT11() read_DHT11();if(check_sum()Humi_Temp_Tab0=DHT_data.DH_H/10;Humi_
3、Temp_Tab1=DHT_data.DH_H%10;Humi_Temp_Tab2=DHT_data.DH_L/10; /存储湿度数据if(flag = 0)Humi_Temp_Tab4=DHT_data.T_H/10;Humi_Temp_Tab5=DHT_data.T_H%10;Humi_Temp_Tab6=DHT_data.T_L/10; /存储摄氏温度数据elseHumi_Temp_Tab4=(9*DHT_data.T_H/5+32)/10;Humi_Temp_Tab5=(9*DHT_data.T_H/5+32)%10; Humi_Temp_Tab6=(18*DHT_data.T_H+3
4、20)%100%10; /存储华氏温度数据/*/* 主函数 */*/ void main() delay_ms(500); /先进行延时 等待进入稳定状态P0 = 0;P1 = 0x0C; /初始化P1口EA = 0;TR1 = 0;TR0 = 0;TMOD = 0x11; /设置定时器 T0和T1,且工作方式都为方式1TH1 = (65536-5000)/256;TL1 = (65536-5000)%256;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;/设定初值2msTR1 = 1;TR0 = 1;EA = 1;ET0 = 1; ET1 = 1
5、; /打开中断定时器T0和T1PT1 = 0;PT0 = 1; /强制设置优先级delay_ms(1000); while(1) if(DHT_data.DH_H<range0) /湿度小于下限bee = 0;delay_ms(100);bee = 1;delay_ms(100);if(DHT_data.DH_H>range1) /湿度大于上限bee = 0;delay_ms(100);bee = 1;delay_ms(100);if(DHT_data.T_H<range2) /温度小于下限bee = 0;delay_ms(10);bee = 1;delay_ms(10);i
6、f(DHT_data.T_H>range3) /温度大于上限bee = 0;delay_ms(10);bee = 1;delay_ms(10); /*/* 定时器T0中断 */*/void T0_timer() interrupt 1unsigned char KData = 0x00;TR0 = 0; /进入T0后将T0中断关闭TH0 = (65536-2000)/256;TL0 = (65536-2000)%256;switch(numt0)case 0:P0 = 0; Seg_ce = 1; Seg_ce = 0; /段选开关if(flag2 = 1)P0 = Tab_Segran
7、ge0/10; /显示湿度下限的十位elseP0 = Tab_SegHumi_Temp_Tab0; /显示读取的湿度的十位Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig0; /位选第一位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 1:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segrange0%10; /显示湿度下限的个位elseP0 = Tab_SegHumi_Temp_Tab1; /显示读取的湿度的个位Seg_ce = 1; Seg_ce = 0;P0 = Tab_
8、Dig1; /位选第二位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 2:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segrange1/10;/显示湿度上限的十位elseP0 = units2; /显示单位RSeg_ce = 1; Seg_ce = 0; P0 = Tab_Dig2; /位选第三位Dig_ce = 1; Dig_ce = 0;numt0+;break;case 3:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segra
9、nge1%10; /显示湿度上限的个位elseP0 = units3; /显示单位H Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig3; /位选第四位 Dig_ce = 1; Dig_ce = 0;numt0+;break;case 4:P0 = 0; Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig4; /位选第五位,且同时拉低键盘第四行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; /扫描键盘第四行switch(KData)case 0xfe: case 0xfd: case 0xfb: case
10、0xf7: default:break;while(KData != 0xff)KData = P0;Key_ce = 1; if(flag2 = 1)P0 = Tab_Segrange2/10;/显示温度下限的十位elseP0 = Tab_SegHumi_Temp_Tab4; /显示读取的温度的十位Seg_ce = 1; Seg_ce = 0;numt0+;break;case 5:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig5; /位选第六位,且同时拉低键盘第三行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P
11、0;/扫描键盘第三行switch(KData)case 0xfe:if(range0<range1&&flag2=1) range0+;break; /湿度下限加case 0xfd:if(range1<90&&flag2=1) range1+;break; /湿度上限加case 0xfb:if(range2<range3&&flag2=1 range2+;break;/温度下限加 case 0xf7:if(range3<50&&flag2=1) range3+;break; /温度上限加default:br
12、eak;while(KData != 0xff)KData = P0;Key_ce = 1;if(flag2 = 1)P0 = Tab_Segrange2%10; /显示温度下限的个位elseP0 = Tab_SegHumi_Temp_Tab5-0x80; /显示读取温度的个位(带小数点的)Seg_ce = 1; Seg_ce = 0;numt0+;break;case 6:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig6; /位选第七位,且同时拉低键盘第二行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0;/扫描
13、键盘第二行switch(KData)case 0xfe:if(range0>20&&flag2=1) range0-;break; /湿度下限减case 0xfd:if(range0<range1&&flag2=1) range1-;break; /湿度上限减case 0xfb:if(range2>0&&flag2=1) range2-;break; /温度下限减case 0xf7:if(range2<range3&&flag2=1) range3-;break; /温度上限减default:break;w
14、hile(KData != 0xff)KData = P0;Key_ce = 1;if(flag2 = 1)P0 = Tab_Segrange3/10; /显示温度上限的十位elseP0 = Tab_SegHumi_Temp_Tab6; /显示读取温度的小数位的十位 Seg_ce = 1; Seg_ce = 0;numt0+;break;case 7:P0 = 0; Seg_ce = 1; Seg_ce = 0;P0 = Tab_Dig7; /位选第八位,且同时拉低键盘第一行 Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0; /扫描键盘第一行switc
15、h(KData)case 0xfe:flag2 = flag2;TR1 = TR1;break; /进入和退出限制调整模式case 0xfd:flag = flag;break; /进行华氏摄氏温度的转换设置case 0xfb: case 0xf7: default:break;while(KData != 0xff)KData = P0;Key_ce = 1;if(flag = 0&&flag2 = 0)P0 = units0; /显示单位Celse if(flag = 1&&flag2 = 0)P0 = units1; /显示单位Felse if(flag2
16、 = 1)P0 = Tab_Segrange3%10; /显示温度上限的个位Seg_ce = 1; Seg_ce = 0;numt0 = 0;break;default:numt0 = 0;break;TR0 = 1;/打开T0 /*/* 定时器T1中断 */*/void T1_timer() interrupt 3TR1 = 0; /关闭T0TH1 = (65536-50000)/256;TL1 = (65536-50000)%256;if(numt1 = 25) getdata(); /采集数据numt1 = 0;elsenumt1+;TR1 = 1; /打开T0#ifndef _DHT1
17、1_h_#define _DHT11_h_#include <REGX52.H>/*/* 引 脚 定 义 */*/sbit DHT_bus = P20;/DHT11数据传输口sbit Key_ce=P13;/按键输出使能sbit Seg_ce=P10; /段选位sbit Dig_ce=P11; /位选位sbit bee = P21;/蜂鸣器控制口/*/* 函 数 声 明 */*/bit start_DHT11(void); /开始void read_DHT11(void); /读取void delay_20us(void); /20us延时void delay_ms(unsigne
18、d char m); /N ms延时bit check_sum(void); /和校验/*/* 宏 定 义 */*/#define HIGH 1#define LOW 0/*/* 变 量 定 义 */*/#define DHT_timeover 5 /高电平维持时间,用于识别“数据0”和“数据1”bit flag2 = 0;/设置调节上下限模式转换标志bit flag=0; /设置摄氏和华氏温度模式转换标志/*/* 结 构 体 */*/struct DHT_data unsigned char DH_H; /湿度整数 unsigned char DH_L; /湿度小数 unsigned cha
19、r T_H; /温度整数 unsigned char T_L; /温度小数 unsigned char Checksum; /校验和DHT_data;#endif#include "DHT11.h"#include <intrins.h>/*/* 开始 DHT11 温湿度计 */* 输入:无 */* 输出:应答标志 0:应答失败 1:应答成功 */*/bit start_DHT11(void) bit DHT_start; DHT_start = 0; DHT_bus = HIGH; DHT_bus = LOW; /拉低18ms以上 delay_ms(18);
20、TR0 = 0; DHT_bus = HIGH; delay_20us(); delay_20us(); /拉高2040us while(!DHT_bus) DHT_start = 1; /DHT应答,DHT拉低80us后拉高80us,然后开始传输数据 /数据(40bit)=8bit湿度整数+8bit湿度小数+8bit温度整数+8bit 温度小数+8bit校验和 while(DHT_bus); return(DHT_start); /应答成功返回1/*/* 读取 DHT11 温湿度计 */* 读取结果存在DHT_data结构体内 */* 输入:无 输出:无 */*/void read_DHT1
21、1(void) unsigned char m,n,timer_dht; unsigned char *p; p=&DHT_data.DH_H; /数据放在DHT_date的结构体中 for(m=0;m<5;m+) for(n=0;n<8;n+) while(DHT_bus); /DHT拉低12-14us表示1bit数据开始 timer_dht=0x00; while(DHT_bus) /随后DHT拉高总线,单片机通过高电 平维持的时间判断“数据0”还是“数据1” /数据0维持2628us高电平,数据1维持116118us高电平 timer_dht+; /由于此处对延时时间的 长度要求很高,所以采用另一种办法判断 if(timer_dht>DHT_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新时代企业财务管理规范问题研究
- 关注历史中的经济政策变迁试题及答案
- 高考面试题目及答案
- 幼儿文学礼仪考试试题及答案
- 德语口译试题及答案
- c语言非选择试题及答案
- 病理操作面试题及答案
- 德国作曲考试题及答案
- 超常心理测试题及答案
- 仓库文员测试题及答案
- 如何提升护理队伍专业素质
- 2025高三一模浦东作文:生活中墙的意义与影响
- IT行业专业试题集范本1
- 国有企业内部审计工作制度
- 2025宿迁辅警考试题库
- 健康生活方式指导手册含饮食、运动
- 2025年森林管护员考试题及答案
- 未成年人学校保护规定的国际比较研究
- 研究院内部科技成果转化的管理流程
- 中考语文试卷名著专题汇编《钢铁是怎样炼成的》文段赏析题(截至2024年)
- 2019建筑排水管道安装塑料管道19S406
评论
0/150
提交评论