|
#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]);
}
}
|
-
捕獲.PNG
(87.43 KB, 下載次數: 28)
下載附件
2018-12-24 23:52 上傳
|