MMYDBB 2022-07-07 14:11 采纳率: 79.3%
浏览 36
已结题

51单片机温湿度调整

问题遇到的现象和发生背景

求帮助,按键是s19是设置功能,用来设置温湿度上下限并且保存的,保存数据部分还没写,s18是用来切换温湿度模式的,s17是显示温度,s18是显示湿度。现在遇到了麻烦,就是湿度和温度切换并调整上下限时,数码管显示不对,然后就是湿度切换也没反应,求帮我看看吧。

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
#include "reg52.h"
#include "alonebutton.h"
#include "delay.h"
#include "iic.h"
#include "ls138.h"
#include "smg.h"
#include "onewire.h"
#include "keyboard.h"

#define KEY P1

unsigned char keynum;
bit ReadNowTempFlag = 0;
bit ReadNowHumFlag = 0;
sbit beep = P3^3;
float temp_f;
char temp_z;
unsigned char TMIN=11;
unsigned char TMAX=21;
unsigned char HMIN=10;
unsigned char HMAX=20;
unsigned char Tmode;
unsigned char Hmode;
unsigned char CT;
unsigned char CH;
unsigned int T_data=0;
unsigned char isShowReadNowHumFlag =1;
bit showVolFlag=0;
bit isShowCurvol=1;
unsigned char convertVal;
    unsigned char setflag=0;//设置标志位 0为正常显示 1为更改上下限 2为保存退出
unsigned char modeflag=0;    //模式标志位 0为温度 1为湿度

void initSystem(){
    SelectHC573(4);//led
    P0 = 0xff;
    SelectHC573(5);//蜂鸣器
    P0=0x00;
    SelectHC573(0);
}

void initTimer0(){
    TMOD =TMOD|0X01;
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
    ET0=1;
    TR0=1;
    EA =1;
}

void ServiceTimer0() interrupt 1
{
    static unsigned int count = 0;
    TH0=(65536-1000)/256;
    TL0=(65536-1000)%256;
        showLed();
    
      count++;    
    if(count%50==0&&modeflag==0){
        ReadNowTempFlag = 1;        
        }

}
void initTimer1(){
    TMOD =TMOD|0X10;
    TH1=(65536-1000)/256;
    TL1=(65536-1000)%256;
    ET1=1;
    TR1=1;
    EA =1;
}

void ServiceTimer1() interrupt 3
{
    static unsigned int count1 = 0;
    TH1=(65536-1000)/256;
    TL1=(65536-1000)%256;
    
      count1++;
    
    if(count1%80==0&&modeflag==1){
        ReadNowHumFlag = 1;
        }

}


//////////////////////////////
unsigned int Read_Temperature()
{
    unsigned char LSB , MSB;
    unsigned int T_date;
    TR0 = 0;
    Init_DS18B20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0x44);
    TR0 = 1;
    DelayMs(700);
    TR0 = 0;
    Init_DS18B20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0xBE);
    LSB = Read_DS18B20();
    MSB = Read_DS18B20();
    Init_DS18B20();
    TR0 = 1;

    T_date = 0x0000;
    T_date = MSB;
    T_date <<= 8;
    T_date = T_date | LSB;
    
    return T_date;
    
}
void UpdateSmg_temperature(){
    
    if((T_data&0xf800)==0x0000){
        temp_f=T_data*0.0625;
        temp_z=temp_f;
        
        if(temp_z/10>=1){
        updateLed(6,temp_z/10);//十位
        }else updateLed(6,10);//灭
        updateLed(7,temp_z%10);//个位
    }

}

unsigned char regionT(void)
{
    if(CT<TMIN)
        return 0;
    if(TMIN<=CT<=TMAX)
        return 1;
    if(CT>TMAX)
        return 2;
      return 0;//其他情况为0
}

void UpdateSmgT(){
    Tmode=regionT();
    updateLed(0,13);
    updateLed(1,12);
    updateLed(2,Tmode);
    updateLed(3,12);
    updateLed(4,10);
    updateLed(5,10);
    
    UpdateSmg_temperature();
}

//////////////////////湿度
void getDateFrom8591()
{
   convertVal=Read_PCF8591(1);
}
unsigned char regionH(void)
{
    if(CH<HMIN)
        return 0;
    if(HMIN<=CH<=HMAX)
        return 1;
    if(CH>HMAX)
        return 2;
      return 0;//其他情况为0
}


