这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【原创】关于准备蓝桥杯的心得与体会--from明

共2条 1/1 1 跳转至

【原创】关于准备蓝桥杯的心得与体会--from明

工程师
2025-03-17 21:21:22     打赏

一、知识储备搭建

1、硬件知识学习:蓝桥杯单片机赛道基于 STC15 系列单片机,我首先对该单片机的硬件架构进行深入学习。从芯片手册入手,掌握其引脚功能、内部资源(如定时器、中断系统、串口通信等)。通过阅读大量相关技术文档,理解各个模块的工作原理,像定时器如何通过设置初值来实现精确计时,中断系统怎样在特定事件发生时改变程序执行流程等。同时,学习了外围电路知识,包括 LED、数码管、按键、温度传感器 DS18B20、红外通信模块等的硬件连接和驱动原理。例如,明白数码管的共阴极和共阳极接法区别,以及如何通过译码电路实现数字显示。

2、软件编程积累:在软件方面,以 C 语言为编程工具。针对单片机编程特点,重点学习了寄存器操作和模块化编程。深入理解如何通过对单片机寄存器的配置来控制各个功能模块,如通过设置定时器相关寄存器来启动定时器、设置中断允许寄存器来开启中断。同时,将不同功能封装成独立的函数模块,如 LED 控制函数、数码管显示函数、按键扫描函数等,提高代码的可读性和可维护性。在学习过程中,参考了许多开源代码示例,分析优秀代码的结构和逻辑,不断积累编程技巧。

 

二、编程的模块化思想

1、模块化的概念:模块化编程是把一个大型程序按照功能划分为若干个较小的、相对独立的模块,每个模块负责完成一个特定的任务。这些模块可以单独开发、测试和维护,最后再组合在一起形成完整的程序。 

2、可维护性:当程序出现问题时,只需要检查和修改相关的模块,而不需要对整个程序进行大规模的改动。可重用性:一个模块可以在不同的程序中多次使用,减少了代码的重复编写。可读性:模块化的代码结构清晰,每个模块的功能明确,便于理解和阅读。并行开发:不同的开发人员可以同时负责不同的模块,提高开发效率。

3、模块化的实现方式:在C语言中包含.c(源文件)文件,.h(头文件)文件。源文件(.c)一般用于实现头文件中声明的函数和变量,源文件包含了模块的具体实现代码。简单来讲源文件就是实现某些函数的具体功能,而头文件通俗来讲可以比喻成一个工具箱,它告诉你工具在哪个地方,你只需用调用即可,如果在源文件中没有引用头文件的话会使函数报错从而功能无法实现。

4、在蓝桥杯比赛当中常用的头文件有ledsegkeyonewireiic

三、蓝桥杯的主体框架

在学习蓝桥杯的过程中最基础但最为重要的就是大模板,简单来说就是蓝桥杯的主体框架。

1、/*头文件声明区*/

#include <STC12C5A60S2.H>

#include "System.h"

#include "Key.h"

#include "Seg.h"

#include "ds1302.h"

#include "onewire.h"

#include "Led.h"

#include "iic.h"

头文件声明区就是源文件中实现函数功能的入口,通过头文件可以实现不在源文件中的函数功能,从而使得主函数里面的内容更让你更加简洁,更加层次化,增项了代码的可读性与观赏性,同时也是的bug变得更加容易修复。

2

/*变量声明区*/

 

//延时

unsigned char Key_Slow_Down;   //按键减速专用变量

unsigned int Seg_Slow_Down;   //按键减速专用变量

unsigned char Led_Slow_Down;   //按键减速专用变量

unsigned char Seg_Mode;

unsigned char Voltage_Mode;

unsigned int Freq;

unsigned int cycle;

float Voltage;

float Voltage_Control;

unsigned char Freq_Control;

 

 

unsigned char Key_Val,Key_Down,Key_Up,Key_Old;

//Seg

unsigned char Seg_Buf[] = {10,10,10,10,10,10,10,10};  //数码管显示专用数组

unsigned char Seg_Point[] = {0,0,0,0,0,0,0,0};       //数码管小数点显示专用数组

