|
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit RW=P1^1;
sbit lcdrs=P1^0; //液晶數據命令選擇端
sbit lcden=P2^5; //液晶使能端
sbit Data=P2^0;
unsigned char code table[ ]={"0123456789"};
unsigned char code table1[]={"humi :"};
unsigned char code table2[]={"temp :"};
uchar i;
int RH,TH,n;
void delay_us(uchar n)
{
while(--n);
}
void delay_ms(uint z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
RW=0;
P0=com;
delay_ms(5);
lcden=1;
delay_ms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1; //選擇寫數據模式
RW=0;
P0=date;
delay_ms(5);
lcden=1;
delay_ms(5); ////此處是在液晶顯示出一個字符時稍作延時,以此保持數據穩定
lcden=0;
}
void lcd_init() //LCD初始化函數 *
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void lcd_xianshi() //LCD顯示固定字符函數 *
{
write_com(0x80);
for(i=0;i<6;i++)
write_data(table1);
write_com(0x80+0x08);
write_data('%');
write_com(0x80+0x40);
for(i=0;i<6;i++)
write_data(table2);
write_com(0x80+0x48);
write_data('^');
write_data('C');
}
void DHT11_start()
{
Data=1;
delay_us(2);
Data=0;
delay_ms(20); //延時18ms以上
Data=1;
delay_us(30);
}
uchar DHT11_rec_byte() //接收一個字節
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位數據
{
while(!Data); ////等待50us低電平過去
delay_us(8); //延時60us,如果還為高則數據為1,否則為0
dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
if(Data==1) //數據為1時,使dat加1來接收數據1
dat+=1;
while(Data); //等待數據線拉低
}
return dat;
}
void DHT11_receive() //接收40位的數據
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
uint ge,shi,ge1,shi1;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
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(); //接收校正位
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;
}
shi=RH/10;
ge=RH%10;
shi1=TH/10;
ge1=TH%10;
write_com(0x80+0x06);
write_data(table[shi+1]);
write_data(table[ge+1]);
write_com(0x80+0x46);
write_data(table[shi1+1]);
write_data(table[ge1+1]);
}
}
void main()
{
lcd_init();
while(1)
{
lcd_xianshi();
delay_ms(1500);
DHT11_rec_byte();
DHT11_receive();
delay_ms(60);
}
}
|
|