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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1850|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)dht11在仿真時(shí),通過按鈕轉(zhuǎn)到調(diào)濕度上限和濕度下限畫面時(shí),顯示光標(biāo)亂竄的情況

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:941024 發(fā)表于 2021-6-20 18:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請(qǐng)教一下大致的實(shí)現(xiàn)方法與思路,理清頭緒后我自己去實(shí)現(xiàn),謝謝大家

用的51單片機(jī)和DHT11做的控制濕度系統(tǒng)。
現(xiàn)在出現(xiàn)問題是:在仿真時(shí),通過按鈕轉(zhuǎn)到調(diào)濕度上限和濕度下限畫面時(shí),顯示光標(biāo)亂竄的情況。
希望大佬們幫我看看!謝謝!

濕度控制.zip

175.82 KB, 下載次數(shù): 7

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

使用道具 舉報(bào)

沙發(fā)
ID:941024 發(fā)表于 2021-6-20 22:50 | 只看該作者
這個(gè)是LCD的代碼
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <absacc.h>
#include <math.h>
#define U8INT unsigned     char
#define U16INT unsigned            int
#define U32INT unsigned           long
#define LCD_Port P0
//定義LCD1602端口

sbit EN=P1^3;                //使能
sbit RW=P2^6;                //讀寫
sbit RS=P1^2;                //數(shù)據(jù)/命令選擇
U8INT humidity;
U8INT temperature;
U8INT Mode;
bit bdata humid,dry,BJ;