//Led

unsigned char uLed[]={0,0,0,0,0,0,0,0};

//Timer

unsigned char Seg_Pos;

unsigned int Time_1000Ms;

unsigned int Time;

unsigned int T;

unsigned char i;

unsigned char Long_press;

3

/*按键处理区域*/

void Key_Proc()

{

 if(Key_Slow_Down) return;

 Key_Slow_Down = 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;

通过按键处理区你可以将你在蓝桥杯开发板按下的键码返回给单片机并被它识别,从而实现相应的按键功能。比如,按键功能具体包含按键加、按键减、界面切换等功能从而实现不同界面的转化和加法减法功能。

4

/*显示处理区域*/

void Seg_Proc()

{

 if(Seg_Slow_Down) return;

 Seg_Slow_Down = 1;

 

/*其他处理区域*/

void Led_Proc()

{

 if(Led_Slow_Down) return;

 Led_Slow_Down = 1;

通过显示区域可以在蓝桥杯开发板上显示自己通过编写程序所实现的功能。在蓝桥杯开发板上可以显示电压、频率、周期、时钟等抽象不易于被肉眼识别的功能。

5

/*定时器初始化*/

void Timer0_Init(void)  //1毫秒@12.000MHz

{

 TMOD &= 0xF0;   //设置定时器模式

 TMOD |= 0x05;

 TL0 = 0;    //设置定时初始值

 TH0 = 0;    //设置定时初始值

 TF0 = 0;    //清除TF0标志

 TR0 = 1;    //定时器0开始计时

  

}

 

void Timer1_Init(void)  //1毫秒@12.000MHz

{

 AUXR &= 0xBF;   //定时器时钟12T模式

 TMOD &= 0x0F;   //设置定时器模式

 TL1 = 0x18;     //设置定时初始值

 TH1 = 0xFC;     //设置定时初始值

 TF1 = 0;    //清除TF1标志

 TR1 = 1;    //定时器1开始计时

 

 EA = 1;

 ET1 = 1;

}

通过定时器定时一定的时间,一旦达到定时时间进入终端服务函数,在中断服务函数里面实现数码管扫码,按键延时,led扫描等功能。

5、最后在主函数里边一直循环执行Key_Proc();Seg_Proc();Led_Proc();从而结束整套习题的框架。

四、蓝桥杯的总结

()知识技能提升

1硬件设计能力:通过备赛和比赛,硬件设计能力得到了显著提升。能够熟练地根据功能需求进行电路设计,选择合适的电子元件,并在面包板上进行快速搭建和调试。对模拟电路和数字电路的理解更加深入,能够解决硬件电路中出现的各种问题,如电路故障排查、元件参数优化等。

2软件编程水平:在软件编程方面,对单片机 C 语言编程的掌握更加熟练,能够灵活运用各种编程技巧和算法实现复杂的功能。学会了如何进行代码优化,提高程序的运行效率和稳定性。同时,在多模块协同编程和时序控制方面积累了丰富的经验,能够更好地处理软件系统中的各种逻辑关系。

()反思改进方向

1、硬件设计优化:在硬件设计方面,需要进一步提高电路设计的规范性和可靠性。学习使用专业的电路设计软件,如 Altium Designer,进行更精确的电路原理图设计和 PCB 布局。同时,加强对硬件抗干扰技术的学习,提高电路在复杂环境下的稳定性。

2软件创新拓展:在软件编程方面,要注重算法的创新和优化。学习更多先进的算法和编程思想,如人工智能算法在数据处理中的应用,以提高程序的性能和功能。此外,加强对代码的模块化和可扩展性设计,使程序能够更容易地进行功能升级和维护。

3跨学科知识融合:蓝桥杯单片机赛道不仅涉及单片机技术,还与电子电路、传感器技术、通信技术等多个学科领域相关。今后要加强跨学科知识的学习和融合,拓宽自己的知识面,提高综合应用能力。例如,学习更多关于无线通信技术的知识,将其应用到单片机系统中,实现更丰富的功能。



院士
2025-03-18 14:54:00     打赏
2楼

谢谢分享,学习了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]