標題: 51單片機 用LCD1602顯示DHT11采集的溫濕度,實物可以顯示溫度但是仿真顯示不出來 [打印本頁]

作者: lzycf    時間: 2020-3-31 16:13
標題: 51單片機 用LCD1602顯示DHT11采集的溫濕度,實物可以顯示溫度但是仿真顯示不出來

#include <reg52.h>

#define LCD1602_DB  P0
sbit LCD1602_RS = P1^2;
sbit LCD1602_RW = P1^3;
sbit LCD1602_E  = P1^1;

/* 等待液晶準備好 */
void LcdWaitReady()
{
    unsigned char sta;

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //讀取狀態(tài)字
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7等于1表示液晶正忙,重復檢測直到其等于0為止
}
/* 向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 設置顯示RAM起始地址,亦即光標位置,(x,y)-對應屏幕上的字符坐標 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;

    if (y == 0)  //由輸入的屏幕坐標計算顯示RAM的地址
        addr = 0x00 + x;  //第一行字符地址從0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址從0x40起始
    LcdWriteCmd(addr | 0x80);  //設置RAM地址
}
/* 在液晶上顯示字符串,(x,y)-對應屏幕上的起始坐標,str-字符串指針 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str)
{
    LcdSetCursor(x, y);   //設置起始地址
    while (*str != '\0')  //連續(xù)寫入字符串數(shù)據(jù),直到檢測到結(jié)束符
    {
        LcdWriteDat(*str++);
    }
}
/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2顯示,5*7點陣,8位數(shù)據(jù)接口
    LcdWriteCmd(0x0C);  //顯示器開,光標關(guān)閉
    LcdWriteCmd(0x06);  //文字不動,地址自動+1
    LcdWriteCmd(0x01);  //清屏
}
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P1^0;   
uchar rec_dat[13]="123695669999";
extern void InitLcd1602();
uchar showset[16]="12369566999999";
int wendu=0;
int shidu=0;

sbit shezhi=P2^0;
sbit jia=P2^1;
sbit jian=P2^2;
sbit beep=P3^7;

int wendul=5;
int wenduh=30;
int shidul=30;
int shiduh=60;
int change=0;
uchar key_can;         //按鍵值
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void DHT11_delay_us(uchar n)
{
    while(--n);
}

void DHT11_delay_ms(uint z)
{
   uint i,j;
   for(i=z;i>0;i--)
      for(j=110;j>0;j--);
}

void DHT11_start()
{
   Data=1;
   DHT11_delay_us(2);
   Data=0;
   DHT11_delay_ms(20);   
   Data=1;
   DHT11_delay_us(30);
}

uchar DHT11_rec_byte()   
{
   uchar i,dat=0;
  for(i=0;i<8;i++)   
   {         
      while(!Data);   
      DHT11_delay_us(8);   
      dat<<=1;         
      if(Data==1)   
         dat+=1;
      while(Data);      
    }  
    return dat;
}

void DHT11_receive()   
{
    uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
    DHT11_start();
    if(Data==0)
    {
        while(Data==0);   //等待數(shù)據(jù)   
        DHT11_delay_us(40);  //延時80us
        R_H=DHT11_rec_byte();    //濕度高位  
        R_L=DHT11_rec_byte();    //濕度低位  
        T_H=DHT11_rec_byte();    //溫度高位
        T_L=DHT11_rec_byte();    //溫度低位
        revise=DHT11_rec_byte(); //獲取數(shù)據(jù)

        DHT11_delay_us(25);    //延時

        if((R_H+R_L+T_H+T_L)==revise)      //校驗
        {
            RH=R_H;
            RL=R_L;
            TH=T_H;
            TL=T_L;
        }
        /*數(shù)據(jù)分解*0-9*/
                                
//        rec_dat[0]='0'+(RH/10);
//        rec_dat[1]='0'+(RH%10);
//        rec_dat[2]='R';
//        rec_dat[3]='H';
//        rec_dat[4]=' ';
//        rec_dat[5]=' ';
//        rec_dat[6]='0'+(TH/10);
//        rec_dat[7]='0'+(TH%10);
//        rec_dat[8]='C';
                                shidu=RH;
                                wendu=TH;
                                rec_dat[0]='H';
                                rec_dat[1]=':';
                                rec_dat[2]='0'+(RH/10);
        rec_dat[3]='0'+(RH%10);
        rec_dat[4]='R';
        rec_dat[5]='H';
        rec_dat[6]=' ';
        rec_dat[7]=' ';
                                
                                rec_dat[8]='T';
                                rec_dat[9]=':';
        rec_dat[10]='0'+(TH/10);
        rec_dat[11]='0'+(TH%10);
        rec_dat[12]='C';
    }
}


