//本次讲解基于STC15F2K60S2
利用光敏电阻RD1检测遮光,很多小伙伴在写题时完成的都是特定情况下的检测,such as:
设定固定值,外界环境一变就得重新修改、轻微的晃动被误认为检测……
理想条件下的遮光检测并不难,难点在于如何在过亮或者过暗情况下实现不误测、不漏测。
接下来就讲一讲几个要点:
1,及时调整初始光照值:
这个初始光照值不应该只在开机的时候进行设定,而应该在开机后逐渐变化的时候进行及时调整;
以十四届省赛为例,如果实验环境从弱光转至强光,需要将判断的标量提升;
而从强光转至弱光,则分为两种情况:应检测的遮光条件或者实验环境自然变暗;
liangdu=pcfad(0x41);
if(liangdu>=value)value=liangdu;
else if((value-liangdu)<10)value=liangdu;
else{flag_a++;value=liangdu;}
每一次获得光照值后,利用liangdu(unsigned char)进行储存,然后根据光照值的突变进行判断;
但是BUG的问题就在于,这个突变值是否会因为对光照值多次采集而逐渐减小,从而导致突变难以识别;
所以采集频率也是影响的关键,当然,如果采用更多的变量可以将整个逻辑层次理得更加清晰,但是需要统计的是变化的次数,工作量会增加很多,因此选择调整采集频率,尽量规避问题足以应付省赛的要求;
2,不误测:
以十二届国赛为例,满足条件触发超声波检测,这里的判断我没有使用随着环境改变的方法,但是多增加了一个变量,保证单一检测
if(((value+35)<liangdu)&&(point==0))point=1;
if(point==1){csb();point=2;}
if(value+15>=liangdu){point=0;}
其实这样的代码已经能够应付绝大部分要求了,如果想要追求满分,是没有统一的模板的,一下代码是我在十二届国赛题中放弃的优化,大家可以参考
if((value<liangdu&&value+25<liangdu)&&point==0)point=1;
if(point==1){csb();point=0;}
if(liangdu>value+20)liangdu=value;
if(liangdu<value)liangdu=value;
一次触发,调整标准值,降低标准值后当光照提高不影响触发同时标准值恢复