标题:
DHT11温湿度检测+时钟 51单片机源码
[打印本页]
作者:
uncle_drew
时间:
2017-3-23 11:28
标题:
DHT11温湿度检测+时钟 51单片机源码
帮别人做了个毕设,顺便把资料分享一下把,可以实现DHT11温湿度检测以及电子时钟在LCD1602上的显示,时钟可以调整分,时,日,月四项,有需要的可以自己加入年的调整
0.png
(43.44 KB, 下载次数: 101)
下载附件
2017-3-23 19:16 上传
#include<reg52.h>
#include<intrins.h> //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL;
uchar data_byte;
uchar RH,RL,TH,TL;
uchar deda=0;
uchar hour=0,min=0,sec=0,date=1,month=3,year=17;
//uchar string[]="WeiHongmouzhizuo";
uchar string2[]="0123456789";//要显示的字符串
sbit DHT11=P1^0; //DHT11数据位
sbit RS=P2^5; //寄存器选择位
sbit RW=P2^6; //读写选择位
sbit E=P2^7; //使能信号位
sbit BF=P0^7; //忙碌标志位
sbit k4=P2^4; //调整时间
sbit k3=P2^3;
sbit k2=P2^2;
sbit k1=P2^1;
//const uchar string1[ ]={" mazirong "};
//const uchar string2[ ]={"TEL:13297961386 "};
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
//*********************延时1ms
void delay(uchar z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
//*********************延时10us
void delay1()
{
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//******************走时函数
void init_timer()
{
TMOD=0x01;
TH0=-(4800/256);
TL0=-(4800%256);
IE=0x82;
TR0=1;
}
////用延时函数代替检测STA7状态的函数
void check()
{
uint a;
for(a=0;a<1200;a++);
}
//**************各月份天数
/*void inter_month()
{
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:if(date==32)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
};
break;//若是大月,则有31天
case4:
case6:
case9:
case11:if(date==31)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
};
break;//若是小月,则有30天
case2:if(year%4==0)
{
if(date==30)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
}
}//闰年二月有29天
else
if(date==29)
{
date=1;
month++;
if(month==13)
{
month=1;
year++;
}
};//平年二月28天
break;
default:break;
}
}
*/
//*******************时间、日期走时单元
void conv()
{
if(sec==60)
{
min++;
sec=0;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
date++;
//inter_month();
if(month==13)
{
year++;
month=1;
if(year==100)year=0;
}
}
}
}
}
//*********************50ms定时中断
void T0_srv(void)interrupt 1
{
TH0=-(50000/256);
TL0=-(50000%256);
deda++;
if(deda==20)
{
sec++;
deda=0;
conv();
}
}
//****************时间调整函数
void set_time()
{
if(!k4)//min
{
delay(20);
if(!k4)
{
min++;
if(min==61)
{
min=0;
}
}
}
if(!k3)//hour
{
delay(20);
if(!k3)
{
hour++;
if(hour==25)
{
hour=0;
}
}
}
if(!k2)//date
{
delay(20);
if(!k2)
{
date++;
if(date==32)
{
date=1;
}
}
}
if(!k1)//month
{
delay(20);
if(!k1)
{
month++;
if(month==13)
{
month=1;
}
}
}
}
//测试忙碌状态
uchar lcd_bz()
{
bit result;
RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1; //E=1,才允许读写
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
result=BF; //将忙碌标志电平赋给result
E=0;
return result;
}
//********************写指令
void write_cmd(uchar cmd)
{
check();
//while(lcd_bz()==1);
RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0; //E置低电平(写指令时,E为高脉冲)
_nop_();
_nop_(); // 就是让E从0到1发生正跳变,所以应先置"0"
P0=cmd; //将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();
E=1; //E置高电平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四个机器周期,给硬件反应时间
E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
//*********************写地址
void write_addr(uchar addr)
{
write_cmd(addr|0x80);
}
//*********************写数据
void write_byte(uchar dat)
{
check();
//while(lcd_bz()==1);
RS=1; //RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0; //(写指令时,E为高脉冲)
// 就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();
P0=dat; //将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();
E=1; //E置高电平
_nop_();
_nop_();
…………余下代码请下载附件…………
复制代码
下载:
温度显示.rar
(2.75 KB, 下载次数: 61)
2017-3-23 11:27 上传
点击文件名下载附件
c代码
下载积分: 黑币 -5
作者:
smile123
时间:
2017-5-13 16:07
下载显示都是00怎么回事啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1