第十二届省赛(第一次)总结纠错

第十二届省赛题出现的问题

问题1:数码管显示与要求不相符

问题的原因:浮点数计算精度导致显示不准确

解决方案 : 强制显示 , 电压输出不与显示绑定,避免浮点数计算精度导致显示不准确扣分

switch(Seg_Disp_Mode)
    {
        case 0://温度显示界面
            Seg_Buf[0] = 11;//C
          Seg_Buf[4] = (unsigned char)(Degree / 10.0);
            Seg_Buf[5] = (unsigned char)Degree % 10;
            Seg_Point[5] = 1;
            Seg_Buf[6] = (unsigned char)(Degree * 10) % 10;
            Seg_Buf[7] = (unsigned char)(Degree * 100) % 10;
        break;
        
        case 1://参数设置界面
            Seg_Buf[0] = 12;//P 
            Seg_Buf[4] = 10;//熄灭,4,5位数码管
            Seg_Buf[5] = 10;
            Seg_Point[5] = 0;//熄灭小数点
            Seg_Buf[6] = (unsigned char)(Degree_Standard / 10) % 10;
            Seg_Buf[7] = Degree_Standard % 10;
        break;
        
        case 2://DAC输出界面        
            if(Voltage_Mode == 0)//模式1
            {               
                if(Degree < Degree_Standard)
                {
                    Voltage_Output = 0.00;
                Seg_Buf[0] = 13;//A
                Seg_Buf[4] = 10;//熄灭第4位数码管
                Seg_Point[5] = 1;//点亮小数点
                Seg_Buf[5] = 0;
                Seg_Buf[6] = 0;
                Seg_Buf[7] = 0;
                }                   
                else
                {
                    Voltage_Output = 5.00;  
                Seg_Buf[0] = 13;//A
                Seg_Buf[4] = 10;//熄灭第4位数码管
                Seg_Point[5] = 1;//点亮小数点
                Seg_Buf[5] = 5;
                Seg_Buf[6] = 0;
                Seg_Buf[7] = 0;
                }                   
            }               
            else                                //模式2
            {               
                if(Degree < 20.0)
                {
                    Voltage_Output = 1.00;
                Seg_Buf[0] = 13;//A
                Seg_Buf[4] = 10;//熄灭第4位数码管
                Seg_Point[5] = 1;//点亮小数点
                Seg_Buf[5] = 1;
                Seg_Buf[6] = 0;
                Seg_Buf[7] = 0;
                }                   
                else if(Degree > 40.0)
                {
                    Voltage_Output = 4.00;
                Seg_Buf[0] = 13;//A
                Seg_Buf[4] = 10;//熄灭第4位数码管
                Seg_Point[5] = 1;//点亮小数点
                Seg_Buf[5] = 4;
                Seg_Buf[6] = 0;
                Seg_Buf[7] = 0;
                }                   
                else
                {
                    Voltage_Output = (Degree-20)* 0.15 + 1.00;
                Seg_Buf[0] = 13;//A
                Seg_Buf[4] = 10;//熄灭第4位数码管
                Seg_Point[5] = 1;//点亮小数点
                Seg_Buf[5] = (unsigned char)Voltage_Output;
                Seg_Buf[6] = (unsigned char)(Voltage_Output * 10) % 10;
                Seg_Buf[7] = (unsigned char)(Voltage_Output *100) % 10;
                }                   
            }           
        break;          
    }   

每一次情况都单独显示,不全都使用voltage_output作为变量控制

问题2:DAC输出结果全都是0.00

函数中的代码部分

    Voltage = AD_Read(0x43) / 51.0;//实时读取电压
    Voltage_DA = Voltage;
    DA_Write((unsigned char)(Voltage_DA*51.0));//实时输出电压值

尝试过的解决方法:

1.把DA通道改成0x40,结果无影响.

2:加入 t*= 12;,*结果反而直接显示错乱了(onewire.c中) ps:看12省赛讲解视频的时候有网友指出24年之后官方给的底层改动了不需要加入t*=12,加了会乱.

3.不管加没加unsigned char 强制转换voltage_DA都输出为0.00

(今天没有免费次数了明天更新)

______________________分割线___________________________

补充:DA输出DA_Write(Voltage_Output)不与ad read挂钩,每次的da输出与模式要求输出(题目要求而非ad read的数值)挂钩,这也是第一次看课程没有领悟的点,但是依然有个别da输出出现问题,总体分数达到了95分(边际效应考虑所以决定不深究了)

类似于这样但是能过cc的检测

image