//51单片机控制温湿度传感器DHT11然后在LCD1602上显示当前的温湿度及单位其中湿度在第一行显示温度在第二行显示。单片机为YL-9最小系统。
# include <reg51.h>
# include <intrins.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define uint unsigned int
#define uchar unsigned char
sbit buz=P2^3;
sbit io=P2^4;//dht11data端接单片机的P1^0口//
sbit WE = P2^7;//数码管位选段选用于关闭数码管显示
sbit DU = P2^6;
sbit led1=P1^0;
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit rw=P3^6;//一下三行是设置lcd1602的使能端//
sbit rs=P3^5;
sbit ep=P3^4;
typedef bit BOOL;//此声明一个布尔型变量即真或假//
uchar data_byte;
uchar RH,RL,TH,TL;
uchar DR=50,DT=30;
//***************延时函数*************************************
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;
}
}
}
uchar key_data=1;
static char key_status_flag=0,i=0;
static char key_value1=0;
uchar key_i=0,key_k=0; //选择 翻页
void key_gain()
{
char key_value=0;
if(key0==0)key_value = 1;
if(key1==0)key_value = 2;
// if(key2==0)key_value = 3; //加减不需要消抖
// if(key3==0)key_value = 4;
if(key_status_flag==0)
{
if(key_value!=0)
{
key_value1=key_value;
if(i==1) //消抖
{
key_status_flag=1;
key_value1=key_value;
}
i++;
}
else
{
i=0;
key_value1=0;
}
}
if(key_status_flag==1)
{
if(key_value==0)
{
i--;
if(i==0)
{
key_status_flag=0;
key_data=key_value1;
key_value1=0;
}
}
else i=2;
}
}
//*****************************************************************************
uchar change=0;
void main()//主函数模块//
{
DU = 0;
WE = 0;//关闭数码管显示
lcd_init();//初始化LCD
TMOD=01;
TH0=-50000/256; //一个机器周期1/12M *12=10-6=1us 这里是0.05s 50ms进一次定时中断
TL0=-50000%256;
EA=1; //开总总断
ET0=1; //开定时中断
TR0=1; //开定时器计数
while(1)
{
switch(change)
{
case 0: 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(0X05,' ');
/*display(0x40,' ');//LCD的第二行显示
display(0x41,' ');
display(0x42,' ');
display(0x43,' ');
display(0x44,' ');//以下两个是温度单位的处理
display(0x45,' '); */
led1=0;
break;
case 1: display(0x00,'T');//LCD的第二行显示
display(0x01,':');
display(0x02,TH/10+0x30);
display(0x03,TH%10+0x30);
display(0x04,0xdf);//以下两个是温度单位的处理
display(0x05,0x43);
led1=1;
break;
default:break;
}
switch(key_data)
{
case 1:
display(0x07,'=');//LCD的第一行显示
display(0x08,'>');//LCD的第一行显示
display(0x47,' ');
display(0x48,' ');
if(key2==0)DR++;
else if(key3==0)DR--;
break;
case 2:
display(0x07,' ');//LCD的第一行显示
display(0x08,' ');//LCD的第一行显示
display(0x47,'=');
display(0x48,'>');
if(key2==0)DT++;
else if(key3==0)DT--;
break;
default:break;
}
if(DR>80) buz=0;
else buz=1;
if(DT>40||DT<10) buz=0;
else buz=1;
display(0x09,'D');//期望湿度
display(0x0A,'R');
display(0x0B,':');
display(0x0C,DR/10+0x30);
display(0x0D,DR%10+0x30);
display(0X0E,'%');
display(0x49,'D');//期望温度
display(0x4A,'T');
display(0x4B,':');
display(0x4C,DT/10+0x30);
display(0x4D,DT%10+0x30);
display(0x4E,0xdf);
display(0x4F,0x43);
display(0x40,key_data+0x30);
}
}
uchar count;
uchar count2;
/*****************中断服务函数*********
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于51的温湿度监测.rar (51个子文件)
基于51的温湿度监测
proteus仿真
Last Loaded 用1602LCD与DS18B20设计的温度报警器.pdsbak 18KB
用1602LCD与DS18B20设计的温度报警器.pdsprj.DESKTOP-GAV4J6A.LHY.workspace 328B
用1602LCD与DS18B20设计的温度报警器 - 副本.pdsprj.LAPTOP-J3VSH0PE.Liang Shihong.workspace 2KB
Last Loaded 用1602LCD与DS18B20设计的温度报警器 - 副本.pdsbak 19KB
Last Loaded 用1602LCD与DS18B20设计的温度报警器.fv8.14.pdsbak 19KB
用1602LCD与DS18B20设计的温度报警器.pdsprj 19KB
用1602LCD与DS18B20设计的温度报警器.pdsprj.LAPTOP-J3VSH0PE.Liang Shihong.workspace 2KB
Backup Of 用1602LCD与DS18B20设计的温度报警器.pdsbak 18KB
用1602LCD与DS18B20设计的温度报警器.pdsprj.LAPTOP-LTF3UK4S.73816.workspace 2KB
DHT11 51测试程序 LCD1602显示 - 副本 -加蜂鸣器
Lesson1.M51 20KB
Lesson1.build_log.htm 1KB
Lesson1_uvopt.bak 55KB
STARTUP.LST 14KB
Lesson1.OBJ 17KB
Lesson1.uvproj 14KB
STARTUP.A51 6KB
Lesson1.uvgui.Administrator 69KB
Lesson1.uvgui.73816 88KB
Lesson1.uvopt 6KB
Lesson1.plg 4KB
Lesson1.LST 17KB
Lesson1.hex 3KB
Lesson1.c 8KB
STARTUP.OBJ 749B
Lesson1 16KB
Lesson1.uvgui.Liang Shihong 69KB
Lesson1_uvproj.bak 14KB
Lesson1.lnp 62B
AD原理图PCB
rh_show.SchDoc 165KB
__Previews
rh_show.SchDocPreview 67KB
rh.PcbDocPreview 50KB
Project Outputs for rh_show
Design Rule Check - rh.drc 713B
__Previews
Design Rule Check - rh.drcPreview 34KB
Design Rule Check - rh.html 8KB
rh_show.PrjPCB 38KB
rh.PcbDoc.htm 6KB
Project Logs for rh_show
rh PCB ECO 2019-6-17 13-02-06.LOG 21KB
rh_show SCH ECO 2019-6-16 22-33-37.LOG 2KB
rh.PcbDoc 2.93MB
rh_show.SCHLIB 73KB
rh_show.IntLib 3.25MB
rh_show.PrjPCBStructure 49B
用到的图片
QQ截图20190618192544.jpg 104KB
QQ截图20190618192434.jpg 146KB
QQ截图20190618191104.jpg 148KB
IMG20190619162307.jpg 2.62MB
IMG20190619153855.jpg 3.27MB
IMG20190619153904.jpg 3.5MB
QQ截图20190618192524.jpg 144KB
QQ截图20190618192614.jpg 150KB
QQ截图20190618192601.jpg 118KB
共 51 条
- 1
资源评论
honyounli
- 粉丝: 95
- 资源: 187
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功