第14届蓝桥杯单片机模拟测试题解
创作时间:
作者:
@小白创作中心
第14届蓝桥杯单片机模拟测试题解
引用
CSDN
1.
https://blog.csdn.net/m0_72632761/article/details/146849273
本文分享了第14届蓝桥杯单片机模拟测试的题目及解答,详细描述了按键功能、显示功能、串口功能和LED指示灯功能,并提供了完整的主函数代码。文章内容完整,结构清晰,对单片机爱好者和参赛者具有一定的参考价值。
按键功能
S4界面切换,S8将当前的距离设置为距离参数,S12,S16参数加减,注意上限和下限。通过题目,我们可以得知下限是0,再根据数码管的显示,我们得到上限是三位数,所以上限就是不到1000。
S9把当前距离发送给串口,通过sprintf格式化字符串在发送数据,%d对应的是整型数据,%f是浮点型,%c字符
/*按键函数区域*/
void Key_Proc(){
if(Key_Slow) return;
Key_Slow = 1;
Key_Val = Key_Read();
Key_Down = Key_Val & (Key_Val ^ Key_Old);
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
Key_Old = Key_Val;
switch(Key_Down){
case 4://切换距离显示和参数显示
Seg_Mode^=1;
break;
case 8://在距离显示界面按下s8可以吧当前距离变成距离参数
if(Seg_Mode == 0){
distant_val = distant;
}
break;
case 9://串口发送
sprintf(Uart,"Distance:%dcm",(unsigned int)distant);//格式处理
Uart_Send_String(Uart);
break;
case 12://在距离参数界面有效,加10cm
if(Seg_Mode){
distant_val = distant_val < 990?distant_val+10:distant_val;//上限设置为三位数
}
break;
case 16://在距离参数界面有效,减10cm,直到0
if(Seg_Mode){
distant_val = distant_val<10?0:distant_val-10;
}
break;
}
}
显示功能
一个通用的标志符号U 和一个对应界面的标识,熄灭三位,然后显示距离和距离参数,高位熄灭。
/*数码管函数区域*/
void Seg_Proc(){
if(Seg_Slow) return;
Seg_Slow = 1;
distant = ultra_rec();//获取当前超声波距离值
Seg_Buf[0] = 11;//U
Seg_Buf[1] = Seg_Mode +1;
Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = 10;//熄灭三位
if(Seg_Mode==0){//距离显示界面
Seg_Buf[5] = distant>=100?distant/100:10;
Seg_Buf[6] = distant>=10?distant%100/10:10;
Seg_Buf[7] = distant%10;
}
else{//参数显示界面
Seg_Buf[5] = distant_val>=100?distant_val/100:10;
Seg_Buf[6] = distant_val>=10?distant_val%100/10:10;
Seg_Buf[7] = distant_val%10;
}
}
串口功能
保留整数我们用%d再把数据强制类型转换成整型
sprintf(Uart,"Distance:%dcm",(unsigned int)distant);//格式处理
Uart_Send_String(Uart);
/*串口初始化区域*/
void Uart1_Service() interrupt 4
{
}
串口中断必须写上,就算没有用上。串口中断里面一般我们用来接受串口数据。
Led指示灯功能
也是很常规的界面点亮灯,条件闪烁灯。界面点亮判断界面就可以,条件判断定义一个标志位来计时闪烁就行。
void Led_Proc(){
Led_Buf[0] = (Seg_Mode ==0);
Led_Buf[1] = (Seg_Mode ==1);
if(distant>distant_val){
Led_Buf[2] = L3_Flag;
}
else Led_Buf[2] = 0;
}
这里我选择让L3_flag一直闪烁,符合条件了,我就把闪烁值赋值给led灯,不符合条件就熄灭led3灯.
完整主函数
/*头文件区域*/
#include <STC15F2K60S2.H>
#include <Led.h>
#include <Key.h>
#include <Init.h>
#include <Seg.h>
#include <ultrasound.h>
#include <Uart.h>
#include <stdio.h>
/*参数变量区域*/
unsigned char Seg_Slow,Key_Slow;
unsigned char Key_Down,Key_Old,Key_Up,Key_Val;
unsigned char Seg_Pos;
//数组
unsigned char Seg_Buf[] = {10,10,10,10,10,10,10,10};
unsigned char Led_Buf[] = {0,0,0,0,0,0,0,0};
unsigned char Point[] = {0,0,0,0,0,0,0,0};
unsigned char Uart[20];
//标志位
bit L3_Flag;//L3闪烁标志位
unsigned char Timer_200ms;
//数据
unsigned char Seg_Mode;//0距离显示界面,1参数显示界面
unsigned char distant;
unsigned char distant_val = 30;//默认距离参数是30cm
/*按键函数区域*/
void Key_Proc(){
if(Key_Slow) return;
Key_Slow = 1;
Key_Val = Key_Read();
Key_Down = Key_Val & (Key_Val ^ Key_Old);
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);
Key_Old = Key_Val;
switch(Key_Down){
case 4://切换距离显示和参数显示
Seg_Mode^=1;
break;
case 8://在距离显示界面按下s8可以吧当前距离变成距离参数
if(Seg_Mode == 0){
distant_val = distant;
}
break;
case 9://串口发送
sprintf(Uart,"Distance:%dcm",(unsigned int)distant);//格式处理
Uart_Send_String(Uart);
break;
case 12://在距离参数界面有效,加10cm
if(Seg_Mode){
distant_val = distant_val < 990?distant_val +10:distant_val;//上限设置为三位数
}
break;
case 16://在距离参数界面有效,减10cm,直到0
if(Seg_Mode){
distant_val = distant_val<10?0:distant_val-10;
}
break;
}
}
/*数码管函数区域*/
void Seg_Proc(){
if(Seg_Slow) return;
Seg_Slow = 1;
distant = ultra_rec();//获取当前超声波距离值
Seg_Buf[0] = 11;//U
Seg_Buf[1] = Seg_Mode +1;
Seg_Buf[2] = Seg_Buf[3] = Seg_Buf[4] = 10;//熄灭三位
if(Seg_Mode==0){//距离显示界面
Seg_Buf[5] = distant>=100?distant/100:10;
Seg_Buf[6] = distant>=10?distant%100/10:10;
Seg_Buf[7] = distant%10;
}
else{//参数显示界面
Seg_Buf[5] = distant_val>=100?distant_val/100:10;
Seg_Buf[6] = distant_val>=10?distant_val%100/10:10;
Seg_Buf[7] = distant_val%10;
}
}
/*Led函数区域*/
void Led_Proc(){
Led_Buf[0] = (Seg_Mode ==0);
Led_Buf[1] = (Seg_Mode ==1);
if(distant>distant_val){
Led_Buf[2] = L3_Flag;
}
else Led_Buf[2] = 0;
}
/*串口初始化区域*/
void Uart1_Service() interrupt 4
{
}
/*定时器0初始化区域*/
void Timer0_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xFC; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
/*定时器0中断服务函数区域*/
void Timer0_Service() interrupt 1
{
if(++Seg_Slow == 100) Seg_Slow = 0;
if(++Key_Slow == 50) Key_Slow = 0;
if(++Seg_Pos == 8) Seg_Pos = 0;
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Point[Seg_Pos]);
Led_Disp(Seg_Pos,Led_Buf[Seg_Pos]);
if(++Timer_200ms == 200){
L3_Flag ^= 1;
}
}
/*主函数区域*/
void main(){
Uart1_Init();
Timer0_Init();
Sys_Init();
while(1){
Key_Proc();
Seg_Proc();
Led_Proc();
}
}
热门推荐
北京推出中小学“体育八条”,如何让“流汗的体育课”天天见?
如何避免婚姻中出现冷漠、不沟通、不关心等现象
月嫂分享:新生儿出生一个月20个护理重点,新妈必收!
历史视角下的黄巢:英雄还是反贼?
眼科共聚焦显微镜主要检查什么
肥胖导致疾病
短视频审核纠正机制:构建内容生态的自我修复系统
趣味数独:区块排除法
看各个隶书碑帖有什么不同,你喜欢那个风格的隶书?
肺癌骨转移,中药调理有效吗?听听成都普济中医陈小平主任怎么说
将学生公寓改建为集体生活空间:城市社区生活的新篇章
家用抽油烟机怎么选择?建议:宁可多花点钱,也要坚持“5不买”
“面”向湖北,一碗面的烟火情长
天罚与神罚:古代社会中的神秘惩罚机制
家长如何帮助孩子建立积极的自我认同
新建大棚如何进行土壤改良?
为什么引力越强时间越慢?时间到底是主观的还是客观的?
哪些书籍适合深度学习入门?
拉普拉斯妖:命运的科学与哲学探讨
如何面对内心的愤怒和暴力冲动
一文详解!2025年注会报考条件及专业要求
手机屏幕触点校正指南,简单步骤与实用技巧
吃早餐的减肥效果被夸大了
青岛市南区租房价格全解析及青岛栈桥简介
春运火车票进入最后抢票冲刺阶段,网络售票“候补”功能你用对了吗?
竞选失败后,作为普通公民的哈里斯,将去哪里打工?
浙江文科院校排名及分数线一览表(2025年参考)
虚拟现实电影院对观众体验的重要性及影响
东北地区中小城市人口流动影响因素分析
四级文明究竟有多可怕?为什么科学家从来不提四级文明?