蓝桥杯单片机:关于任意条件下的遮光检测

本文介绍了在不同光照条件下,如何通过STC15F2K60S2单片机实现精确的光敏电阻遮光检测,包括实时调整初始光照值、防止误测和漏测的策略,以及针对比赛要求的代码优化方法。
摘要由CSDN通过智能技术生成

//本次讲解基于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;

一次触发,调整标准值,降低标准值后当光照提高不影响触发同时标准值恢复

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值