一、整体介绍 实时监测空气中的温度与湿度,测试范围内的距离,在LCD1602液晶显示器上面显示温度湿度,时间,在数码管上面显示距离。 使用了DTH11温湿度模块,LCD1602模块,DS1302模块,HC-SR04超声波模块,蜂鸣器,数码管。 硬件:基于KST-51开发板,芯片是STC89C52RC 软件:keil编译器,stc下载工具 二、项目硬件介绍 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度 湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃。
DS1302模块内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、星期、月、年的信息,每个月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM标志位决定采用24或12小时时间格式
HC-SR04超声波模块: (1)采用IO口TRIG触发测距,给至少10us的高电平信号; (2)模块自动发送8个40khz的方波,自动检测是否有信号返回; (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2; DS1302模块:VCC--à+5v GND--àGND CLK--àP1^7 DAT--àP3^4 RST--àP3^5 HC-SR04超声波模块: VCC--à+5v GND--àGND TRIG--àP2^0 ECHO--àP2^1 DHT11模块: VCC--à+5v GND--àGND OUT--àP3^0 三、软件介绍 DHT11模块: unsigned char DHT11_rec_byte(){ unsigned char i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!Data); ////等待50us低电平过去 DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(Data); //等待数据线拉低 } return dat; }
unsigned char* DHT11_receive(){ unsigned char rec_dat[9]; unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(20); //延时18ms以上 Data=1; DHT11_delay_us(30);
if(Data==0) { while(Data==0); //等待拉高 DHT11_delay_us(40); //拉高后延时80us R_H=DHT11_rec_byte(); //接收湿度高八位 R_L=DHT11_rec_byte(); //接收湿度低八位 T_H=DHT11_rec_byte(); //接收温度高八位 T_L=DHT11_rec_byte(); //接收温度低八位 revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*数据处理,方便显示*/ rec_dat[0]='0'+(RH/10); rec_dat[1]='0'+(RH%10); rec_dat[2]='R'; rec_dat[3]='H'; rec_dat[4]=' '; rec_dat[5]=' '; rec_dat[6]='0'+(TH/10); rec_dat[7]='0'+(TH%10); rec_dat[8]='C'; } return rec_dat; } |
DS1302模块 //用单次写操作向寄存器写入一个字节 void DS1302SingleWrite(unsigned char reg, unsigned char dat) { DS1302_CE = 1; //使能片选信号 DS1302ByteWrite((reg<<1) | 0x80); //发送写寄存器指令 DS1302ByteWrite(dat); //写入字节数据 DS1302_CE = 0; }
//用单次读操作从某一寄存器读取一个字节 unsigned char DS1302SingleRead(unsigned char reg) { unsigned char dat;
DS1302_CE = 1; DS1302ByteWrite((reg<<1) | 0x81); //发送读寄存器指令 dat = DS1302ByteRead(); //读取字节数据 DS1302_CE = 0;
return dat; } |
HC-SR04超声波模块: init_time(); //初始化定时器 flag = 0; //置溢出标志位为0 //控制口发一个10US 以上的高电平 TRIG = 1; delay(3); TRIG = 0; //等待接收端出现高电平 while(!ECHO); TR0 = 1; //启动计时器 开始计时 while(ECHO); //等待高电平结束 TR0 = 0; //关闭低电平
out_TH0 = TH0; //取定时器的值 out_TL0 = TL0; out_TH0 <<= 8; //右移8位 distance = out_TH0 | out_TL0; //合并为16位的值 distance *= 0.017;
if(flag == 1) //如果定时器溢出 则超出超声波测量范围 { display(-1); flag = 0; } else { for(y =5; y >=0; y--)//加此循环只是为了将结果在数码管上停留时间长点便于观察 { display(distance); } } delay(1000);//60ms的周期,这里不是6ms,太多会闪烁。 |
|