矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2988|回复: 10

求一个DHT11+1602的C51程序,谢谢!

[复制链接]
     
发表于 2019-7-25 19:28:40 | 显示全部楼层 |阅读模式
本帖最后由 quiwu 于 2019-7-25 19:33 编辑

这几天在做DHT11的温湿度读出,在网上找了好多程序下载都不能用,请大神赐一个DHT11+1602的C51程序,万分感谢!

#include "reg51.h"
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit DHTIO = P2^0; //管脚定义,DHT11总线输入输出;
sbit LCDRS = P2^6; //管脚定义,1602液晶RS控制端;
sbit LCDWR = P2^5; //管脚定义,1602液晶W/R控制端;
sbit LCDEN = P2^7; //管脚定义,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init(); //声明LCD_Init液晶初始化函数;
void LCD_Display(); //声明LCD_Display液晶显示函数;
void Rec_DHT(); //声明Rec_DHT,DHT11接收数据函数;
//主函数
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延时函数********/
void delay(uchar ms)
{
  uchar i;
  while(ms--)
  {
   for(i=0;i<130;i++);
}
}
/***延时10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}
/********主机发出开始信号*******/
void DHT11_Start() //请结合时序图分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持电平时间大于18ms
DHTIO=1;
delay1(); //延迟等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一个字节数据*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低电平结束
temp=0;
delay1();delay1();delay1();delay1();
if(DHTIO==1)
{
temp=1;
count=2;
while((DHTIO)&&count++);
}
if(count==1) break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
/********DHT11接收数据*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主机发出开始信号
DHTIO=1; //拉高等待DHT11响应
if(!DHTIO) //从机发出响应信号
{
flag = 2;
while((!DHTIO) && flag++);
//判断从机是否发出 80us 的低电平响应信号是否结束
flag = 2;
while(DHTIO && flag++);
//判断从机是否发出 80us 的高电平,若发出则开始采集数据
Tem_Z = receive_data(); //采集湿度整数部分
Tem_X = receive_data(); //采集湿度小数部分
Hum_Z = receive_data(); //采集温度整数部分
Hum_X = receive_data(); //采集温度小数部分
Check = receive_data(); //采集校验位
DHTIO = 1;
}
}
/*******指令码*******/
void write_com(uchar com)
{
com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******数据码*******/
void write_data(uchar date)
{
date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7); //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
LCDRS=1;
LCDEN=0;
delay(2);
LCDEN=1;
P0=date;
delay(2);
LCDEN=0;
}
/*********************/
/********1602液晶显示初始化*******/
void LCD_Init()
{
LCDEN=0; //使能低电平
LCDWR=0;
write_com(0x38); //显示模式设置,设置16*2显示,5*7点阵,8位数据接口
delay(2);
write_com(0x0c); //显示开关及光标设置
delay(2);
write_com(0x06);
delay(2);
write_com(0x01); //清屏
delay(2);
}
/**********1602液晶显示*********/
void LCD_Display()
{
//液晶显示第一行:温度显示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2); //输出温度的十位
write_data(table[(Tem_Z%10)]);delay(2); //输出温度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2); //输出℃
write_data(0x43);delay(2);
//液晶第二行:湿度显示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2); //输出湿度的十位
write_data(table[(Hum_Z%10)]);delay(2); //输出湿度的个位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}

这个程序用的是11.0592的晶振,接线都没有问题,模拟也通过,下载到单片机没有显示,哪位大神请帮我分析分析,谢谢!
     
发表于 2019-7-25 19:30:19 | 显示全部楼层
同样需要一个
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-7-25 19:34:18 | 显示全部楼层

我发了个程序,你能看懂不,下载到单片机运行不了,模拟能过,不知道是哪儿出了问题。
回复 支持 反对

使用道具 举报

     
发表于 2019-7-25 19:36:26 | 显示全部楼层
quiwu 发表于 2019-7-25 19:34
我发了个程序,你能看懂不,下载到单片机运行不了,模拟能过,不知道是哪儿出了问题。

看不懂................
回复 支持 反对

使用道具 举报

     
发表于 2019-7-25 19:48:32 | 显示全部楼层
LCD对比度没调好?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-7-25 20:18:07 | 显示全部楼层
刷新时间 发表于 2019-7-25 19:36
看不懂................

要程序不?
我搞好了

DHT 1602C51文件.rar

23.74 KB, 下载次数: 85

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-7-25 20:44:05 | 显示全部楼层
t3486784401 发表于 2019-7-25 19:48
LCD对比度没调好?

应该跟对比度没有关系吧,看不懂,1602的对比度是一个可调电阻控制的。
回复 支持 反对

使用道具 举报

     
发表于 2019-7-25 21:22:12 | 显示全部楼层
quiwu 发表于 2019-7-25 20:44
应该跟对比度没有关系吧,看不懂,1602的对比度是一个可调电阻控制的。

一看就没调过1602,对比度不正确时也是没显示的
并且这个仿真不来
回复 支持 反对

使用道具 举报

     
发表于 2019-7-25 21:34:24 | 显示全部楼层
quiwu 发表于 2019-7-25 20:18
要程序不?
我搞好了

谢谢 谢谢..
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-7-25 21:39:59 | 显示全部楼层
t3486784401 发表于 2019-7-25 21:22
一看就没调过1602,对比度不正确时也是没显示的
并且这个仿真不来

1602的对比度是电位器控制,跟软件有关的就是使能端和数据端,你说的对比度不正确是指的哪儿,谢谢
回复 支持 反对

使用道具 举报

     
发表于 2019-7-25 22:35:32 | 显示全部楼层
quiwu 发表于 2019-7-25 21:39
1602的对比度是电位器控制,跟软件有关的就是使能端和数据端,你说的对比度不正确是指的哪儿,谢谢

“下载到单片机没有显示”这句话,很可能就是单片机系统板上的电位器没有拧对
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-17 03:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表