久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6969|回復: 11
打印 上一主題 下一主題
收起左側

51單片機DHT11溫濕度監測在LCD1602上顯示,沒有顯示數據 一直就是0 求大佬指點

  [復制鏈接]
跳轉到指定樓層
樓主
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>

typedef bit BOOL  ;

sbit io = P1^1 ;//(口線定義)
sbit bee= P1^0 ;
sbit rs = P2^5 ;
sbit rw = P2^6 ;
sbit ep = P2^7 ;
sbit led =P1^5 ;
bit flag_300ms ;

sbit K1=P1^2;
sbit K2=P1^3;
sbit K3=P1^4;

uchar yemian=0;//(定義變量)
uchar flat=1;
uchar data_byte;
uchar RH,RL,TH,TL;
uchar WenDu,ShiDu;//報警的溫度和濕度
uchar value;


/****************************延時程序****************************/
void delay(uchar ms)
{       //   延時子程序
         uchar i ;
         while(ms--)
         {
                  for(i = 0 ; i<120;i++) ;
         }
}

void delay1()//延時10us                       
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}


/********************報警程序部分*******************/
void warn()  //報警函數
{
         
        if(TH>WenDu)  //檢測的溫度高于設定溫度報警值
                                             
     {
      bee=0;                                      //報警
          led=0;delay(10);led=~led;                         //燈快閃爍               
     }      
                 
        if(RH>ShiDu)  //檢測的濕度高于設定濕度報警值
                                             
     {
      bee=0;                                      //報警
          led=0;delay(10);led=~led;                         //燈快閃爍
     }      

                 
        if( TH<WenDu  &&  RH<ShiDu )         
     {
                  bee=1;                              //停止報警
                  led=1;                              //停止閃爍
         }
                 

}

/************************LCD模塊******************************************/

BOOL lcd_bz()//測試LCD忙碌狀態
{      
         uchar temp ;
         rs = 0 ;
         rw = 1 ;
        _nop_();
          P0=0xff;
        _nop_();
        ep=1;
         temp=P0;
       _nop_();
         ep = 0 ;
         return (temp&0x80);
}

void write_cmd(uchar cmd)// 寫指令
{      
        while(lcd_bz()) ;
        rs = 0 ;
        rw = 0 ;
        _nop_();
        ep = 0 ;
        P0 = cmd ;
        _nop_();
        ep = 1 ;
       _nop_();
       _nop_();
        ep = 0 ;
       _nop_();
        _nop_();
}

void write_addr(uchar addr)//寫地址
{      
        write_cmd(addr|0x80) ;
}

void write_byte(uchar dat)//寫字節
{      
        while(lcd_bz()) ;
          rs = 1 ;
          rw = 0 ;
       _nop_();
          ep = 0 ;
          P0 = dat ;
       _nop_();
          ep = 1 ;
       _nop_();
       _nop_();
          ep = 0 ;
       _nop_();
       _nop_();
}

void lcd_init()// 初始化
{        delay(10);
         write_cmd(0x38) ;
         delay(5);
         write_cmd(0x08) ;  
         delay(5);
         write_cmd(0x01) ;
         delay(1);
         write_cmd(0x06) ;
         delay(1);
         write_cmd(0x0c) ;
         delay(1);
}

void display(uchar addr, uchar q)//在某一地址上顯示一字節
{          
         delay(1) ;
         write_addr(addr) ;
     write_byte(q) ;
         delay(1) ;
         
}

/*********************** DHT11測試模塊***************************************/

void start()//開始信號
{
        io=1;
        _nop_();
        _nop_();
        io=0;
        delay(18);//>18ms
        io=1;
        delay1();//20-40us
        delay1();
        delay1();
        delay1();
}
uchar receive_byte()//接收一個字節
{
        uchar i;
        for(i=0;i<8;i++)
        {       
            data_byte<<=1;                                                                //循環左移
                while(!io);                                                                   //每發送一位數據間隔50us低電平
                delay1();delay1();delay1();delay1();          //延遲40us
                if(io==1)
                {
                  data_byte=data_byte|0x01;
                  while(io);
                }
                else
                {
                 data_byte=data_byte|0x00;
                }
        }
        return data_byte;
}
void receive()//接收數據
{
        uchar T_H,T_L,R_H,R_L,check;
        start();//開始信號
        io=1;
        if(!io)//讀取DHT11響應信號
        {
    while(io==0) ;                                     //判斷輸出低電平
    while( io==1) ;                                                         //判斷輸出高電平
        R_H=receive_byte();       
        R_L=receive_byte();
        T_H=receive_byte();
        T_L=receive_byte();
        check=receive_byte();
        io=0;                                
        delay1();delay1();delay1();delay1();delay1(); //拉低延時50us
        io=1;
        if(R_H+R_L+T_H+T_L==check)                        //矯正
        {
                RH=R_H;
                RL=R_L;
                TH=T_H;
                TL=T_L;
        }
        }
}


