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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3745|回復: 4
上一主題 下一主題
收起左側

基于51單片機的dht11和MQ-2模塊通過lcd顯示遇到的問題

[復制鏈接]
跳轉到指定樓層
樓主
本人剛入門,遇到問題希望得到各位大佬解答!
我想讓液晶屏第一行顯示設定的溫度,濕度,煙霧,第二行顯示分別測得的溫度,濕度,煙霧
但是一直確顯示的是這玩意....
我想顯示的是這樣


下面是代碼(借鑒的):
#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^6 ;
sbit rw = P2^5 ;
sbit ep = P2^7 ;
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,y;
uchar WenDu,ShiDu,yanwu=50;//報警的溫度和濕度和煙霧
#include "eeprom52.h"

/******************ADC0832相關函數******************/
sbit ADCS         =P3^0; //ADC0832 片選
sbit ADCLK  =P3^1; //ADC0832 時鐘
sbit ADDI         =P3^2; //ADC0832 數據輸入                /*因為單片機的管腳是雙向的,且ADC0832的數據輸入輸出不同時進行,
sbit ADDO         =P3^2; //ADC0832 數據輸出                /*為節省單片機引腳,簡化電路所以輸入輸出連接在同一個引腳上
//========================================================================
// 函數: unsigned int Adc0832(unsigned char channel)
// 應用:                 temp=Adc0832(0);
// 描述: 讀取0通道的AD值
// 參數: channel:通道0和通道1選擇
// 返回: 選取通道的AD值
// 版本: VER1.0
// 日期: 2015-05-29
// 備注:
//========================================================================
unsigned int Adc0832(unsigned char channel)
{
        uchar i=0;
        uchar j;
        uint dat=0;
        uchar ndat=0;
        uchar  Vot=0;

        if(channel==0)channel=2;
        if(channel==1)channel=3;
        ADDI=1;
        _nop_();
        _nop_();
        ADCS=0;//拉低CS端
        _nop_();
        _nop_();
        ADCLK=1;//拉高CLK端
        _nop_();
        _nop_();
        ADCLK=0;//拉低CLK端,形成下降沿1
        _nop_();
        _nop_();
        ADCLK=1;//拉高CLK端
        ADDI=channel&0x1;
        _nop_();
        _nop_();
        ADCLK=0;//拉低CLK端,形成下降沿2
        _nop_();
        _nop_();
        ADCLK=1;//拉高CLK端
        ADDI=(channel>>1)&0x1;
        _nop_();
        _nop_();
        ADCLK=0;//拉低CLK端,形成下降沿3
        ADDI=1;//控制命令結束
        _nop_();
        _nop_();
        dat=0;
        for(i=0;i<8;i++)
        {
                dat|=ADDO;//收數據
                ADCLK=1;
                _nop_();
                _nop_();
                ADCLK=0;//形成一次時鐘脈沖
                _nop_();
                _nop_();
                dat<<=1;
                if(i==7)dat|=ADDO;
        }
        for(i=0;i<8;i++)
        {
                j=0;
                j=j|ADDO;//收數據
                ADCLK=1;
                _nop_();
                _nop_();
                ADCLK=0;//形成一次時鐘脈沖
                _nop_();
                _nop_();
                j=j<<7;
                ndat=ndat|j;
                if(i<7)ndat>>=1;
        }
        ADCS=1;//拉低CS端
        ADCLK=0;//拉低CLK端
        ADDO=1;//拉高數據端,回到初始狀態
        dat<<=8;
        dat|=ndat;

        return(dat);            //return ad data
}
/****************************延時程序****************************/
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(20) ;
         }
}



/******************把數據保存到單片機內部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
         byte_write(0x2000, WenDu);
        byte_write(0x2001, ShiDu);
        byte_write(0x2060, a_a);        
}

/******************把數據從單片機內部eeprom中讀出來*****************/
void read_eeprom()
{
        WenDu   = byte_read(0x2000);
  ShiDu = byte_read(0x2001);
        a_a      = byte_read(0x2060);
}

/**************開機自檢eeprom初始化*****************/
void init_eeprom()
{
        read_eeprom();                //先讀
        if(a_a != 2)                //新的單片機初始單片機內問eeprom
        {
        WenDu   = 30;
        ShiDu   = 80;
                a_a = 2;
                write_eeprom();
        }        
}



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

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

}

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

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

void write_cmd(uchar cmd)// 寫指令
{      
         while(lcd_bz()) ;
        rs = 0 ;
        rw = 0 ;
        ep = 0 ;
        P0 = 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 ;
          P0 = 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(1) ;
         write_addr(addr) ;
   write_byte(q) ;
         delay(1) ;
         
}

/*********************** 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++)
        {
        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響應信號
        {
        
        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 showw()   // 問候語函數
{      
           lcd_init(); //初始化
            delay(10);
        
     display(0x05,'W');
     display(0x06,'e');
                 display(0x07,'l');
                 display(0x08,'c');
                 display(0x09,'o');
                 display(0x0a,'m');
     display(0x0b,'e');
           delay(250); //短暫延時
           delay(250);
           delay(250);
           

/*********************************/
/*
           display(0x40,' ') ;
                 display(0x41,'h');
                 display(0x42,'e');
               
*/
}


