蓝桥杯单片机第十四届省赛疑问

为什么用注释掉的逻辑写,4T测评led会有问题,这两种写法结果不是相同的吗

main.c 完整代码

#include <STC15F2K60S2.H>
#include "ds1302.h"
#include "iic.h"
#include "init.h"
#include "key.h"
#include "led.h"
#include "onewire.h"
#include "seg.h"

idata unsigned long int uwtick;
idata unsigned char seg_pos;
pdata unsigned char seg_buf[8]={10,10,10,10,10,10,10,10};
idata unsigned char key_val,key_up,key_down,key_old;
pdata unsigned char ucLed[8]={0,0,0,0,0,0,0,0};

idata unsigned int frequency;
idata unsigned int timer_1s;

idata unsigned char seg_mode_disp;//0-时间界面 1-回显界面 2-参数界面
idata unsigned char echo_mode;//0-温度回显 1-湿度回显 2-时间回显
idata unsigned char temperature_para=30;//温度参数0-99
idata bit long_press_flag;
idata unsigned int timer_2s;
idata unsigned char trigger_count;

pdata unsigned char ucRtc[3]={23,59,55};
idata unsigned char rtc_index;//0-hour 1-minute 2-second
pdata unsigned char ctrlRtc[3]={0,0,0};

idata unsigned char temperature_max;
idata unsigned int temperature_average_10x;
idata float temperature;
idata unsigned char temperature_old;//上一次采集的温度
idata bit riseT_flag;//温度升高标志位
idata unsigned long int temperature_sum;

idata unsigned char humidity_max;
idata unsigned int humidity_average_10x;
idata unsigned char humidity;//测量的湿度
idata unsigned char humidity_old;//上一次采集的湿度
idata bit hu_valid_flag;//湿度有效标志位
idata bit riseH_flag;//湿度升高标志位
idata unsigned long int humidity_sum;

idata unsigned char brightness;
idata bit bright_flag;//亮的标志位
idata bit display_flag;//显示温湿度界面标志位
idata unsigned int timer_3s;//温湿度界面显示时间
idata bit pick_flag;//采集标志位

idata unsigned char timer_100ms;
idata bit blink_flag;
idata bit data_up;

void key_proc()
{
    key_val=key_read();
    key_down=key_val&(key_val^key_old);
    key_up=~key_val&(key_val^key_old);
    key_old=key_val;
    
    switch(key_down)
    {
        case 4:
//            if(seg_mode_disp==0)
//                echo_mode=0;
//            if(++seg_mode_disp==3)
//                seg_mode_disp=0;
        
            if(++seg_mode_disp==3)
                seg_mode_disp=0;
            if(seg_mode_disp==1)
                 echo_mode=0;
        break;
        case 5:
            if(seg_mode_disp==1)
            {
                if(++echo_mode==3)
                    echo_mode=0;
            }
        break;
        case 8:
            if(seg_mode_disp==2)
            {
                temperature_para=(temperature_para==99)?99:temperature_para+1;
            }
        break;
    }
    
    if(seg_mode_disp==1&&echo_mode==2)
    {
        if(key_down==9)
        {
            long_press_flag=1;
            timer_2s=0;
        }
    }
    if(key_up==9)
    {
        if(timer_2s>=2000)
        {
            trigger_count=0;
            temperature_max=0;
            temperature_average_10x=0;
            temperature_old=0;
            humidity_max=0;
            humidity_average_10x=0;
            humidity_old=0;
            ctrlRtc[0]=0;
            ctrlRtc[1]=0;
            temperature_para=30;
            humidity_sum = 0;
            temperature_sum = 0;
            
        }
        else if(seg_mode_disp==2)
            temperature_para=(temperature_para==0)?0:temperature_para-1;
        long_press_flag=0;
    }
}