void delay_ms(U16INT x)          //延時(shí)
{
           U8INT i=0;
           while(x--)
           {
            for(i=0;i<120;i++);
           }
}
void Busy_Wait()                //忙等待
{
        U8INT LCD_Status=0x00;
        do
        {
                LCD_Port=0xFF;
                EN=0;RS=0;RW=1;
                EN=1;_nop_();
                LCD_Status=LCD_Port        ;
                EN=0;_nop_();
        }
        while(LCD_Status&0x80);
}
void LCD_Write_CMD(U8INT cmd)          //寫入LCD的命令
{
        Busy_Wait();
        EN=0;RS=0;RW=0;
        LCD_Port=cmd;
        EN=1;_nop_();
        EN=0;_nop_();

//        delay_ms(10);        //
}
void LCD_Write_Data(U8INT dat)          //寫入LDE的數(shù)據(jù)
{
        Busy_Wait();
        EN=0;RS=1;RW=0;
        LCD_Port=dat;
        EN=1;_nop_();
        EN=0;_nop_();
        Busy_Wait();
//        delay_ms(10);          //
}
void LCD_Init()                                   //初始化LCD
{
                LCD_Write_CMD(0x38);//設(shè)置顯示模式:16x2顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口
                LCD_Write_CMD(0x0c);//開顯示,不顯示光標(biāo),光標(biāo)不閃爍
                LCD_Write_CMD(0x06);//寫一個(gè)字符后地址指針加1,且光標(biāo)加1,整屏顯示不移動(dòng)
                LCD_Write_CMD(0x01);//清屏

}
void L1602_char(U8INT hang,U8INT lie,U8INT sign) //行、列、單個(gè)字符
{
        U8INT a;
        if(hang == 1) a = 0x80;                 //上行首地址
        if(hang == 2) a = 0xc0;                  //下行首地址
        a = a + lie - 1;                        //從第零位加(lie-1)位開始顯示
        LCD_Write_CMD(a);
        LCD_Write_Data(sign);
}
void L1602_string(U8INT hang,U8INT lie,U8INT *p)   //行、列、字符串
{
        U8INT a;
        if(hang == 1) a = 0x80;                //
        if(hang == 2) a = 0xc0;                  //
        a = a + lie - 1;
        LCD_Write_CMD(a);
        while(1)
        {
                if(*p == '\0') break;         //從P字符串第一個(gè)字符打到最后一個(gè)字符
                LCD_Write_Data(*p);                 //每次循環(huán)加一個(gè)P,‘\0’是加在字符串后的結(jié)束標(biāo)志
                p++;                                         //         當(dāng)碰到結(jié)束標(biāo)志就break結(jié)束循環(huán)
        }
}
void L1602_int(U8INT hang, U8INT lie, int num)        //行、列、整形   / /顯示整形的濕度
{
   U16INT temp;
   U16INT gewei,shiwei,baiwei,sign;         //geshibai
   if (num >= 0)
   sign = 0;
   else
   sign = 1;
   temp = abs(num);                                   //絕對(duì)值
   baiwei = temp / 100;                                   // 百
   temp = temp - baiwei*100;
   shiwei = temp / 10;                                  //   十
   gewei = temp - shiwei*10;                  //        個(gè)
   num = abs(num);
   if (num>=100)
   {
   
          L1602_char(hang, lie+2, shiwei+48);          //ASCII碼48起0
          L1602_char(hang, lie+3, gewei+48);  
   }
   else if (num>=10)
   {
      if (sign == 1)          
          L1602_char(hang, lie+1, ' ');
          L1602_char(hang, lie+2, shiwei+48);  
      L1602_char(hang, lie+3, gewei+48);
   }
   else
   {
      if (sign == 1)          
          L1602_char(hang, lie+1, ' ');
          else
          L1602_char(hang, lie+2, ' ');
      L1602_char(hang, lie+3, gewei+48);  
   }
}
void display()          //顯示濕度狀態(tài)
{
        if(Mode==0)
        {
                L1602_int(1,3,humidity);
                if(humid==1&&dry==0)
                {L1602_string(2,1,"It's very humid!");BJ=1;}
                else if(humid==0&&dry==1)
                {L1602_string(2,1," It's very dry! ");BJ=1;}
                else if(humid==0&&dry==0)
                {L1602_string(2,1," It's normal!   ");BJ=0;}
        }                                                                          
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:941024 發(fā)表于 2021-6-20 22:50 | 只看該作者
這個(gè)是DHT11的代碼
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <absacc.h>
#include <math.h>
#define U8INT unsigned char
#define U16INT unsigned int
sbit Led_jiashi=P3^4;//定義濕度控制功能               
sbit Led_qushi=P3^3;               
sbit DATA= P1^7;        //定義DHT11數(shù)據(jù)口
sbit buzz= P3^5;
sbit SCL = P1^0;        //定義24C02數(shù)據(jù)口
sbit SDA = P1^1;
U8INT U8checkdata_temp;
U8INT U8RH_data_H_temp;
U8INT U8RH_data_L_temp;
U8INT U8T_data_H_temp;        //
U8INT U8T_data_L_temp;        //
U8INT U8RH_data_H;            //高8位濕度整數(shù)
U8INT U8RH_data_L;           //低8位濕度小數(shù)
U8INT U8T_data_H;            
U8INT U8T_data_L;
U8INT U8checkdata;        //8位數(shù)據(jù)檢查數(shù)據(jù)
U8INT U8temp;           //8位數(shù)據(jù)寄存(用來對(duì)比檢差數(shù)據(jù)
U8INT U8FLAG;                // 用來計(jì)數(shù)溢出等待
U8INT U8comdata;        //8位數(shù)據(jù)寄存(用來存濕度數(shù)據(jù)
bit bdata FlagStartRH;//定義一個(gè)位變量flag
extern bit        humid,dry,BJ; // 0或者1
void Timer0_Init()           //初始化定時(shí)器0
{
        ET0 = 1;        //允許定時(shí)器0中斷
        TMOD = 0x11;       //定時(shí)器工作方式選擇
        TL0 = 0xFF;     
        TH0 = 0x4B;     //定時(shí)器賦予初值
        TR0 = 1;        //啟動(dòng)定時(shí)器
}

void Timer0_ISR (void) interrupt 1 using 0         //定時(shí)器0中斷
{                                                                                         //第0組寄存器
        U8INT RHCounter;
        TL0 = 0xFF;
        TH0 = 0x4B;     //定時(shí)器賦予初值
        RHCounter++;
        if(RHCounter%10==0&&BJ==1)
        buzz=!buzz;
        else if(BJ==0)
        buzz=1;
        //每1秒鐘啟動(dòng)一次溫濕度轉(zhuǎn)換
    if (RHCounter >= 20)
    {
       FlagStartRH = 1;
           RHCounter = 0;
    }
}

void DELAY (U16INT t)         //           延時(shí)
{
        while(t!=0)
        t--;
}                                                                //SCL 時(shí)鐘線           //SDA 雙向控制線
void IICStart(void)                           //開始
{
     SCL=0;                                             //SCL為高電平,SDA由高跳低,開始傳送數(shù)據(jù)
         DELAY(1);
     SDA=1; SCL=1; DELAY(1);       
     SDA=0; DELAY(1);                        //脈沖表示應(yīng)答信號(hào),無反應(yīng)為故障
     SCL=0;                                         //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
}

void IICStop(void)                           // 結(jié)束
{
         SDA=0;SCL=1; DELAY(1);           //SCL為高電平,SDA由低跳高,結(jié)束傳送數(shù)據(jù)
     SDA=1; DELAY(1);
     SCL=0;                                         //發(fā)送I2C總線結(jié)束信號(hào)
}
void SEND0(void)                         //發(fā)送數(shù)據(jù)函數(shù)
{                                                        //sda為0時(shí),傳輸狀態(tài),scl由高變低
        SDA=0;
        SCL=1;
        DELAY(1);
        SCL=0;
}

void SEND1(void)       
{                                                           //sda為1時(shí),空閑狀態(tài),scl由高變低
        SDA=1;
        DELAY(1);
        SCL=1;
        DELAY(1);
        SCL=0;
}
void  Delay_10us(void)          //延時(shí)10毫秒
{
    U8INT i;
    i--;
    i--;
    i--;
    i--;
    i--;
    i--;
}
void Delay1(U16INT j)
{
    U8INT i;
    for(;j>0;j--)
    {        
                for(i=0;i<27;i++);
    }
}
bit Check_Ack(void)                //返回信號(hào)
{
        U8INT errtime=250;
        DELAY(1);
        SCL=1;
        DELAY(1);
        CY=SDA;
        while(CY)
        {
                errtime--;
                CY=SDA;
                if (!errtime)
                {
                        IICStop();
                        return 1;
                }
        }
        DELAY(1);
        SCL=0;
        return 0;
}
void Write_byte(U8INT dat)
{
    U8INT i;
        for(i=0;i<8;i++)
        {       
                if((dat<<i)&0x80)
                SEND1();
                else
                SEND0();
        }
}

U8INT Read_byte(void)
{
        U8INT i,temp=0;     
        for(i=0;i<8;i++)
        {
        SDA=1;
            SCL=1;
            DELAY(1);  
                if(SDA==1)
                {
                        temp=temp<<1;
                        temp=temp|0x01;
                }
                else
                temp=temp<<1;
                 SCL=0;       
          }
          return temp;
}
U8INT rdeeprom(U8INT addr)
{
        U8INT temp=0;
                bit flag=0;
                IICStart();
                Write_byte(0xa0);
        Check_Ack();
                Write_byte(addr);
                Check_Ack();
                IICStart();
                Write_byte(0xa1);
                Check_Ack();
                temp=Read_byte();
                SEND1();
                IICStop();
            return temp;   
}  
   
   
void wrteeprom(U8INT addr,U8INT dat)
{
               IICStart();
                Write_byte(0xa0);
                Check_Ack();
                Write_byte(addr);
                Check_Ack();
                Write_byte(dat);
                Check_Ack();
                IICStop();
}

                       
void Data_Init()                         //數(shù)據(jù)初始化
{
   Led_qushi  = 1;                               //qushi
   Led_jiashi = 1;                            //jiashi
  
}
void  COM(void)                                //存8位數(shù)據(jù)
{
    U8INT i;
    for(i=0;i<8;i++)          
    {
              U8FLAG=2;
                   while((!DATA)&&U8FLAG++);
                Delay_10us();           //yan時(shí)30us
                Delay_10us();
                Delay_10us();
                  U8temp=0;
        if(DATA)U8temp=1;          //30us后當(dāng)DHT11信號(hào)為為高,收到的數(shù)據(jù)為1        否則為0
                    U8FLAG=2;
                while((DATA)&&U8FLAG++);         //超時(shí)則跳出for循環(huán)                             
                   if(U8FLAG==1)break;        //判斷數(shù)據(jù)位是0還是1   如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
                U8comdata<<=1;                   //左移1位
                   U8comdata|=U8temp;        //0
    }
}
U8INT RH(void)                          //工作DH11
{
   
    DATA=0;                           //主機(jī)拉低18ms
        Delay1(180);  //原來為5
        DATA=1;                                //再拉高電平  主機(jī)延時(shí)40us        不然會(huì)亂碼
        Delay_10us();          
        Delay_10us();
        Delay_10us();
        Delay_10us();
        DATA=1;                                   //主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)           
        if(!DATA)                 //T !                  //判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
        {                                                          
            U8FLAG=2;                     
            while((!DATA)&&U8FLAG++);   //判斷從機(jī)是否發(fā)出 80us 的低電平   響應(yīng)信號(hào)是否結(jié)束
            U8FLAG=2;            
            while((DATA)&&U8FLAG++);   //判斷從機(jī)是否發(fā)出 80us 的高電平   如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
            //數(shù)據(jù)接收狀態(tài)                 
            COM();
            U8RH_data_H_temp=U8comdata;
            COM();
            U8RH_data_L_temp=U8comdata;
            COM();
                U8T_data_H_temp=U8comdata;         //           必須要有,不然檢驗(yàn)不了數(shù)據(jù)
            COM();
            U8T_data_L_temp=U8comdata;        //
            COM();
            U8checkdata_temp=U8comdata;
            DATA=1;          
            U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);          //數(shù)據(jù)校驗(yàn)         ????
            if(U8temp==U8checkdata_temp)
            {
                      U8RH_data_H=U8RH_data_H_temp;
                      U8RH_data_L=U8RH_data_L_temp;
                   U8T_data_H=U8T_data_H_temp;
                      U8T_data_L=U8T_data_L_temp;
                      U8checkdata=U8checkdata_temp;
            }
                return 1;
        }
        else   //傳感器不響應(yīng)                 沒有檢測到低電位所以不響應(yīng)
        {
           return 0;
        }
}