//void showw()   // 問候語函數
//{      
//           lcd_init(); //初始化
//           delay(10);
//       
//           display(0x01,'I');
//       display(0x02,' ');
//           display(0x03,'a');
//           display(0x04,'m');
//           display(0x05,' ');
//           display(0x06,'s');
//       display(0x07,'u');
//           display(0x08,'p');
//           display(0x09,'e');
//           display(0x0a,'r');
//           display(0x0b,'m');
//       display(0x0c,'a');
//           display(0x0d,'n');
//           display(0x0e,'!');
//           delay(250); //短暫延時
//           delay(250);
//           delay(250);
//           delay(250);
//          
//}
          
/*************定時器0初始化程序***************/
void time_init()          
{
        TMOD = 0X01;          //定時器0、定時器1工作方式1
        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時
        EA   = 1;                   //開總中斷
}



void caidan() //按鍵程序 選擇菜單模式
{

          if(!K1)
                   {  
                          delay(20);
                            if(!K1)
                         {   
                                                    while(!K1)
                                             ;
                                                          yemian++;
                                                          flat++;
                                                                if(yemian>=3)
                                                                {
                                                                 yemian=0;
                                                                }
                                                               
                 }
                   }

       
       
}


shezhi()  //對里面的數值進行修改
{
    if(!K2)
                   {  
                          delay(50);
                            if(!K2)
                         {   
                                                         if(yemian==1)
                                                         {
                                                          WenDu+=1;
                                                          if(WenDu>99)  WenDu=99;   //濕度上限加
                                                         }
                                                         
                                                         if(yemian==2)
                                                         {
                                                          ShiDu+=1;
                                                          if(ShiDu>99)  ShiDu=99;   //濕度下限加
                                                         }
                                                                
                 }
                   }
                         
                          if(!K3)
                        {  
                             delay(50);
                             if(!K3)
                          {   
                                                           if(yemian==1)
                                                             {
                                                              WenDu-=1;          //濕度下限減
                                                                  if(WenDu<1) WenDu=1;  
                                                             }
                                                         
                                                           if(yemian==2)
                                                             {
                                                              ShiDu-=1;         //濕度下限減
                                                                  if(ShiDu<1) ShiDu=1;  
                                                             }               
                 }
                   }

}



/***************************主程序*********************************/
void main()
{
//        start();
   time_init();                                //初始化定時器
//   showw();    //顯示問候語 和名字
   WenDu=40;
   ShiDu=60;
   value=0;

        while(1)
        {   
                   caidan();
                //====================yemian==0時 進入工作狀態=================================

                         if(yemian==0)  
                        {
                                if(flat==1)
                                 {
                  flat=0;
                                  lcd_init(); //初始化
                                                  
                                  display(0x00,'T') ;    //Temp
                          display(0x01,'e');
                          display(0x02,'m');
                                  display(0x03,'p');
                  display(0x04,':');
                                         
                                  display(0x08,0xdf);    // 度
                          display(0x09,'C');
                                         
                                         
                                  display(0x40,'H') ;    //Humi
                          display(0x41,'u');
                          display(0x42,'m');
                                  display(0x43,'i');
                  display(0x44,':');
                                         
                              display(0x47,'%');
                                  display(0x48,'R');
                                  display(0x49,'H');
                                         
                                  display(0x0c,'T');
                  display(0x0d,':');
                  display(0x0e,WenDu/10+0x30);  //溫度報警
                          display(0x0f,WenDu%10+0x30);
                                  
                                  display(0x4c,'H');
                  display(0x4d,':');
                                  display(0x4e,ShiDu/10+0x30);  //濕度報警
                          display(0x4f,ShiDu%10+0x30);

          }
                       
                         if(flag_300ms == 1)
                     {       
                         
                  

                             flag_300ms = 0;
                 receive();
                                         
                                 display(0x05,(TH)/10+0x30);  //溫度顯示
                         display(0x06,(TL)%10+0x30);
                                 
                 display(0x45,RH/10+0x30);    //濕度顯示
                         display(0x46,RL%10+0x30);
                                         
                                 warn();
                     }
                       
        }               
                       
        //====================yemian==1 溫度設置===========================
                                if(yemian==1)  //溫度
                            {
                         if(flat==1)
                                     {
                             flat=0;  
                                                         bee=1;
                             lcd_init(); //初始化
                                                         display(0x06,'T');
                                                         display(0x07,'e');
                                                         display(0x08,'m');
                                                         display(0x09,'p');
                     }
                                                 
                                        shezhi();
                                        display(0x47,WenDu/10+0x30);  //溫度顯示
                            display(0x48,WenDu%10+0x30);
                        }
                          
                //====================yemian==1濕度設置==========================       
                                if(yemian==2)   //濕度設置
                            {
                         if(flat==1)
                                     {
                          flat=0;  
                                                  bee=1;
                          lcd_init(); //初始化
                                                  display(0x06,'H');
                                                  display(0x07,'u');
                                                  display(0x08,'m');
                                                  display(0x09,'i');
                                     }
                                        shezhi();
                                        display(0x47,ShiDu/10+0x30);  //濕度顯示
                            display(0x48,ShiDu%10+0x30);
                         }
        }
}



