微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 基于单片机的dht11湿度温度检测不显示问题

基于单片机的dht11湿度温度检测不显示问题

时间:10-02 整理:3721RD 点击:

用stc90c516rd+烧写该程序,在开发板上实验,lcd1602显示屏上不会显示温度和湿度,怎么回事啊
,是程序问题还是所用芯片不对呀,求助。(该程序是在网上找的)

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
typedef bit BOOL  ;
sbit io = P2^0 ;
sbit rs = P2^7;
sbit rw = P2^6 ;
sbit ep = P2^5 ;
uchar data_byte;
uchar RH,RL,TH,TL;
/**************延时模块***************/
void delay(uchar ms)
{       // 延时子程序
         uchar i ;
         while(ms--)
         {
                  for(i = 0 ; i<250;i++) ;
         }
}
void delay1()//延时10us
{
        uchar i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
void longdelay(uchar s) //长延时
{
         while(s--)
         {
                  delay(60) ;
         }
}
/************LCD模块************/
BOOL lcd_bz()//测试LCD忙碌状态
{      
         BOOL result ;
         rs = 0 ;
         rw = 1 ;
         ep = 1 ;
         result = (BOOL)(P1 & 0x80) ;
         ep = 0 ;
         return result ;
}
void write_cmd(uchar cmd)// 写指令
{      
        while(lcd_bz()) ;
        rs = 0 ;
        rw =0 ;
        ep = 0 ;
        P1 = cmd ;
        ep = 1 ;
        ep = 0 ;  
}
void write_addr(uchar addr)//写地址
{      
        write_cmd(addr|0x80) ;
}
void write_byte(uchar dat)//写字节
{      
        while(lcd_bz()) ;
          rs = 1 ;
          rw = 0 ;
          ep = 0 ;
          P1 = dat ;
          ep = 1 ;
          ep = 0 ;
}
void lcd_init()// 初始化
{      
         write_cmd(0x38) ;
         delay(1);
         write_cmd(0x08) ;  
         delay(1);
         write_cmd(0x01) ;
         delay(1);
         write_cmd(0x06) ;
         delay(1);
         write_cmd(0x0c) ;
         delay(1);
}
void display(uchar addr, uchar q)//在某一地址上显示一字节
{          
         delay(10) ;
         write_addr(addr) ;
     write_byte(q) ;
         longdelay(2) ;
}
/************DHT11测试模块************/
void start()//开始信号
{
        io=1;
        delay1();
        io=0;
        delay(20);//>18ms
        io=1;
        delay1();//20-40us
        delay1();
        delay1();
        delay1();
        delay1();
}
uchar receive_byte()//接收一个字节
{
        uchar i,temp,count;
        for(i=0;i<8;i++)
        {
                count=2;
                while((!io)&&count++)//等待50us低电平结束
                temp=0;
                delay1();delay1();delay1();delay1();
                if(io==1)temp=1;
                count=2;
                while((io)&&count++);
                if(count==1)break;
                data_byte<<=1;       
                data_byte|=temp;
        }
        return data_byte;
}
void receive()//接收数据
{
        uchar T_H,T_L,R_H,R_L,check,num_check;
        uchar count;
        start();//开始信号
        io=1;
        if(!io)//读取DHT11响应信号
        {
        count=2;
        while((!io)&&count++);//DHT11高电平80us是否结束
        count=2;
        while((io)&&count++);
        R_H=receive_byte();
        R_L=receive_byte();
        T_H=receive_byte();
        T_L=receive_byte();
        check=receive_byte();
        io=0;              //拉低延时50us
        delay1();delay1();delay1();delay1();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 main()
{
        lcd_init();
        delay(10);
        while(1)
        {
                 receive();
                 delay(100);
                 display(0x00,'R') ;
                 display(0x01,':');
                 display(0x02,RH/10+0x30);
                 display(0x03,RH%10+0x30);
                 display(0x04,'%');
                 display(0x40,'T') ;
                 display(0x41,':');
                 display(0x42,TH/10+0x30);
                 display(0x43,TH%10+0x30);
                 display(0x44,0xdf);
                 display(0x45,0x43);
               
        }
}
/************结束************/

亲测可用

#include<reg52.h>
#include <intrins.h>
//
#define uchar unsigned char       
#define uint unsigned int
uchar busy;                             //12864判忙标志
uchar a=0;
uchar key1num=0;
uchar dis0[]={"12345678"};
uchar dis1[]={"12 45   "};
/*端口定义*/
/*定义12864液晶屏数据线------------------------------------------------------*/
sbit LCM_CS  = P1^0;   //模式位,为0输入指令,为1输入数据
sbit LCM_RW  = P1^1;   //读写位,为0读,为1写
sbit LCM_EN  = P1^2;   //使能位
sbit LCM_POS  = P1^3;   
#define Lcd_data P0     //LCM12864数据总线
sbit  p33= P3^7;  //温度数据线,这里使用的是51单片机P37,根据个人情况修改
                                                                                       
/*延时程序-------------------------------------------------------------------*/
//延时函数 1MS/次
void delayms(uint xms)
{
           uint i,j;
        for(i=xms;i>0;i--)             
            for(j=114;j>0;j--);
}
/*12864液晶显示屏并口驱动程序------------------------------------------------*/
//检查忙位(底层)
void chk_busy()
{
        do
        {
                LCM_EN=0;                                                                        //发送LCD是否忙查询指令
                LCM_RW=1;
                LCM_CS=0;
                LCM_EN=1;
                busy=Lcd_data;                                                                //获得数据
                LCM_EN=0;   
                delayms(1);
        } while(busy&&0x80==1);                                                //如果忙则继续等待
}

//写指令到LCD(底层)
void write_com(uchar cmdcode)
{
        LCM_CS=0;
        LCM_RW=0;
        LCM_EN=1;
        Lcd_data=cmdcode;
        delayms(5);
        LCM_EN=0;
        delayms(5);
}
//写数据到LCD(底层)
void write_data(uchar Dispdata)
{         
        chk_busy();
        LCM_CS=1;
        LCM_RW=0;
        LCM_EN=1;
        Lcd_data=Dispdata;
        delayms(5);
        LCM_EN=0;
        delayms(5);
}
/*set position*/
void lcd_pos(uchar X,uchar Y)
{
        uchar pos;
        if(X==0)
        {
                X=0x80;
        }
        else if(X==1)
        {
                X=0x90;
        }
        else if(X==2)
        {
                X=0x88;
        }       
        else if(X==3)
        {
                X=0x98;
        }
        pos=X+Y;
        write_com(pos);//diaplay the address
}

typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
typedef unsigned int   U16;      /* defined for unsigned 16-bits integer variable           无符号16位整型变量 */


U8  U8FLAG;  
U8  U8temp;
U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8  U8comdata;

void Delay(U16 j) //100us延时
{      
        U8 i;
        for(;j>0;j--)
        {        
        for(i=0;i<27;i++);
        }
}
void  Delay_10us(void)        //进入函数3us
{
        U8 i;           //1us
        i--;           //1us
        i--;
        i--;
        i--;
        i--;
        i--;
}
       
void  COM(void)        //串行读一个字节数据
{
        U8 i;
        for(i=0;i<8;i++)       
        {
                U8FLAG=2;       
                while((!p33)&&U8FLAG++);//自加254次 默认执行下面程序 50us低电平结束判断
                Delay_10us();
                Delay_10us();
                Delay_10us();
                U8temp=0;          //判断数据位是0还是1         如果高电平高过预定0高电平值则数据位为 1
                if(p33)U8temp=1;
                U8FLAG=2;
                while((p33)&&U8FLAG++);           //等待0/1高电平信号结束
                //超时则跳出for循环                  
                // if(U8FLAG==1)break;                        //经历255us 在这里不会执行                    
                U8comdata<<=1;
                U8comdata|=U8temp;        
        }
}
void RH(void)
{
  //主机拉低18ms
   p33=0;
   Delay(180);
   p33=1;
//总线由上拉电阻拉高 主机延时20us
   Delay_10us();
   Delay_10us();
   Delay_10us();
   Delay_10us();
//主机设为输入 判断从机响应信号
   p33=1;
//判断从机是否有低电平响应信号 如不响应则不读数据,响应则向下运行          
   if(!p33) //p20==0往下执行          
   {
   U8FLAG=2;
//判断从机发出 80us 的低电平响应信号是否结束         
   while((!p33)&&U8FLAG++);  //强制低电平信号最长为254us
   U8FLAG=2;
  //判断从机发出 80us 的高电平,如发出则进入数据接收状态
   while((p33)&&U8FLAG++);
//数据接收状态                 
   COM();
   U8RH_data_H_temp=U8comdata;
   COM();
   U8RH_data_L_temp=U8comdata;
   COM();
   U8T_data_H_temp=U8comdata;
   COM();
   U8T_data_L_temp=U8comdata;
   COM();
   U8checkdata_temp=U8comdata;
   p33=1;
//数据校验

   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
    if(U8temp==U8checkdata_temp)
     {
             U8RH_data_H=U8RH_data_H_temp;
             U8RH_data_L=U8RH_data_L_temp;  //低八位为0
          U8T_data_H=U8T_data_H_temp;
             U8T_data_L=U8T_data_L_temp;    //低八位为0
             U8checkdata=U8checkdata_temp;
     }
   }
}
//初始化LCD屏(被调用层)
void lcd_init()
{
        LCM_POS=1;        //bingkoufangshi
        write_com(0x30);  //选择8bit数据流
        delayms(5);
        write_com(0x0c);  //开显示(无游标、不反白)
        delayms(5);
        write_com(0x01);  //清除显示,并且设定地址指针为00H
        delayms(5);
}
void main()
{
        uchar i;
        lcd_init();    //initiate the LCD
        i=0;
/*        while(1)
        {
                getDHT11();       
                chuli();       
                fenjie();
                lcd_pos(0,0);
                for(i=0;i<8;i++)
                {
                        write_data(dis1[i]);
                }
        }*/
        Delay(20000);
        while(1)
        {  
                RH();                //调用温湿度读取子程序
        //        display2(U8RH_data_H/10%10,U8RH_data_H%10,U8T_data_H/10%10,U8T_data_H%10);
                lcd_pos(0,0);
                for(i=0;i<8;i++)
                {
                        write_data(dis0[i]);
                }
                dis1[0]=U8RH_data_H/10%10+0x30;
                dis1[1]=U8RH_data_H%10+0x30;
                dis1[3]=U8T_data_H/10%10+0x30;
                dis1[4]=U8T_data_H%10+0x30;
                lcd_pos(1,0);
                for(i=0;i<8;i++)
                {
                        write_data(dis1[i]);
                }
        }
}

如果是lcd1602屏,你那个程序能不能用的啊?不行的话要怎么改动啊?

只需要改相应的显示函数部分  其他都一样

我试一试看、、、、、、、、、、、、

可以呀,如果你把对应的IO口改对就可以显示了,看的时候注意下背光

不能正常变化啊、!

这个测量温湿度的程序是对的吗

上一篇:AD转换/蜂鸣器
下一篇:+flash的读写

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top