回復(fù)

使用道具 舉報(bào)

地板
ID:941024 發(fā)表于 2021-6-20 22:51 | 只看該作者
這個(gè)是主函數(shù)的代碼
#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <absacc.h>
#include <math.h>
#define U8INT unsigned char
#define U16INT unsigned          int
#define U32INT unsigned           long int
sbit Key_SET = P2^0; //定義三個(gè)設(shè)置按鍵
sbit Key_ADD = P2^1;
sbit Key_SUB = P2^2;
sbit Key_OK  = P2^3;
sbit Led_jiashi=P3^4;//定義濕度控制功能               
sbit Led_qushi=P3^3;

extern Mode;
extern  humidity;
char HH,HL;
extern U8RH_data_H;        //高8位濕度整數(shù)
extern U8RH_data_L;           //低8位濕度小數(shù)
extern void L1602_string(U8INT hang,U8INT lie,U8INT *p);
extern void L1602_char(U8INT hang,U8INT lie,U8INT sign);
extern void L1602_int(U8INT hang, U8INT lie, int num);
extern void LCD_Write_Data(U8INT dat);
extern void LCD_Write_CMD(U8INT cmd);
extern void LCD_Init();
extern void display();
extern void wrteeprom(U8INT addr,U8INT dat);
extern void IICStart(void);       
extern void IICStop(void);
extern void Timer0_Init();
extern void Timer0_ISR (void) ;        //         interrupt 1 using 0
extern void SEND0(void);
extern void SEND1(void);
extern void  Delay_10us(void)         ;
extern void Delay1(U16INT j);
extern void Write_byte(unsigned char dat) ;
extern void Data_Init();
extern void  COM(void)        ;
extern bit Check_Ack(void);
extern void Delay1(U16INT j);
extern void Data_Init() ;
U8INT Read_byte(void)  ;
U8INT RH(void)        ;
U8INT rdeeprom(U8INT addr);
extern bit FlagStartRH,humid,dry,BJ;