/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{       
        static uchar value;
        TH0 = (65535-50000)/256;
        TL0 = (65535-50000)%256;     // 50ms
        value++;
        if(value % 6 == 0)
        {   
                flag_300ms = 1;                 //300ms
                value = 0;
        }
}


捕獲.PNG (51.76 KB, 下載次數: 37)

捕獲.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:96682 發表于 2019-11-24 17:40 來自手機 | 只看該作者
這仿真圖電路不全,功能受限
回復

使用道具 舉報

板凳
ID:584814 發表于 2019-11-24 21:16 | 只看該作者
換個18B20(這個程序太成熟也好找)上去如果出數就是DHT11模塊部分程序問題或仿真不支持。
回復

使用道具 舉報

地板
ID:419968 發表于 2019-11-24 23:55 | 只看該作者
應該還是時序不對,
回復

使用道具 舉報

5#
ID:589227 發表于 2019-12-10 10:35 來自手機 | 只看該作者
樓主解決了么?我也遇到這個問題。。
回復

使用道具 舉報

6#
ID:526695 發表于 2019-12-11 10:27 | 只看該作者
這個程序 我試了,與不能用,與上面的說一樣
回復

使用道具 舉報

7#
ID:247881 發表于 2020-4-21 15:47 | 只看該作者
數據線要上拉,你可以試試在讀的時候先寫1,或者直接10k上拉就好
回復

使用道具 舉報

8#
ID:719294 發表于 2020-4-25 13:43 | 只看該作者
延時函數的問題,時間不對,改了就好了
回復

使用道具 舉報

9#
ID:719294 發表于 2020-4-25 13:43 | 只看該作者
延時函數時間不對
回復

使用道具 舉報

10#
ID:515664 發表于 2020-4-25 19:55 | 只看該作者
https://pan.baidu.com/s/1nlEqX685XKrC5Z3T4nMGag 提取碼:sn42
用這個例程里的驅動試試 感覺是你的延遲問題
回復

使用道具 舉報

11#
ID:937792 發表于 2021-6-25 22:37 | 只看該作者
應該是電路連接的問題,我是能顯示的,雖然度數不正常
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91 在线| va在线| 日韩欧美一区二区三区免费观看 | 国产精品一区二区三区在线播放 | 久色视频在线观看 | 国产污视频在线 | 日本精品久久久久久久 | 国产成人小视频 | 久久五月婷 | 黄色网一级片 | 国产精品一区视频 | 亚洲欧美精品在线观看 | 亚洲精品毛片av | 超碰在线人人干 | 亚洲精品九九 | 亚洲免费精品 | 亚洲一区二区免费视频 | 操视频网站 | 国产欧美久久一区二区三区 | 激情网站在线观看 | 一级免费毛片 | 国产一区二区三区免费观看在线 | 成人二区 | 欧美国产亚洲一区二区 | 国产午夜精品一区二区三区嫩草 | 亚洲精品一 | 99re6在线视频 | 成人黄在线观看 | 国产aaaaav久久久一区二区 | 亚洲欧洲成人av每日更新 | 色成人免费网站 | 成人国产精品一级毛片视频毛片 | 91高清视频在线观看 | 成人黄色三级毛片 | 在线色| 免费看的黄网站 | 综合五月婷 | 欧美成人精品一区二区三区 | 黄视频网站在线 | 毛片网站在线观看 | 精品国产欧美 |