void displayVol()//255 —>5v convertVal(0-255)-->vol(0-5v)-->湿度
{
  float vol;
//if(isShowCurvol==1)//当前值
    //{
  getDateFrom8591();
  vol=5.0/255*convertVal;
  //val=vol*100;//扩大10倍方便求小数
    CH=vol/5*100;


 updateLed(6,CH/10);//十位
 updateLed(7,CH%10);//个位
        
    Hmode=regionH();
    updateLed(0,14);
    updateLed(1,12);
    updateLed(2,Hmode);
    updateLed(3,12);
    updateLed(4,10);
    updateLed(5,10);
    
//    }
    }

void updatelimt_temp()
{
  updateLed(0,13);
  updateLed(1,12);
  updateLed(2,TMAX/10);
    updateLed(3,TMAX%10);
    updateLed(4,10);
    updateLed(5,12);
    updateLed(6,TMIN/10);
    updateLed(7,TMIN%10);
}
    

void updatelimt_hum()
{
  updateLed(0,14);
  updateLed(1,12);
  updateLed(2,HMAX/10);
    updateLed(3,HMAX%10);
    updateLed(4,10);
    updateLed(5,12);
    updateLed(6,HMIN/10);
    updateLed(7,HMIN%10);
}
////////////////独立按键//////////

 void updatesmg() 
 
 {
    if(modeflag=0&&setflag==1)
    {
        updatelimt_temp();
    }
    if(modeflag=1&&setflag==1)
    {
        updatelimt_hum();
    }
        if(ReadNowTempFlag == 1&&modeflag==0&&setflag==0)
        {
            ReadNowTempFlag = 0;
            T_data=Read_Temperature();
            UpdateSmgT();
            
        }

    if(ReadNowHumFlag==1&&modeflag==1&&setflag==0)
      {
            ReadNowHumFlag=0;
            displayVol();
    }

 }

void DoKeys_limt()
    {

    unsigned char keycode;
    keycode = readKey();//因为没有按键按下,所以一直会等待按键。
    switch(keycode)
    {
        case 19://设置
            setflag++;
        if(setflag>1){setflag=0;}//0为正常显示 1为更改上下限 
        break;
        
        case 18://切换
            modeflag++;
        if(modeflag>1){modeflag=0;}// 0温度 1湿度
        break;
        
    case 17:
            modeflag=0;
        break;
    
    case 16:
          modeflag=1;
        break;
    
    case 15://温度上限  +
          TMAX++;
    if(TMAX>100)
        TMAX=50;
        break;
    
  case 14://温度上限  -
          TMAX--;
    if(TMAX<=TMIN)
        TMAX=TMIN+1;
        break;
    
    case 13://温度下限  +
        TMIN++;
    if(TMIN>TMAX)
        TMIN=TMAX-1;
        break;
    
    case 12://温度下限  -
              TMIN--;
    if(TMIN<0)
        TMIN=10    ;
        break;
    
    case 11://湿度上限  +
           HMAX++;
    if(HMAX>100)
        HMAX=55;
    
        break;
    case 10://湿度上限  -
                  HMAX--;
    if(HMAX<=HMIN)
        HMAX=HMIN+1;
        break;
    
    case 9: //湿度下限  +
                HMIN++;
    if(HMIN>HMAX)
        HMIN=HMAX-1;
        break;    
    
    case 8://湿度下限  -
              HMIN--;
    if(HMIN<0)
        HMIN=15    ;
        break;    
        default: break;
            }
updatesmg();
    
}    
 

void main(){
    initSystem();
    initTimer0();
    initTimer1();
    while(1){
        DoKeys_limt();    
        updatesmg();
                }
    }



  • 写回答

1条回答 默认 最新

  • wwc2017 2022-07-07 14:42
    关注

    224行和228行modeflag后面少写了一个=

        if(modeflag=0&&setflag==1)
        {
            updatelimt_temp();
        }
        if(modeflag=1&&setflag==1)
        {
            updatelimt_hum();
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月15日
  • 已采纳回答 7月7日
  • 创建了问题 7月7日

悬赏问题

  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题