void seg_proc()
{
    switch(seg_mode_disp)
    {
        case 0:
          seg_buf[0]=ucRtc[0]/10;
          seg_buf[1]=ucRtc[0]%10; 
          seg_buf[2]=11; 
          seg_buf[3]=ucRtc[1]/10; 
          seg_buf[4]=ucRtc[1]%10; 
          seg_buf[5]=11; 
          seg_buf[6]=ucRtc[2]/10;
          seg_buf[7]=ucRtc[2]%10;         
        break;
        case 1:
            switch(echo_mode)
            {
                case 0:
                    seg_buf[0]=12;
                    seg_buf[1]=10; 
                    seg_buf[2]=10; 
                    seg_buf[3]=10; 
                    seg_buf[4]=10; 
                    seg_buf[5]=10; 
                    seg_buf[6]=10;
                    seg_buf[7]=10;
                    if(trigger_count)
                    {
                        seg_buf[2]=temperature_max/10; 
                        seg_buf[3]=temperature_max%10; 
                        seg_buf[4]=11; 
                        seg_buf[5]=temperature_average_10x/100; 
                        seg_buf[6]=temperature_average_10x/10%10+',';
                        seg_buf[7]=temperature_average_10x%10;
                    }
                break;
                case 1:
                    seg_buf[0]=13;
                    seg_buf[1]=10; 
                    seg_buf[2]=10; 
                    seg_buf[3]=10; 
                    seg_buf[4]=10; 
                    seg_buf[5]=10; 
                    seg_buf[6]=10;
                    seg_buf[7]=10;
                    if(trigger_count)
                    {
                        seg_buf[2]=humidity_max/10; 
                        seg_buf[3]=humidity_max%10; 
                        seg_buf[4]=11; 
                        seg_buf[5]=humidity_average_10x/100; 
                        seg_buf[6]=humidity_average_10x/10%10+',';
                        seg_buf[7]=humidity_average_10x%10;
                    }
                break;
                case 2:
                    seg_buf[0]=14;
                    seg_buf[1]=trigger_count/10; 
                    seg_buf[2]=trigger_count%10;
                    seg_buf[3]=10; 
                    seg_buf[4]=10; 
                    seg_buf[5]=10; 
                    seg_buf[6]=10;
                    seg_buf[7]=10;                
                    if(trigger_count)
                    {
                        seg_buf[3]=ctrlRtc[0]/10; 
                        seg_buf[4]=ctrlRtc[0]%10;
                        seg_buf[5]=11; 
                        seg_buf[6]=ctrlRtc[1]/10; 
                        seg_buf[7]=ctrlRtc[1]%10;
                    }
                break;
            }
        break;
        case 2:
            seg_buf[0]=16;
            seg_buf[1]=10; 
            seg_buf[2]=10; 
            seg_buf[3]=10; 
            seg_buf[4]=10;
            seg_buf[5]=10; 
            seg_buf[6]=temperature_para/10; 
            seg_buf[7]=temperature_para%10;
        break;
    }
    if(display_flag==1)
    {
        seg_buf[0]=15;
        seg_buf[1]=10; 
        seg_buf[2]=10; 
        seg_buf[3]=(unsigned char)temperature/10; 
        seg_buf[4]=(unsigned char)temperature%10;
        seg_buf[5]=11; 
        seg_buf[6]=hu_valid_flag?humidity/10:17; 
        seg_buf[7]=hu_valid_flag?humidity%10:17;
    }
}

void led_proc()
{
    ucLed[0]=(seg_mode_disp==0);
    ucLed[1]=(seg_mode_disp==1);
    ucLed[2]=display_flag;//看错指示灯要求了,认真读题
    if(temperature>temperature_para)
        ucLed[3]=blink_flag;
    else
        ucLed[3]=0;
    ucLed[4]=(hu_valid_flag==0);
    ucLed[5]=data_up;
    led_disp(ucLed);
}

void get_time()
{
    Read_Rtc(ucRtc);
}

void AD_DA()
{
    brightness=AD_Read(0x41);
    if(brightness>100)
        bright_flag=1;
    else if(bright_flag==1&&brightness<50)
    {
        display_flag=1;
        pick_flag=1;
        bright_flag=0;
    }
    
}

