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

51单片机温湿度数码管持续显示问题

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

数码管显示有问题,主要就是温湿度当前数值的显示不能持续显示,总是跳闪,请个位帮我看看,刚才上次提出的问题我已经解决了。
温度是通过ds18b20调整 湿度是通过ad电压转换的

问题相关代码,请勿粘贴截图
#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;
        CT=temp_f;
        
        if(CT/10>=1){
        updateLed(6,CT/10);//十位
        }else updateLed(6,10);//灭
        updateLed(7,CT%10);//个位
    }

}

unsigned char regionT(void)
{
    if(CT<TMIN)
        return 0;
    if(CT>=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(CH>=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();
                }
    }



运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • qllaoda 2022-07-07 15:35
    关注

    因为你的扫描无法做到持续,经常因为处理一些其它事情被打断,导致扫描周期不稳定,或者有时候出现过长的时间没有扫描,导致了闪烁。
    建议在定时器中断里做扫描。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的