void main()
{   
   InitLcd1602();   //1602初始化
   while(1)
   {   
       DHT11_delay_ms(500);    //DHT11初始1S延時1500
       DHT11_receive();
                  
                         if(shezhi==0)
                         {
                                 DHT11_delay_ms(2);
                                 if(shezhi==0)
                                {
                                         change++;
                                  if(change>3)
                                  {
                                         change=0;
                                         
                                  }
                                       
                                  }
                          }
                                
                                if(change==0)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         shidul++;
                                                        if(shidul>99)
                                                        {
                                                         shidul=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         shidul--;
                                                        if(shidul<0)
                                                        {
                                                         shidul=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                if(change==1)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         shiduh++;
                                                        if(shiduh>99)
                                                        {
                                                         shiduh=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         shiduh--;
                                                        if(shiduh<0)
                                                        {
                                                         shiduh=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                
                                
                                if(change==2)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         wendul++;
                                                        if(wendul>99)
                                                        {
                                                         wendul=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         wendul--;
                                                        if(wendul<0)
                                                        {
                                                         wendul=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
                                
                                if(change==3)
                                {
                                        if(jia==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jia==0)
                                    {
                                                         wenduh++;
                                                        if(wenduh>99)
                                                        {
                                                         wenduh=99;
                                                         
                                                        }
                                       
                                    }
                             }
                                         
                                         if(jian==0)
                                        {
                                                DHT11_delay_ms(2);
                                    if(jian==0)
                                    {
                                                         wenduh--;
                                                        if(wenduh<0)
                                                        {
                                                         wenduh=0;
                                                         
                                                        }
                                       
                                    }
                             }

                                }
        
                    showset[0]='L';
                                showset[1]=':';
                                showset[2]='0'+(shidul/10);
        showset[3]='0'+(shidul%10);
                 
                    showset[4]='H';
                                showset[5]=':';
                                showset[6]='0'+(shiduh/10);
        showset[7]='0'+(shiduh%10);
                 
                                showset[8]='L';
                                showset[9]=':';
        showset[10]='0'+(wendul/10);
        showset[11]='0'+(wendul%10);
              showset[12]='L';
                                showset[13]=':';
        showset[14]='0'+(wenduh/10);
        showset[15]='0'+(wenduh%10);
                                
                                if((shidu< shidul )|| (shidu>shiduh))
                                {
                                        beep=0;
                                       
                                }
                                else if((wendu< wendul )|| (wendu>wenduh))
                                {
                                        beep=0;
                                }
                                else
                                {
                                        beep=1;
                                }
                  LcdShowStr(0,1,showset);  //顯示溫濕度設置   
                        LcdShowStr(0,0,rec_dat);  //顯示溫濕度                     
   }
}




作者: 384749736    時間: 2020-4-1 14:40
為什么我的proteus沒有DHT11
作者: 384749736    時間: 2020-4-1 14:41
為什么我的Proteus沒有DHT11這個傳感器
作者: man1234567    時間: 2020-4-1 19:07
這程序拔掉DHT11試試
作者: 張力力    時間: 2020-4-2 15:14
只接一個LCD試試,有沒有顯示,沒顯示可能就是LCD部分的程序問題
作者: 布靈布靈    時間: 2020-4-4 01:47
384749736 發(fā)表于 2020-4-1 14:40
為什么我的proteus沒有DHT11

用8.9試試

作者: 嗯嗯呢嗯    時間: 2020-5-7 18:23
剛好學習了謝謝樓主
作者: swustlx86    時間: 2020-5-7 22:05
多半是時序問題吧
作者: bobo233    時間: 2020-5-8 00:40
while(Data==0);   //等待數(shù)據(jù)    ,可能會死循環(huán)在DTH11程序中。在這個while中寫一個超時跳出等待的語句
作者: 青果兒    時間: 2020-5-8 08:48
會不會是仿真哪里出錯了?你檢查一下仿真
作者: TTQ001    時間: 2020-5-8 08:49
通常說的是真實電路有效,但模擬可能無效。非常奇怪
作者: lovezjf234    時間: 2020-5-8 09:03
仿真和實際有差異,參考下網(wǎng)上的LCD1602顯示程序
作者: macvwp48716    時間: 2020-5-8 09:21
可以直接在keil跑片上仿真,也可以看變量值
作者: Jacy_蘇    時間: 2020-5-15 01:02
按鍵功能都實現(xiàn)不了!
作者: babyguo666    時間: 2020-5-15 09:23
選擇實物類的比較簡單
作者: Demon_han    時間: 2020-5-17 10:15
為什么我單片機燒進去程序不行啊,難過
作者: 嗯嗯呢嗯    時間: 2020-5-17 12:32
按鍵模塊好像有問題
作者: w254489035    時間: 2020-5-20 13:22
應該是protues軟件支持兼容性不好,建議用最新的版本
作者: lqqqqqqqq    時間: 2020-6-16 13:28
樓主解決了嗎?是時序問題嗎?該怎么調(diào)呢?
作者: daocheng    時間: 2020-6-16 14:10
bobo233 發(fā)表于 2020-5-8 00:40
while(Data==0);   //等待數(shù)據(jù)    ,可能會死循環(huán)在DTH11程序中。在這個while中寫一個超時跳出等待的語句

我同意你的觀點,不知樓主解決了沒有
作者: daocheng    時間: 2020-6-16 14:13
唉,仿真就是這樣,總會出現(xiàn)各種各樣的問題,很讓人摸不到頭腦,(我發(fā)現(xiàn)大部分24小時必答的問題都是關(guān)于仿真的)這大概就是仿真程序需要完善的地方了
作者: 魏海龍    時間: 2020-7-7 12:06
看看是不是時鐘的問題  比如你的實物用的是11.0592Mhz 你的仿真用的是12Mhz 可能結(jié)果就不一樣。傳感器對延時要求是很高的、
作者: juncedz    時間: 2020-7-7 21:48
按鍵仿真  電平不正常,,LCD仿真能夠顯示  ,有時候不顯示,真的莫名其妙
作者: juncedz    時間: 2020-7-7 23:49


可以顯示,按鍵不靈活

作者: zcm119    時間: 2020-7-8 10:22
單片機要設置參數(shù)

作者: 欣語寶貝    時間: 2020-7-8 12:27
我的1602就是顯示不了解
作者: whwteng    時間: 2020-7-8 17:24
斷點仿真看時序,直接明了

作者: 梁廷明    時間: 2020-7-12 07:13
時序問題,應該開在等著忙時序,數(shù)據(jù)沒能讀回來
作者: 小灰灰灰灰    時間: 2022-5-22 16:49
樓主 我也是一樣的問題  接線仿真都一樣 實物可以 仿真數(shù)據(jù)在液晶上面讀不了
作者: lkc8210    時間: 2022-5-23 13:18
小灰灰灰灰 發(fā)表于 2022-5-22 16:49
樓主 我也是一樣的問題  接線仿真都一樣 實物可以 仿真數(shù)據(jù)在液晶上面讀不了

部份版本的Protues LCD1602仿真不支援查忙 于是你的程序在while (sta & 0x80);中死循環(huán)了

作者: 愛拉屎    時間: 2023-4-20 10:46
檢查一下仿真的電路有沒有連錯
作者: 宇落星辰    時間: 2023-11-20 19:55
試了,不行啊
作者: 12345去    時間: 2024-11-29 17:20
可不以用在DHT11控制步進電機上
作者: 12345去    時間: 2024-11-29 17:21
實物可以顯示溫度但是仿真顯示不出來,是不是參數(shù)設置問題
作者: zpwgf    時間: 2024-12-2 09:11
可以先排除一下硬件是否一致,仿真和實物還是有差距的。其次把溫濕度傳感器拔了,看看能否顯示。最后在主循環(huán)里只寫顯示函數(shù),比如顯示數(shù)字什么的。這樣會很快排查到問題在哪。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1