MMYDBB 2022-07-07 13:28 采纳率: 79.3%
浏览 18
已结题

51单片机 温湿度调整

求帮助,我这个压缩包里面有代码和DSN模拟图,按键是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/255convertVal;
/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=1&&setflag==1)
{
updatelimt_temp();
}
if(modeflag=0&&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 keycode
        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){
//
// if(ReadNowTempFlag == 1&&modeflag==0&&setflag==0)
// {
// ReadNowTempFlag = 0;
// T_data=Read_Temperature();
// UpdateSmgT();
//
// }

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

    DoKeys_limt();    
        }
}

2.

  • 写回答

1条回答 默认 最新

  • 泡沫o0 2023年度博客之星上海赛道TOP 1 2022-07-08 09:32
    关注

    img


    少了个等号

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图