前言:
本文详细解析了蓝桥杯单片机第十二届国赛真题
本篇所示代码已实现所有功能,但因4t上无相关真题的测评,不排除会有未发现的bug,文章最后会附上完整工程,有需要的同学自行提取
一.测量模式
1.定时模式
定时模式相对来说比较容易实现,如果时钟底层用的是十六进制来写入的时间数据,可以设置一个变量将十六进制转化为十进制再去余采集时间参数,或者直接使用十进制的时钟底层(具体可以看另一篇文章-ds1302模块)
值得注意的是当该秒满足触发条件时有1s的满足时间(例如2s初到2s末),而在这段时间内时
距离数据是在不断读取的,会造成数据跳动,所以我们使用标志位1s读取一次距离
2.触发模式
通过光敏电阻采集的亮暗变化状态进行触发,即判断上一次的状态和这一次的状态进行比较,若满足从亮到暗则进行一次数据采集
二.数据计算(最大值 最小值 平均值)
1.最大值最小值的判断
if(ucRtc[2]%time_record==0)
{
right=1;
if(old_length!=0)
{
if(maxlength==0)maxlength=old_length;
else if(maxlength!=0)
{
if(length>=maxlength)maxlength=length;
}
if(minlength==0)minlength=old_length;
else if(minlength!=0)
{
if(length!=0&&length<minlength)minlength=length;
}
}
if(length!=0)
{
old_length=length;
}
}
2.平均值
if(count4>=1000)
{
flag_length=1;
length=len;
if(length!=0)
{
num++;//记录次数
sumlength+=length;//总值
count4=0;
right=0;
}
}
//平均值=总值*1.0/次数
三.连续测量
要连续三次满足距离条件
可以设一个变量,满足条件时,变量加一,一旦不满足条件直接将其值清零,最后再判断该变量的值是否大于等于3
if(lengthmode==1)
{
if(length>=(length_record*10-5)&&length<=(length_record*10+5))
{
i++;
if(i>=3)Led_Config(4,1);
}
else if(length<(length_record*10-5)||length>(length_record*10+5))
{
i=0;Led_Config(4,0);
}
}
四.超声波误差问题
#include <STC15F2K60S2.H>
#include <intrins.h>
sbit TX=P1^0;
sbit RX=P1^1;
void Delay14us() //@12.000MHz
{
unsigned char data i;
_nop_();
_nop_();
i = 38;
while (--i);
}
void WaveInit()
{
unsigned char i;
EA=CR=0;//让超声波更稳定
for(i=0;i<10;i++)
{
TX=1;
Delay14us();
TX=0;
Delay14us();
}
EA=CR=1;
}
unsigned char csb()
{
unsigned int time;
CMOD=0x00;
CH=CL=0;
WaveInit();
CR=1;
while((RX==1)&&(CF==0));
CR=0;
if(CF==0)
{
time=CH<<8|CL;
return (time*0.017+2);//经实际测量 手动校准加2
}
else
{
CF=0;
return 0;
}
}
五.完整工程链接
链接:https://pan.baidu.com/s/11ETRR727S8ISoush9FQxTw?pwd=1111
提取码:1111