void KEY()                         //設(shè)置按鍵
{
        if(Key_SET==0)
        {
                Delay1(200);
                //解決不了問題LCD_Write_CMD(0x01);
                if(Key_SET==0)                        //一開始是0
                {
                        Mode++;
                        if(Mode==1)                           //后加一
                        {
                                L1602_string(1,1," HH:    % HL:  %");         //初始顯示
                                L1602_int(1,4,HH);
                                L1602_int(1,12,HL);
                                LCD_Write_CMD(0x80+6);                  
                                LCD_Write_CMD(0x0f);                  //閃爍
                        }
                        else if(Mode>=2)
                        {                                                           //2
                               
                                LCD_Write_CMD(0x80+14);
                                LCD_Write_CMD(0x0f);
                        }
                        else if(Mode>=3)
                        {                                                           //循環(huán)條件
                                Mode=1;
                                LCD_Write_CMD(0x80+6);                  
                                LCD_Write_CMD(0x0f);
                        }
                        while(!Key_SET);
                }
        }
        else if(Key_ADD==0)                        //增加
        {
                Delay1(100);
                if(Key_ADD==0)
                {
                        if(Mode==1)
                        {
                                HH++;
                                if(HH>=100)
                                HH=99;
                                L1602_int(1,4,HH);
                                LCD_Write_CMD(0x80+6);
                        }
                        else if(Mode==2)
                        {
                                HL++;
                                if(HL>=HH)
                                HL=HH-1;
                                L1602_int(1,12,HL);
                                LCD_Write_CMD(0x80+14);
                        }
                        while(!Key_ADD);
                }
        }
        else if(Key_SUB==0)
        {
                Delay1(100);
                if(Key_SUB==0)
                {
                        if(Mode==1)
                        {
                                HH--;
                                if(HH<=HL)
                                HH=HL+1;
                                L1602_int(1,4,HH);
                                LCD_Write_CMD(0x80+6);
                        }
                        else if(Mode==2)
                        {
                                HL--;
                                if(HL<=0)
                                HL=0;
                                L1602_int(1,12,HL);
                                LCD_Write_CMD(0x80+14);
                        }
                        while(!Key_SUB);
                }
        }
        if(Key_OK==0&&Mode!=0)
        {
                Delay1(100);
                if(Key_OK==0)
                {
                        L1602_string(1,1,"Hum:   %        ");
                        L1602_string(2,1,"Good environment");
                        Mode=0;
                        wrteeprom(0,HH);
                        Delay1(20);
                        wrteeprom(1,HL);
                        Delay1(20);
                        LCD_Write_CMD(0x0c);        //xia
                        while(Key_OK==0);
                }
        }
}


