|
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code seg[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
sbit date=P3^7;
sbit lcd_rs=P1^0;
sbit lcd_rw=P1^1;
sbit lcd_en=P1^2;
sbit led=P1^4;
uchar RH,RL,TH,TL,check;
void delayms(uint m) //@12.000MHz
{
unsigned char i, j;
while(m--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void delayus(uint n) //@12.000MHz
{
while(n--)
_nop_();
}
void write_com(uint com)//lcd1602写命令函数
{
lcd_rs=0;
P2=com;
delayms(2);
lcd_en=1;
delayms(2);
lcd_en=0;
}
void write_date(uint date)//lcd1602写数据函数
{
lcd_rs=1;
P2=date;
delayms(2);
lcd_en=1;
delayms(2);
lcd_en=0;
}
void init()//lcd1602初始化,设置显示方式
{
lcd_rw=0;
lcd_en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
uchar recive_byte(void)//一个字节接受函数
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
//while(date);//等待DHT11拉低.输出的数据总是从低电平开始的
while(date==0);//等待DHT11拉高
delayus(40);
dat=dat<<1;
if(date==1)
{
dat=dat+1;
}
while(date);//等待高电平结束
led=0;
}
//led=0;
return dat; //将接受到的数据返回
}
void read_DHT11()
{
delayms(5000);//调试用,将此函数放入主循环,实现5S执行一次
//发送起始信号
date= 0;
delayms(20);
date= 1;
while(date);//这里是等待DHT11将总线拉低
while(date==0);//等待DHT11拉高总线
while(date);//等待数据拉低,然后可以接受数据
//开始接收数据
RH= recive_byte();
RL= recive_byte();
TH= recive_byte();
TL= recive_byte();
check= recive_byte();
//接收 DHT11 输出的结束信号
delayus(54);//延迟后,总线会是高电平。实际上这个高电平是由DHT11输出的
}
void main()
{
init();
//delayms(1000) ;//开机等待1秒
while(1)
{
read_DHT11();
write_com(0x80);
write_date('T');
write_date('E');
write_date('M');
write_date('P');
write_com(0x80+0x05);
write_date(seg[RH/10]);
write_date(seg[RH%10]);
write_date('.');
write_date(seg[RL%10]);
}
}
|
|