靡不有初,鲜克有终。
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
对应val
为50
今天写第八届国赛题的部分代码截图如下。
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
这个结构体自加和自减就行了!
再来看下IncBcd
和 DecBcd
的实现:
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、突发奇想的长按键
好久没写过这个了,突然想到会不会国赛涉及到,今晚也就顺便来了一波,还能写出来,甚是欣慰,还是那句话,一定要学会理解它!
具体实现呢,再来赘述下,就是阈值和按下时间的比较,然后执行动作。