#include <reg52.h> #define uint unsigned int #define uchar unsigned char typedef bit BOOL ; sbit io = P1^0 ; sbit rs = P2^4 ; sbit rw = P2^5 ; sbit ep = P2^6 ; uchar data_byte; uchar RH,RL,TH,TL; / ************************************************延時(shí)模塊***************************************************/ void delay(uchar ms) { // 延時(shí)子程序 uchar i ; while(ms--) { for(i = 0 ; i<250;i++) ; } } void delay1()//延時(shí)10us { uchar i; i--; i--; i--; i--; i--; i--; } void longdelay(uchar s) //長(zhǎng)延時(shí) { while(s--) { delay(60) ; } } / ***********************************************LCD模塊********************************************************/ BOOL lcd_bz()//測(cè)試LCD忙碌狀態(tài) { BOOL result ; rs = 0 ; rw = 1 ; ep = 1 ; result = (BOOL)(P0 & 0x80) ; ep = 0 ; return result ; } void write_cmd(uchar cmd)// 寫(xiě)指令 { while(lcd_bz()) ; rs = 0 ; rw = 0 ; ep = 0 ; P0 = cmd ; ep = 1 ; ep = 0 ; } void write_addr(uchar addr)//寫(xiě)地址 { write_cmd(addr|0x80) ; } void write_byte(uchar dat)//寫(xiě)字節(jié) { while(lcd_bz()) ; rs = 1 ; rw = 0 ; ep = 0 ; P0 = dat ; ep = 1 ; ep = 0 ; } void lcd_init()// 初始化 { write_cmd(0x38) ; delay(1); write_cmd(0x08) ; delay(1); write_cmd(0x01) ; delay(1); write_cmd(0x06) ; delay(1); write_cmd(0x0c) ; delay(1); } void display(uchar addr, uchar q)//在某一地址上顯示一字節(jié) { delay(10) ; write_addr(addr) ; write_byte(q) ; longdelay(2) ; } / ************************************************ DHT11測(cè)試模塊***********************************************/ void start()//開(kāi)始信號(hào) { io=1; delay1(); io=0; delay(20);//>18ms io=1; delay1();//20-40us delay1(); delay1(); delay1(); delay1(); } uchar receive_byte()//接收一個(gè)字節(jié) { uchar i,temp,count; for(i=0;i<8;i++) { count=2; while((!io)&&count++)//等待50us低電平結(jié)束 temp=0; delay1();delay1();delay1();delay1(); if(io==1)temp=1; count=2; while((io)&&count++); if(count==1)break; data_byte<<=1; data_byte|=temp; } return data_byte; } void receive()//接收數(shù)據(jù) { uchar T_H,T_L,R_H,R_L,check,num_check; uchar count; start();//開(kāi)始信號(hào) io=1; if(!io)//讀取DHT11響應(yīng)信號(hào) { count=2; while((!io)&&count++);//DHT11高電平80us是否結(jié)束 count=2; while((io)&&count++); R_H=receive_byte(); R_L=receive_byte(); T_H=receive_byte(); T_L=receive_byte(); check=receive_byte(); io=0;//拉低延時(shí)50us delay1();delay1();delay1();delay1();delay1(); io=1; num_check=R_H+R_L+T_H+T_L; if(num_check=check) { RH=R_H; RL=R_L; TH=T_H; TL=T_L; check=num_check; } } } /******* *************************************************主函數(shù)****/ void main() { lcd_init(); delay(10); while(1) { receive(); delay(100); display(0x00,'R') ; display(0x01,':'); display(0x02,RH/10+0x30); display(0x03,RH%10+0x30); display(0x04,'%'); display(0x40,'T') ; display(0x41,':'); display(0x42,TH/10+0x30); display(0x43,TH%10+0x30); display(0x44,0xdf); display(0x45,0x43); } }/**********************************************/