蓝桥备赛实战问题记录

靡不有初,鲜克有终。


1、关于超声波小数位

1m = 100cm  
声速:340m/s
假设一个机器周期是12个时钟周期,对应晶振12M
×个机器周期(us)*10^-6(us换算成s)*340(m/s)/2(来回)*100(换算成cm)*10(取小数点后一位) = 0.17对应小数点后有一个小数

所以 time * 0.17 对应的距离单位cm带小数点后一位

2、还要注意设置DAC输入参数或者ADC返回值,对应的的电压都是实际电压扩大是十倍以后的!

比如5V对应val50

今天写第八届国赛题的部分代码截图如下。

这里写图片描述

3、E2初始化的问题

注意了,初始化E2必须这样写:


void ResetE2()
{
    u8 i, dat=1;

    for(i=0; i<10; i++)
    {
        E2Write(&dat, i, 1);
    }
}

E2Write(0, i, 1); //这样直接写数据是不行的!

4、按键按下显示,弹起不显示数据的技巧总结

涉及例题可参考:
《第九届省赛_彩灯控制器》

这里写图片描述

《第八届省赛_电子钟》

这里写图片描述

emm,,其实仔细想想也就那么点东西,很多也都是套路的堆砌!

5、关于实现数码管闪烁

模拟电子钟:

这里写图片描述

彩灯控制器:
这里写图片描述

关键理解思想咯。。。。

6、关于实现LED闪烁

第八届国赛:

这里写图片描述

第八届省赛:
这里写图片描述

7、关于实现数码管闪烁同时自加自减操作总结

数码管闪烁,需要注意的是加上一个总的开关,只有处于时钟设置状态下才打开。因为放到while(1)里面扫的,这样做还能避免耽误其他程序的执行!
这里写图片描述

还有这个闪烁以及自加自减通常出现在那种电子钟的题目中,那么对应肯定是得有时、分、秒的闪了,如何实现对应的闪烁呢?
是这样处理的:

先设置两个标志位,一个控制总的逻辑上的索引,SetClkIndex,另一个控制实际位置的光标,SetClkCursor。同时注意他们各自的取值范围!是不一样的!

这里写图片描述

具体怎么设置光标处于何种位置呢,是先操作索引SetClkIndex,然后调用LedSetCursor设置SetClkCursor

这里写图片描述

比如,程序中的某一段的使用:
这里写图片描述

现在能定位光标,也能让数码管闪烁了,接下来就是自加和自减的问题了。

这时候就能初步体会到SetClkIndex的好处了,
这里写图片描述

我数码管闪烁的本质就是不断的开关,而再开的时候就有一个难点了,当前对应的数码管是哪个,对应的值是多少,这个其实我们并不容易得到,但是我们也不必管,只需要关了对应的单元,然后刷新数码管的时间,注意了不是实时刷新,因为Refresh(0)中的参数写的是0!然后只需要我们操作buffTime这个结构体自加和自减就行了!

再来看下IncBcdDecBcd的实现:

u8 IncBcd(u8 bcd, bit i)
{
    bcd += 0x01;
    if((bcd&0x0F) == 0x0A)
    {
        bcd &= 0xF0;
        bcd += 0x10;
    }

    if(i == 1)
    {
        if(bcd == 0x24)//0~24
        {
            bcd = 0x00;
        }
    }
    else//0~59
    {
        if(bcd == 0x60)
        {
            bcd = 0x00;
        }
    }

    return bcd;
}

u8 DecBcd(u8 bcd, bit i)
{
    bcd -= 0x01;
    if((bcd&0x0F) == 0x0F)
    {
        bcd = (bcd&0xF0) | 0x09;
    }

    if(i == 1)
    {
        if(bcd == 0xF9)//注意了0-1=0xFF,但是前面有对低位是F变为9的操作,故这里是判断0xF9!!
        {
            bcd = 0x23;
        }
    }
    else
    {
        if(bcd == 0xF9)
        {
            bcd = 0x59;
        }
    }

    return bcd;
}

两点需要注意的:
1、输入参数中 i 的作用,是为了hour的处理加入的,小时0~23,其余0~59

2、还有减的时候,0再减1就是0xFF了,然后由于我们前面对低位是F的情况进行了变9的操作,所以应该判断是否为0xF9

8、本次赋值和上次赋值完成后记得更新上次赋值

这里写图片描述

9、频率计的计数记得清零哇

这里写图片描述

10、一个子系统下,两种工作模式切换的总结

以频率界面为例

s5 - 更新系统状态:
这里写图片描述

s4 - 改变频率界面的两种工作模式

这里写图片描述

具体实现:
这里写图片描述

11、关于测555频率时,定时器配置。

以T0为例,即P34口。定时器的初值设置为0xFF,TMOD设置为0x04!

然后,1s监控的地方1s到了记得清零计数啊!

    TH0 = 0xFF;
    TL0 = 0xFF;
    TMOD &= 0xF0;
    TMOD |= 0x04;
    ET0 = 1;
    TR0 = 1;

12、关于时钟赋值,BCD的高位和低位到底是什么,注意了!

傻逼了我,思路写题写的有点不清晰了

这里写图片描述

13、突发奇想的长按键

好久没写过这个了,突然想到会不会国赛涉及到,今晚也就顺便来了一波,还能写出来,甚是欣慰,还是那句话,一定要学会理解它!

具体实现呢,再来赘述下,就是阈值和按下时间的比较,然后执行动作。
这里写图片描述

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/recclay/article/details/80400136