/*************定時器0初始化程序***************/
void time_init()         
{
        EA   = 1;                   //開總中斷
        TMOD = 0X01;          //定時器0、定時器1工作方式1
        ET0  = 1;                  //開定時器0中斷
        TR0  = 1;                  //允許定時器0定時
}



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

          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; }  //濕度下限加
                                                         }
                                                         
                                                                write_eeprom();       //保存數據               
             }
                   }
                        
                          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; }
                                                             }
                                                                write_eeprom();       //保存數據               
             }
                   }

}



/***************************主程序*********************************/
void main()
{
         init_eeprom();                              //讀eeprom數據
   time_init();                                //初始化定時器
  // showw();    //顯示問候語 和名字

        while(1)
        {   
               
                   key();
                //====================yemian==0時 進入工作狀態=================================
                         if(yemian==0)  
                        {
                                if(flat==1)
                                 {
           flat=0;
                                         lcd_init(); //初始化
                                                  
                           display(0x00,'T') ;    //Temp
                       display(0x01,':');
                           display(0x04,0xdf); // 度
                       display(0x05,'C');         
                                         
                           display(0x07,'S') ;    //shidu
                       display(0x08,':');

                       display(0x0c,'Y');                   //yanwu
                           display(0x0d,':');

                           display(0x40,'T') ;    //Temp
                       display(0x41,':');
                           display(0x44,0xdf); // 度
                       display(0x45,'C');         
                                         
                           display(0x47,'S') ;    //shidu
                       display(0x48,':');

                       display(0x52,'Y');
                           display(0x53,':');


               display(0x02,WenDu/10+0x30);  //報警溫度
                       display(0x03,WenDu%10+0x30);
                                   
                           display(0x09,ShiDu/10+0x30);  //報警濕度
                       display(0x0a,ShiDu%10+0x30);

                           display(0x0e,ShiDu/10+0x30);  //報警煙霧
                       display(0x0f,ShiDu%10+0x30);
          }
                        
                         if(flag_300ms == 1)
                     {               
                             flag_300ms = 0;
           receive();
                                         
                                         display(0x05,TH/10+0x30);  //溫度顯示
                       display(0x06,TH%10+0x30);
                                         
           display(0x45,RH/10+0x30);            //濕度顯示
                       display(0x46,RH%10+0x30);

                                           y=Adc0832(0);                    //讀取煙霧值
                                         
                                       
           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 = 0x3c;
        TL0 = 0xb0;     // 50ms
         
        if(value % 6 == 0)
        {
                flag_300ms = 1;           //300ms
                value = 0;
        }
}


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

使用道具 舉報

沙發
ID:123289 發表于 2019-10-25 16:33 | 只看該作者
將程序畫成流程圖,看看流程是否說得通。
走單步調試。
回復

使用道具 舉報

板凳
ID:235200 發表于 2019-10-25 17:37 | 只看該作者
程序有些長,只有分步去調試了,每一次調試一種傳感器并顯示出來
回復

使用道具 舉報

地板
ID:598304 發表于 2019-10-25 18:59 | 只看該作者
yzwzfyz 發表于 2019-10-25 16:33
將程序畫成流程圖,看看流程是否說得通。
走單步調試。

好,我試一下,謝謝哈!
回復

使用道具 舉報

5#
ID:598304 發表于 2019-10-25 19:00 | 只看該作者
csmyldl 發表于 2019-10-25 17:37
程序有些長,只有分步去調試了,每一次調試一種傳感器并顯示出來

好方法,我試試,謝謝哈!
回復

使用道具 舉報

6#
ID:190577 發表于 2019-10-26 08:57
DTH11只有Proteus8.6  才可以用,搞不定可以聯系我們,QQ515580142

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产综合久久久久久鬼色 | 久久久久无码国产精品一区 | 黄色日批视频 | 久久国产三级 | 国产高清精品一区二区三区 | 日韩视频中文字幕 | 欧美色综合 | 毛片99| 黑人巨大精品欧美黑白配亚洲 | 天堂中文字幕av | av免费观看在线 | 亚洲国产小视频 | 美国黄色毛片 | 欧美一区二区三区视频 | 久久精品亚洲精品国产欧美 | 久久国产精品免费一区二区三区 | 国产精品日韩一区二区 | 亚洲第一在线 | 日韩在线中文字幕 | 国产一区二区三区视频 | 免费精品 | 日韩有码在线观看 | 狠狠操狠狠 | 热久久999 | 免费成人高清在线视频 | 久久国内精品 | 亚洲高清一区二区三区 | 国产精品视频一区二区三区四蜜臂 | 日本 欧美 国产 | 国产精品久久 | 中文字幕亚洲精品 | 91精品国产麻豆 | 国产第1页 | 成人在线免费观看 | 中文字幕欧美一区二区 | 91视频一88av | 日本黄色影片在线观看 | 日日精品| 久久久久亚洲 | 国产精品久久久久久亚洲调教 | 国产一区二区三区免费视频 |