哈哈,楼主你问对人了,我正巧也做这个
#include #define uint unsigned int #define uchar unsigned char uchar DHT11[5],RTflag=0; uchar FLAG; //超时标志位 uchar a;
***it dat=P1^0; ***it RS=P2^0; ***it RW=P2^1; ***it EN=P2^2; uchar table[5]; uint wd,sd; void Delay_t(uint j) { uchar i; for(;j>0;j--) { for(i=0;i<27;i++); } } void Delay_10us(void) //10us延时函数 { uchar i; i--; i--; i--; i--; i--; i--; } void delay(uint z)//1毫秒延时函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void lcd_write_com(uchar com) //1602写指令 { RS=0; RW=0; EN=1; P0=com; delay(1); EN=0; } void lcd_init() //1602初始化 { lcd_write_com(0x38); delay(1); lcd_write_com(0x08); delay(1); lcd_write_com(0x01);//1602清屏指令 delay(1); lcd_write_com(0x06); delay(1); lcd_write_com(0x0C); delay(1); } void lcd_write_data(uchar date)//1602写数据 { RS=1; RW=0; EN=1; P0=date; delay(1); EN=0; } void write_str(uchar x,uchar y,uchar *s)//在任意地址写符号字母或数字 { if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); while(*s) { lcd_write_data(*s); s++; } } void write_shu(uchar x,uchar y,uchar num)//数据显示函数 { uchar s,g; if(y==0) lcd_write_com(0x80+x); else lcd_write_com(0xc0+x); s=num/10;// 数据分离显示 lcd_write_data(0x30+s); g=num%10;//数据分离显示 lcd_write_data(0x30+g); } uchar write_byte1() //读一个字节 { uchar i,comdata,temp1; for(i=0;i<8;i++) { FLAG=2; while((!dat)&&FLAG++);//判断数据位是0还是1 Delay_10us(); Delay_10us(); Delay_10us(); temp1=0; if(dat)temp1=1; // 如果高电平高过预定0高电平值则数据位为 1 FLAG=2; while((dat)&&FLAG++);//flag先与后加1 如果dat一直为1 uchar型变量 flag 溢出变为0 再自加1 if(FLAG==1)break; //超时则跳出for循环 comdata<<=1;//左移一位 高位在前 低位在后 comdata|=temp1; } return (comdata); } void DHT11_5() //读5个字节数据 两个字节为温度数据 两个字节为湿度数据 最后一个字节为校验 { uchar i,temp; //主机拉低18ms dat=0; Delay_t(180); dat=1; //总线由上拉电阻拉高 主机延时20us Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); //主机设为输入 判断从机响应信号 dat=1; //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!dat) //T ! { FLAG=2; //超时标志位 while((!dat)&&FLAG++);//判断从机是否发出 80us 的低电平响应信号是否结束 FLAG=2; while((dat)&&FLAG++); //判断从机拉高80us是否结束 for(i=0;i<5;i++)//数据接收状态 { DHT11[i]=write_byte1(); } dat=1; //释放数据总线 为下一次读取做好准备 temp=(DHT11[0]+DHT11[1]+DHT11[2]+DHT11[3]); if(temp==DHT11[4]) //数据校验 { RTflag=1; } if(RTflag==1) //如果RTflag=1 说明读取到得数据正确 { RTflag=0; // tm[0]=DATARHT[0]/10; // tm[1]=DATARHT[0]%10; // tm[2]=DATARHT[1]/10; //湿度 // tm[3]=DATARHT[2]/10; // tm[4]=DATARHT[2]%10; // tm[5]=DATARHT[3]/10; //温度 write_str(0,0,"measurement ");//第一行显示湿度 write_shu(12,0,DHT11[0]); write_str(14,0,"RH"); write_str(0,1,"Temperature ");//第二行为显示温度 write_shu(12,1,DHT11[2]); write_str(14,1,"^C"); } } } void main() { lcd_init(); //1602初始化 delay(1000); //等待DHT11温湿度传感器数据稳定 开始激活DHT11 while(1)//循环读取 并更新数据显示 { delay(1000);//等待DHT11温湿度传感器数据稳定 开始激活DHT11 write_byte1();//读一个字节 DHT11_5(); //读数据 delay(1000); //延时等待 }
|
|
2016-5-19 23:50:39
评论
举报
|
|
|