笔记包括:①题目难点解析、②易出错点提示、③完整代码链接
注:本文提供的所有代码都是使用第十四届竞赛包完成
⭐系列文章链接⭐
【蓝桥杯单片机】十四届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十三届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十二届省赛“重难点”解析(附源码)
【蓝桥杯单片机】十一届省赛“重难点”解析(附源码)
一、题目难点解析
- 性能要求中:设定的温度参数在退出参数设置界面是有效
解释
:“有效”指的是进行了“温度参数”与“实际温度”的比较,且能够用万用表测得模拟输出有变化。
题意指,参数界面只负责显示温度参数,但并不进行温度参数与实际温度的比较,设置的温度参数并不是立即生效,故在参数界面下改变温度参数后,用万用表测模拟输出仍然是一个固定的值。
只有退出参数界面(进入DAC输出界面)时才生效,万用表测模拟输出的值有所变化。
方法
:在数码管显示中的dac界面(stat_smg == 3 即 case 3)中,将温度参数(temp_param)赋值给专门用来比较的温度变量(param)。
退出参数设置界面后,下一个正是dac界面,满足了退出后参数有效的要求
- DA转换:
方法
:代码如下
void DA_out(unsigned char dat)
{
I2CStart();
I2CSendByte(0x90); //PCF8591的写设备地址
I2CWaitAck();
I2CSendByte(0x43); //输出DAC,转换AIN3
I2CWaitAck();
I2CSendByte(dat); //设置DAC电压输出参数
I2CWaitAck();
I2CStop();
}
unsigned int smg_dac = 0; //数码管显示的数字量
void Mode_Work()
{
unsigned char data_dac = 0;
Read_Temp();
switch(mode)
{
case 1:
if(real_temp < param) //与退出参数设置界面后生效的温度参数相比较
smg_dac = 000; //float real_temp; 实际温度(带小数点)
else
smg_dac = 500;
break;
case 2:
if(real_temp < 20)
smg_dac = 100;
else if(real_temp < 40)
smg_dac = 15 * real_temp - 200;
else
smg_dac = 400;
break;
}
data_dac = smg_dac * 0.51; //精度换算为模拟量 5V(数码管上显示为500)对应255,255/500=0.51
DA_out(data_dac); //输入数字量,输出模拟量(在板子上用万用表测)
}
二、易出错点提示
- 温度显示两位小数
方法
:乘以分辨率后的数值,再乘以100,将两个小数位移到整数位,便于数码管处理
//float real_temp; 实际温度(带小数点)
//unsigned int smg_temp; 数码管上显示(四位整数)
//unsigned int temp; 乘以分辨率之前的原始温度数据
if((temp & 0xf800) == 0x0000) //判断前五位是否为0(为0即获取的温度为正数)
{
real_temp = temp * 0.0625;
}
smg_temp = real_temp * 100; //数码管上显示四位数字,故将小数位的两位提到整数位
SMG_Display();
- 为不影响数码管显示和数据采集过程,可以在按键松手检测的while语句中刷新相关函数
三、完整代码链接
下面提供了12届蓝桥杯单片机省赛代码,依据小蜜蜂老师风格编写
网盘链接:12届蓝桥杯单片机省赛代码-饥饿的半导体(提取码:1212)
本文是在博主练习完部分省赛题目后总结的笔记
文章为本人对试题的观点,难免有所欠缺,欢迎大家在评论区里共同讨论