专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
求一个DHT11温湿度传感器用LCD1602液晶显示的C程序,谢谢大家!
2019-07-15 15:12
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
2860
15
1697
求一个DHT11温湿度传感器用LCD1602液晶显示的C程序,显示的温湿度在LCD液晶显示最后几位,如图(在附件里)。哪位大神会写程序,发我QQ上面
823952664@qq.com
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
夜行者灬
2019-07-16 17:08
哈哈,楼主你问对人了,我正巧也做这个
#include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar DHT11[5],RTflag=0; uchar FLAG; //超时标志位 uchar a;
sbit dat=P1^0; sbit RS=P2^0; sbit RW=P2^1; sbit 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); //延时等待 }
加载中...
查看其它15个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include<reg52.h> #define uint unsigned int #define uchar unsigned char uchar DHT11[5],RTflag=0; uchar FLAG; //超时标志位 uchar a;
sbit dat=P1^0; sbit RS=P2^0; sbit RW=P2^1; sbit 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); //延时等待 }
一周热门 更多>