【嵌入式】51单片机+1602+dht11显示温湿度
51单片机+1602+dht11显示温湿度例程代码如下:
/*****************************************************************联系:请勿转载!
**功能描述:1602显示 dht11温度湿度
**管脚说明:显示器1602管脚RS_P2.4,RW_P2.5,EN_P2.6 排口P0dht11管脚date_P2.7 蜂鸣器P2^3 加湿器继电器控制端_P2^2
**更新时间:2019/4/16****************************************************************/# include <reg51.h> //头文件不需做修改
# include <intrins.h>typedef unsigned char BYTE; //定义部分
typedef unsigned int WORD;
#define uint unsigned int
#define uchar unsigned char sbit beep=P2^3; //蜂鸣器
sbit hd=P2^2; //继电器控制端
sbit io=P2^7; //dht11data端接单片机的P2.7口
sbit rw=P2^5; //一下三行是设置lcd1602的使能端
sbit rs=P2^4;
sbit ep=P2^6; typedef bit BOOL; //此声明一个布尔型变量即真或假// uchar data_byte; //定义部分
uchar RH,RL,TH,TL; //***************延时函数************************************* void delay(uchar ms) //毫秒延时模块//
{ uchar i; while(ms--) for(i=0;i<100;i++);
} void delay1() //一个for循环大概需要8个多机器周期,一个机器周期为1us,晶振为12MHz,本函数延时8us
{ uchar i; for(i=0;i<1;i++);
} //***************************************************************
//lcd模块//
BOOL lcd_bz()//测试lcd忙碌状态返回值为布尔型数值真或假'1'.'0'
{ BOOL result;rs=0; // 读忙信号rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0&0x80);ep=0;result ;
} void write_cmd(uchar cmd)//写指令//
{ while (lcd_bz());rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd ;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;
}
void write_addr(uchar addr)//写地址//
{ write_cmd(addr|0x80);//LCD第一行的首地址为0x80第二行的首地址为0x80+0x40=0xc0
}
void write_byte(uchar dat) //写字节//
{ while (lcd_bz());rs=1;rw=0;ep=0;_nop_();_nop_();P0=dat ;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;
}
void lcd_init() //lcd初始化//
{ write_cmd(0x38);//设置LCD两行显示一个数据由5*7点阵表示,数据由8跟线传输 delay(1); write_cmd(0x0c);//清除屏幕显示 delay(1); write_cmd(0x06);//设定输入方式增量不移位 delay(1); write_cmd(0x01);//开整体显示关光标不闪烁 delay(1);
}
void display(uchar addr,uchar q)//在某一地址上显示内容adder表示的是地址偏移量q表示显示的字符或数字//
{ delay(10); write_addr(addr); write_byte(q); delay(1);//修改此时间可以改变LCD上数值跳变的数度
} //**************************dht11测试模块*************************************// void start()//开始信号
{ io=1; delay1(); io=0; delay(25);// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号 io=1; //发送开始信号结束后拉高电平延时20-40us delay1();//以下三个延时函数差不多为24us符合要求 delay1(); delay1();
}
uchar receive_byte()//接收一个字节//
{ uchar i,temp; for(i=0;i<8;i++)//接收8bit的数据 { while(!io);//等待50us的低电平开始信号结束 delay1();//开始信号结束之后延时26us-28us以下三个延时函数 delay1(); delay1(); temp=0;//时间为26us-28us表示接收的为数据'0' if(io==1) temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1' while(io);//等待数据信号高电平'0'为26us-28us'1'为70us data_byte<<=1;//接收的数据为高位在前右移 data_byte|=temp; } return data_byte;
}
void receive()//接收数据//
{ uchar T_H,T_L,R_H,R_L,check,num_check,i; start();//开始信号// io=1; //主机设为输入判断从机DHT11响应信号 if(!io)//判断从机是否有低电平响应信号// { while(!io);//判断从机发出 80us 的低电平响应信号是否结束// while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态 R_H=receive_byte();//湿度高位 R_L=receive_byte();//湿度低位 T_H=receive_byte();//温度高位 T_L=receive_byte();//温度低位 check=receive_byte();//校验位 io=0; //当最后一bit数据接完毕后从机拉低电平50us// for(i=0;i<7;i++)//差不多50us的延时 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; } }
}
//**************功能函数******************************************************
void dis_t_h() //扫描显示温度湿度数据
{receive();//接收数据 display(0x00,'R');//LCD的第一行显示 display(0x01,':'); display(0x02,RH/10+0x30); //0x30表示带字库的LCD1602中0x30的位置放有数字0RH/10+0x30即表示湿度的十位数字在字库RH/10+0x30的位置处放着 display(0x03,RH%10+0x30); display(0X04,'%'); display(0x40,'T');//LCD的第二行显示 display(0x41,':'); display(0x42,TH/10+0x30); display(0x43,TH%10+0x30); display(0x44,0xdf);//以下两个是温度单位的处理 display(0x45,0x43);
}
void deep_alarm()
{int i;for(i=0;i<3;i++){beep=0;delay(500);beep=1;delay(500);}
}
//*****************************************************************************void main()//主函数模块//
{ lcd_init();//初始化LCD beep=0; //关闭继电器和蜂鸣器hd=1;while(1) { dis_t_h();}
}
【嵌入式】51单片机+1602+dht11显示温湿度相关推荐
- 基于51单片机的LCD1602显示温湿度
51单片机基础难点知识理解后,直接通过下面3个小项目可以更好理解51单片机.中断 定时器 串口甚至是基础的IO输入输出都有结合,再加上一些外设模块的学习(如1602显示屏,L298N电机驱动等) 项目 ...
- 基于51单片机1602温度显示时钟
基于51单片机LCD1602温度显示时钟 要在1602上显示时间和温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 :时间显示可以用时钟芯片DS1302,但是此次我 ...
- 【无标题】基于51单片机和DHT11的温湿度检测系统
基于51单片机的温湿度检测系统 摘 要:设计一款能够实时检测当前空气温度和湿度的装置.主控芯片采用STC12C5A60S2芯片,温湿度传感器采用DHT11数字温湿度传感器,显示屏幕采用OLED屏幕.整 ...
- 51单片机控制DHT11温湿度传感器,并使用OLED屏幕显示
目录 前言 一.MCU主控选型 二.DHT11温湿度传感器 1.模块介绍 2.软件实现 DHT11.c DHT11.h 三.OLED显示屏 1.模块介绍 2.软件实现 OLED.c OLED.h OL ...
- ADC0832测电阻原理及51单片机1602显示
前言:今天中午和高中老同学一起吃了个饭,同学计算机专业代码大佬,问起我有没有CSDN,我说有些时候会在上面看一些程序,他随即向我说起了他已经在CSDN上发表了很多文章目前排名一万多,因为我学集成电路专 ...
- 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...
基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...
- 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键
电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键 这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS130 ...
- 基于51单片机LCD1602温度显示(DS18B20测温)
基于51单片机DS18B20测温 要在1602上显示温度先要了解1602是如何显示的.详情可以参考我之前的文章基于51单片机1602显示 DS18B20是美国DALLAS半导体公司推出的第一片支持&q ...
- 51单片机 外部时钟_基于51单片机的LCD12864显示模拟时钟
今天要分享的仿真和程序是基于51单片机的LCD12864显示模拟时钟.公众号之前也分享过数字时钟,但是那些时钟都是采用数字显示的形式来显示时间,而今天分享一个采用LCD12864显示的模拟指针式时钟. ...
最新文章
- CNN模型 INT8 量化实现方式(一)
- pythonis啥意思-isinstance在python中的意思是什么?
- seo优化源码_seo按天计费系统,无需登陆批量查询关键词价格
- 边框border属性总结
- 云原生应用程序运行时 Kyma 简介
- Java泛型中的子类型化
- 在python中使用zookeeper管理你的应用集群
- 安装JavaFX Scene Builder 到Eclipse
- 常见排序算法之选择排序
- PHP聚合直播盒子网站源码聚合全网直播
- UNIX网络编程的5种IO模型
- 对抗机器学习——Min Max模型(Towards Deep Learning Models Resistant to Adversarial Attacks)
- hbase+phoenix开发预演小例子
- Python 合并两个或多个pdf文件(获取pdf文件指定页)
- 高中生自我评语 高中毕业生自我鉴定
- Springboot毕设项目基于Vue和Springboot的会议室管理系统hbb9kjava+VUE+Mybatis+Maven+Mysql+sprnig)
- pcl::compute3DCentroid()计算质心算法原理
- MySQL 数据库存储引擎
- php采集网页 alpha版
- Linux进程和计划任务的管理