void main()
{
    U16INT i, j, testnum;
    EA = 0;                                //di wai  gao nei
        Timer0_Init();   
    Data_Init();
        EA = 1;
        LCD_Init();
        L1602_string(1,1,"Welcome Humidity");
        L1602_string(2,1,"Control System! ");
         for (i=0;i<500;i++)
           for (j=0;j<500;j++)
           {;}   
        L1602_string(1,1,"                ");
        L1602_string(2,1,"                ");
    L1602_string(1,1,"Hum:  %         ");
        L1602_string(2,1,"Good environment");  
        HH=rdeeprom(0);         
        Delay1(20);                  
        HL=rdeeprom(1);
        Delay1(20);
        while(1)
        {
      
                 if (FlagStartRH == 1)         //濕度轉(zhuǎn)換標(biāo)志檢查
                 {
                     TR0 = 0;
             testnum = RH();
                         FlagStartRH = 0;
                         TR0 = 1;
                         humidity = U8RH_data_H;         //讀出濕度,只取整數(shù)部分
                         

                         
                         if(Mode==0)                //濕度控制
                         {
                                if (humidity > HH)
                                {
                                        Led_qushi = 0;
                                        humid=1;
                                        Led_jiashi = 1;
                                        dry=0;
                       
                                }
                                else if(humidity<HL)
                                {
                                        Led_jiashi = 0;
                                        dry=1;
                                        Led_qushi = 1;
                                        humid=0;
                       
                                }               
                                else
                                {
                                        Led_qushi=1;
                                        Led_jiashi=1;
                                        humid=0;
                                        dry=0;
                                }       
                         }       
                }
                display();
                KEY();
        }       
}
回復(fù)

使用道具 舉報(bào)

5#
ID:941024 發(fā)表于 2021-6-21 17:14 | 只看該作者
有大佬嗎,暖一下
回復(fù)

使用道具 舉報(bào)

6#
ID:941024 發(fā)表于 2021-6-24 00:16 | 只看該作者
問題還有一個(gè):跳轉(zhuǎn)到控制臺(tái)的時(shí)候,濕度SUM:60會(huì)一直在lcd顯示屏
回復(fù)

使用道具 舉報(bào)

7#
ID:748788 發(fā)表于 2021-6-24 16:07 | 只看該作者
程序有沒有上真機(jī)測試?應(yīng)該以真機(jī)為準(zhǔn)。
回復(fù)

使用道具 舉報(bào)

8#
ID:941024 發(fā)表于 2021-6-28 23:49 | 只看該作者
wwh2382 發(fā)表于 2021-6-24 16:07
程序有沒有上真機(jī)測試?應(yīng)該以真機(jī)為準(zhǔn)。

用的仿真
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区 | 国产精品96久久久久久 | 99热在线观看精品 | 久久久一区二区三区 | 国产午夜亚洲精品不卡 | 国产原创在线观看 | 热99在线 | 一区中文字幕 | 一区二区免费在线视频 | 日韩高清国产一区在线 | 欧美日韩一区二区三区不卡视频 | 网站黄色在线 | 日韩精品久久久 | 久久成人18免费网站 | 国产亚洲一区精品 | 97超碰成人 | 性色在线 | 国产91丝袜在线播放 | 中文字幕日韩一区 | 91久久精品国产91久久 | 久久久久久久一区二区三区 | 精品99久久久久久 | 毛片一区| 天天操天天玩 | 五月婷婷丁香 | 国产精品美女视频 | 欧美成人精品在线 | 黄色大片免费观看 | 中文字字幕在线中文乱码范文 | 久久视频精品 | 日韩免费视频一区二区 | 污视频在线免费观看 | 欧美aaaaaaaaaa| 日本天天操 | 精品99久久| 国产精品一区二区三区在线 | 91精品国产一区二区三区 | 日韩精品免费在线 | 色久伊人 | 成年人免费看的视频 | 天天干狠狠 |