第十二届蓝桥杯国赛总结

第十二届蓝桥杯国赛总结

前言:
考完省赛感觉蓝桥杯真水,考完国赛我感觉是我太水了。

在拿到编程题目以后我的感觉只有不知如何开始,虽然考点平时都有练过,各种优化、一些好的思想都应用过,比如以前介绍过的寄存器思想,状态机,结构体优化,模块化编程。。。但这次我感觉难度不亚于第十届国赛,是因为这次国赛对基础和逻辑处理能力还是比较高的要求,我也很高兴能够做这样的题目。下面就个人在本次编程中的优点进行解析。

1.超声波测距条件之定时模式

在超声波测距模式为定时模式时:超声波以规定的时间周期进行采样;
假设 x:为采样时间 (方法见下)
由于题目用到了DS1302所以我们假设 timer_init[2] : 用其秒值

方法就是 if(!(timer_init[2] % x) == 0)
即实现触发以后距离下次触发需要‘x’秒的效果;
触发以后就可以检测一次超声波了;但同时也伴随问题出现,就是可能在这一秒内多次触发,这里我用了笨方法,做一个标志位采集上一次触发的时间,如果上一次触发时间和本次触发时间相同的话就不进行采样了;

采样时间方法:
题目要求采样时间是2,3,5,7,9;
我用的数组包含进去了,然后做个标志位,通过不断控制标志位的加而改变数组显示的内容;
例如:
unsigned char csb_delay[5] = {2,3,5,7,9};
unsgned char number;
如果我想改变显示值,我就只需要改变number就可以了,最后处理时显示csb_delay[number];

2.超声波测距条件之触发模式

这里用了状态机

static unsigned char mode; 
switch(mode)
{
     
	case 0:  //等亮
		if(ad_number > 70) //光敏电阻阻值
		{
     
			mode = 1;
		} 
		break;
	case 1:  //等暗 
		if(ad_number <= 70) //光敏电阻阻值
		{
     
			csb_number = read_csb_fun(); //测距
			mode = 0;//仅触发一次
		} 
		break;
}

好处是遮挡以后仅触发一次,不需要标志位。 而且扩展性和功能性都比较强,如果题目换成遮挡后松开,仍然可以应对。

3.超声波测距距离参数比较近时

这里我突发奇想,想到了一个绝顶的妙招。

//csb_number: 超声波距离
//csb_data:  超声波参数
if(((csb_number  - 5) > csb_data) || ((csb_number  + 5) < csb_data)))
{
     

}
else
{
     
		//说明超声波测距距离参数比较近
}
//思想是:如果测距结果很小 + 误差 也小于参数时;说明比参数小得多;
//     	 如果测距结果很大 - 误差 也大于参数时;说明比参数大得多;

这里不太好理解,大概解释下原理:

如果测距长度 > 规定参数时
呢末就不需要考虑 (csb_number + 5) < csb_data) 这部分;
只需要考虑:参数 - 误差 是否还大 数据
如果仍然大于 说明其误差大于误差范围;

如果测距参数 < 规定参数时
就不需要考虑 (csb_number - 5) > csb_data) 这部分;
只需要考虑:参数 + 误差 是否小于 数据
如果仍然小于 说明其误差小于误差范围;

如果不满足反之说明在误差范围内;
汇成一句话:加针对小,减针对大

4.其他

1.最大最小平均值

最大值初始值为:0;
最小值初始值为:999;
再将采集的值和最大值,最小值比较,即可 没啥讲的,但为什么这么设计,原因很简单,你反过来试试就知道了;

2.DAC输出

这个和省赛比较像,初中生问题!会解方程就行。
设 y = kx +b; (x: 为距离 y:为输出DA值)
x = 10; y = 51; x = 80; y = 255;
解得: y = 3x + 21;

3.控制好运行模式切换

这点就很重要了,可以采用以前说的寄存器思想,不断改变寄存器的值,在显示服务函数中检测寄存器的状态来达到不同的显示结果。

你可能感兴趣的:(蓝桥杯国赛,c语言)