文章目录
赛题感受:
``
由于程序是重写的,重写的程序调试步骤如下:
/**
****************************************************************
* @file main.c
* @author Happy_Bean
* @version v2.0
* @date 2022-05-17
* @brief 蓝桥杯单片机第十三届省赛(第二场)
****************************************************************
* @attention
*
* Diff1. 参数设置界面下退出生效
* Diff2. 超声波测距显示
*/
···
void main(void)
{
ALL_Init(); // 关闭外设初始化
while(1)
{
Key4_Proc(); // 按键扫描函数
ADC_Proc(); // ADC处理函数
SEG_Proc(); // 数码管处理函数
Soinc_Proc(); // 超声波处理函数
LED_Proc(); // LED处理函数
DAC_Proc(); // DAC处理函数
LED_Disp(uc_LED); // LED显示函数
}
}
void Timer1_ISR(void) interrupt 3
{
static unsigned int flag_1s;
// 按键刷新频率
if(++uc_Key_flag == 5)
uc_Key_flag = 0;
// 数码管刷新频率
if(++uc_SEG_flag == 1)
{
uc_SEG_flag = 0;
}
SEG_Disp(puc_SEG_Code,uc_SEG_Position); //数码管显示
if(++uc_SEG_Position == 8) uc_SEG_Position = 0;
// 超声波刷新频率
if(++ui_Sonic_flag == 300)
ui_Sonic_flag = 0;
if(++flag_1s == 100) // 计时0.1s
{
flag_1s = 0;
LED_L8_flag ^= 1;
}
}
···
/**
* @brief DAC处理函数
* @param 无
* @retval 无
*/
void DAC_Proc()
{
static unsigned char output_dianya;
if(Ranging_Show_flag == 0)
{
if(uc_Dist < 20)
output_dianya = 1;
else if((uc_Dist <= 80)&&(uc_Dist >= 20))
output_dianya = 5;
else if(uc_Dist > 80)
output_dianya = (1/15)*(uc_Dist - 20)+1; // 这里算出来的数不一定是整数,需要进行强制类型转换
}
else if(Ranging_Show_flag == 1)
{
output_dianya = 0;
}
PCF8591_DAC((unsigned char)output_dianya*51);
}
···
···
/**
* @brief 数码管处理函数
* @param 无
* @retval 无
*/
void SEG_Proc()
{
if(uc_SEG_flag) return; // 刷新频率
uc_SEG_flag = 1;
Vrb2 = PCF8591_ADC(0x03); // 使用滑动变阻器进行AD转换
Vrb2 = Vrb2*1.96; // 电压扩大1.96倍
dianya_show = Vrb2;
if(uc_SEG_MODE == 1) // 电压显示界面
{
set_para_flag = 0;
dianya_show = (float)dianya_show/100; // 缩小100倍电压,并强制类型转换为float
sprintf(puc_SEG_Buf,"U %3.2f",(float)dianya_show);
}
else if(uc_SEG_MODE == 2) // 测距界面
{
distance = uc_Dist; // 读取实时检测的距离
if(Ranging_Show_flag == 0) // 连续测量标志位为0,进入连续测量界面
{
if(distance > 99) // 测量距离大于三位数,数码管显示3位
{
sprintf(puc_SEG_Buf,"L %03u",(unsigned int)distance);
}
else if(distance <= 99) // 测量距离小于三位数,数码管显示两位
{
sprintf(puc_SEG_Buf,"L %02u",(unsigned int)distance);
}
}
else if(Ranging_Show_flag == 1) // 连续测量标志位为1,退出连续测量界面
{
sprintf(puc_SEG_Buf,"L AAA");
}
}
else if(uc_SEG_MODE == 3) // 参数调整上下限界面
{
dianya_max = max; dianya_min = min;
sprintf(puc_SEG_Buf,"P %02.1f %02.1f",(float)dianya_max,(float)dianya_min);
}
SEG_Tran(puc_SEG_Buf,puc_SEG_Code); // 数码管段码转换
}
···
···
/**
* @brief ADC处理函数
* @param 无
* @retval 无
*/
void ADC_Proc(void) // ADC处理函数
{
if(set_para_flag == 0) // 有效参数界面下,Rb2控制超声波是否进入连续测量
{
// Vrb2中电压扩大了1.96倍,将数据控制在0 - 4.99 总体电压扩大100倍
if((Vrb2 >= min*100)&&(Vrb2 <= max*100)) // 模数转化电压在设定范围内,进入连续测距界面
Ranging_Show_flag = 0; // 在规定范围内,将连续测距标志位置零
else // 不满足设定的电压,退出连续测距界面
Ranging_Show_flag = 1; // 数据不在我们规定的范围内,将连续测距标志位置1,即退出连续测距界面
}
}
···
/**
* @brief 超声波处理函数
* @param 无
* @retval 无
*/
void Soinc_Proc(void)
{
if(ui_Sonic_flag) return; // 刷新频率
ui_Sonic_flag = 1;
uc_Dist = Sonic(); //测距
}
/**
* @brief LED处理函数
* @param 无
* @retval 无
*/
void LED_Proc()
{
if((Ranging_Show_flag == 0)&&(LED_L8_flag == 1))
{
LED_ON(L8);
}
else
{
LED_OFF(L8);
}
if(uc_SEG_MODE == 1)
{
LED_ON(L1); LED_OFF(L2); LED_OFF(L3);
}
else if(uc_SEG_MODE == 2)
{
LED_ON(L2); LED_OFF(L1); LED_OFF(L3);
}
else if(uc_SEG_MODE == 3)
{
LED_ON(L3); LED_OFF(L2); LED_OFF(L1);
}
}
对于本届赛题,省赛考了超声波,这对于后面省赛试题提供了外设考察的多样性。对于每一个模块的驱动,包括串口都不能放下。熟练掌握每一个模块的使用。
以上就是今天要讲的内容,下面为源代码:
源代码阿里云链接
提取码:rd74
gitlab链接
蓝桥杯单片机13届第二场源代码链接1
github链接
蓝桥杯单片机13届第二场源代码链接2
有兴趣的朋友可以看一看
希望这篇文章对你有所帮助。
本人码龄1年,文章有诸多不妥之处,欢迎大家指正。另附上几位小编推荐的文章,感兴趣的朋友可以看一看。
嵌入式组:第十三届第二场蓝桥杯嵌入式主观题讲解
第十三届——蓝桥杯嵌入式第二场
2022年蓝桥杯嵌入式第二场程序题
单片机组:蓝桥杯十三届第二场程序设计
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|
目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言: 在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC 已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析 这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy
使用method_missing时在Ruby中,它是almostalwaysagoodidea定义respond_to_missing?respond_to_missing?接受两个参数;我们正在检查的方法的名称(symbol),以及一个指示我们是否应该在检查中包含私有(private)方法的bool值(include_all)。现在我感到困惑的是:method_missing不接受任何可能指示它是否应该调用私有(private)方法的参数,如respond_to_missing?做。此外,method_missing无论原始方法调用是在公共(public)上下文还是私有(privat
我正在对用户的提要进行分页,并想模拟我正在使用的API的响应。API可以返回奇怪的结果,所以我想确保如果API返回我已经看到的项目,请停止分页。我使用minitest在第一次调用方法get_next_page时stub,但我想在第二次和第三次用不同的值调用它时stub。我应该只使用rSpec吗?ruby新手...这是片段test"crawlerdoesnotpaginateifnonewitemsinnextpage"do#1:A,B#2:B,D=>D#3:A=>stopcrawler=CrawlJob.newfirst_page=[{"id"=>"item-A"},{"id"=>"i
我似乎找不到一种优雅的方式来做到这一点......给定一个日期,我如何找到下一个星期二,即日历月的第2个或第4个星期二?例如:给定2012-10-19然后返回2012-10-23或给定2012-10-31然后返回2012-11-13OctoberNovemberSuMoTuWeThFrSaSuMoTuWeThFrSa12345612378910111213456789101415161718192011121314151617212223242526271819202122232428293031252627282930 最佳答案
?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是: 如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。 如果m不为0,则将时读出来,然后将分读出来,如5
以下代码使用了触发器运算符。(1..10).each{|x|print"#{x},"ifx==3..x==5}为什么结果是3,4,5?我觉得应该是3,4。如教程中所述,此表达式在x==3时为真,并一直为真,直到x==5。如果“5”的计算结果为false,如何打印它?谁能为我澄清一下? 最佳答案 来自“TheRubyProgrammingLanguage”的重要链接是:4.6.9.1Booleanflip-flopsWhenthe..and...operatorsareusedinaconditional,suchasanifstat
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
这个问题在这里已经有了答案:HowtoreturnapartofanarrayinRuby?(6个答案)关闭8年前。我的方法:defscroll_imagesimages_all[1..images_all.length]end我不喜欢调用images_all两次,只是想知道是否有一个好的技巧来调用self或类似的东西来使它更干净一些。