找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6375|回复: 8
收起左侧

单片机DHT11温湿度1602程序显示问题

[复制链接]
ID:66729 发表于 2015-10-25 22:45 | 显示全部楼层 |阅读模式
找了个程序下到单片机,开机结果没有温湿度显示出来。显示出来的是这样子。。不知什么原因??
程序如下:
#include "reg52.h"
#define uchar unsigned char  //宏定义
#define uint unsigned int
sbit   DHTIO = P1^1;   //管脚定义,DHT11总线输入输出;
sbit  LCDRS = P2^3;   //管脚定义,1602液晶RS控制端;
sbit  LCDWR = P2^4;  //管脚定义,1602液晶W/R控制端;
sbit   LCDEN = P2^5;   //管脚定义,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<250;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);
}
  程序编译没问题,否则无法生成HEX文件的。。。
IMG_20151025_222510.jpg
回复

使用道具 举报

ID:1 发表于 2015-10-25 23:10 来自手机 | 显示全部楼层
应该是程序和你的实际电路不对
回复

使用道具 举报

ID:66729 发表于 2015-10-26 10:41 来自手机 | 显示全部楼层
在开发板上面试机的,接口都调整过了
回复

使用道具 举报

ID:91165 发表于 2015-10-26 14:45 | 显示全部楼层
看看实际接线有没有不通的,我就遇到1根线不通
回复

使用道具 举报

ID:91424 发表于 2015-10-26 17:56 | 显示全部楼层
如果是在开发板上,多半是程序的问题,有的地方延时需要长一点,测忙程序也容容易出错
回复

使用道具 举报

ID:66729 发表于 2015-10-26 20:48 来自手机 | 显示全部楼层
换了另外1个程序就正常了。。。
回复

使用道具 举报

ID:107177 发表于 2016-5-31 18:21 | 显示全部楼层
nojiya88 发表于 2015-10-26 20:48
换了另外1个程序就正常了。。。

楼主找到什么原因了吗!我也试了这个程序,一样的结果,没有找到原因。楼主解决了能不能跟小弟分享一下什么原因?
回复

使用道具 举报

ID:193152 发表于 2017-5-3 15:52 | 显示全部楼层
端口不对吧
回复

使用道具 举报

ID:193152 发表于 2017-5-3 15:53 | 显示全部楼层
端口不对吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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