void get_frequency()
{
     if(pick_flag)//允许采集温度和湿度
    {
        temperature=Temperature_Read();
        if(frequency>=200&&frequency<=2000)//有效数据
        {
            hu_valid_flag=1;
            trigger_count++;
            humidity=10+(frequency-200)* (80.0 / 1800.0);
            
            if(trigger_count>=2)
            {
              // 核心逻辑:先比较,再更新
              // 比较当前值和旧值,设置上升标志位
                if(temperature > temperature_old)
                    riseT_flag = 1;
                else
                    riseT_flag = 0;
                if(humidity>humidity_old)
                    riseH_flag=1;
                else
                    riseH_flag=0;
                temperature_old=temperature;
                humidity_old=humidity;
            }
            
            else if(trigger_count==1)
            {
               // 仅记录当前值作为“旧值”,不进行比较
                temperature_old = temperature;
                humidity_old = humidity;
                riseT_flag = 0; // 第一次不判断上升
                riseH_flag = 0;
            }
            
            if(temperature_max<temperature)
                temperature_max=temperature;
            temperature_sum+=temperature;
            temperature_average_10x=(temperature_sum*10/trigger_count);
            
            if(humidity_max<humidity)
                humidity_max=humidity;
            humidity_sum+=humidity;
            humidity_average_10x=(humidity_sum*10/trigger_count);
                
            ctrlRtc[0]=ucRtc[0];
            ctrlRtc[1]=ucRtc[1];
        }
        //无效数据要怎么样处理
        else
        {
            hu_valid_flag=0;
            riseH_flag = 0;
        }
        pick_flag=0;
        
        if((trigger_count>=2)&&(riseT_flag)&&(riseH_flag))
            data_up = 1; // 设置标志位
        else
            data_up = 0;
    }
    
    
}

void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x05;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x00;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
    
    ET1=1;
    EA=1;
}

void Timer1Service() interrupt 3
{
    uwtick++;
    seg_pos=(++seg_pos)%8;
    if(seg_buf[seg_pos]>20)
        seg_disp(seg_pos,seg_buf[seg_pos]-',',1);
    else
        seg_disp(seg_pos,seg_buf[seg_pos],0);
    
    if(++timer_1s==1000)
    {
        timer_1s=0;
        frequency=TH0<<8|TL0;
        TH0=TL0=0;
    }
    
    if(display_flag==1)
    {
        if(++timer_3s==3000)
        {
            display_flag=0;
            timer_3s=0;
        }
    }
    
    //如果没有触发采集
    if(pick_flag==0)
    {
        if(long_press_flag)
        {
            if(++timer_2s>=2000)
                timer_2s=2001;
        }
        else
            timer_2s=0;
    }
    else
    {
        timer_2s=0;
        long_press_flag=0;
    }
        
    if(++timer_100ms==100)
    {
        blink_flag^=1;
        timer_100ms=0;
    } 
    
}

typedef struct
{
    void(*task_func)(void);
    unsigned long int rate_ms;
    unsigned long int last_ms;
}task_t;

idata task_t scheduler_task[]=
{
    {key_proc,10,0},
    {seg_proc,100,0},
    {led_proc,1,0},
    {get_time,100,0},
    {AD_DA,100,0},
    {get_frequency,100,0}
};

idata unsigned char task_num;

void scheduler_init()
{
    task_num=sizeof(scheduler_task)/sizeof(task_t);
}

void scheduler_run()
{
    unsigned char i;
    for(i=0;i<task_num;i++)
    {
        unsigned long int now_time=uwtick;
        if(now_time>scheduler_task[i].last_ms+scheduler_task[i].rate_ms)
        {
            scheduler_task[i].last_ms=now_time;
            scheduler_task[i].task_func();
        }
    }
}

void main()
{
    system_init();
    while(Temperature_Read()==85);
    Set_Rtc(ucRtc);
    scheduler_init();
    Timer0Init();
    Timer1Init();
    while(1)
    {
        scheduler_run();
    }
}
1 个赞