代码编织梦想

前言

本人在(2024年)第十五届蓝桥杯竞赛单片机赛道中取得了全国一等奖的成绩。本文我将会和读者们分享蓝桥杯单片机竞赛可能会用到的提分技巧,帮读者们叩开国一的大门!
官方资料获取(已整合):
蓝桥杯单片机资源包(含指导手册和考点大纲)
优质教程推荐:
蚂蚁工厂科技蓝桥杯单片机教程
小蜜蜂蓝桥杯单片机基础技能与进阶强化教程
其他相关文章:
【国一超全代码分享!】蓝桥杯单片机各模块代码整合

PCA可编程计数器阵列

IAP15F2K61S2单片机只有定时器0、定时器1和定时器2三个定时器,有时我们会遇到定时器资源不够用的情况:NE555频率测量占用了定时器0,超声波测距占用了定时器1,定时器2用作了串口波特率发生器。这时我们会发现没有定时器进行周期计数为我们的业务逻辑提供(周期)中断服务。为了解决这个问题,我们要启动单片机中的PCA模块。

这里简单介绍一下PCA:
PCA(可编程计数器阵列Programmable Counter Array)有5个16位的捕获/比较模块与之相连,由高字节(PCA0H)和低字节(PCA0L)组成。
在这里我们只需要知道:PCA可以充当16位重装载的“定时器”使用

PCA_Timer.c

// PCA初始化
void PCA_TimerInit(void)
{
	// 这些只能背!
	CMOD |= 0x01;//初始化为系统时钟12分频 允许CCON中的CF中断
	CCON &= 0x00;// CF=0;CR=0;

	CL=0x18;
	CH=0xFC;  // 这里的值根据需要的定时时间手动设置
	CR=1;// 开启计数
}

//中断回调函数
void PCA_isr() interrupt 7
{
	if(CF)
	{
		CF=0;// 需要手动(软件)清零溢出标志位
		CL=0x18;// 需要手动重装载,定时器是自动重装载
		CH=0xFC;// 需要手动重装载,定时器是自动重装载
		
		// 下面添加自己的代码
	}
}

PCA_Timer.h

#include "STC15F2K60S2.H"

void PCA_TimerInit(void);

按照以上操作,我们就可以把PCA当做定时器来用,这样就可以很大程度上解决编程过程中“定时器不够用”的问题。

按键状态检测

按键的底层代码参考:【国一超全代码分享!】蓝桥杯单片机各模块代码整合

// 声明四种状态
unsigned char Key_Value;  // 按键当前状态,0为低电平,1为高电平
unsigned char Key_Down;  // 下降沿
unsigned char Key_Up;  // 上升沿
unsigned char Key_Old;  // 按键的上一状态,0为低电平,1为高电平

//
Key_Value = Read_KBD();  // 读取按键当前状态(这里KBD对应矩阵键盘)
Key_Down = Key_Value&(Key_Old^Key_Value);
Key_Up = ~Key_Value&(Key_Old^Key_Value);
Key_Old = Key_Value;

两种计时按键

近两年赛题都会涉及到按键长短按的考点,下面提供一个写法给大家。

// 注意tick和flag,最好都创建独立的,避免冲突
// 按下按键超过时间,LED直接亮
// Key_Value:检测按键保持高电平或低电平
// Key_Up:检测按键上升沿(即按下到松开的那一瞬间)
if(Key_Value==4 && led1_flag==0)
{
	if(led1_tick++>2000)
	{
		led1_tick=0;
		led1_flag=1;
		ucLed^=0xF0;
	}
}
else
{
	if(led1_flag==0)  led1_tick=0;
	else if(led1_flag==1 && Key_Up==4)  led1_flag=0;
}

// 按下按键超过时间,松开了按键,LED才亮
if(Key_Value==5 && led2_flag==0)
{
	if(led2_tick++>2000)
	{
		led2_tick=0;
		led2_flag=1;
	}
}
else
{
	if(led2_flag==0)  led2_tick=0;
	else if(led2_flag==1 && Key_Up==5)  
	{
		led2_flag=0;
		ucLed^=0xF0;
	}
}

PWM输出逻辑

十三届国赛真题(如果没有记错的话)出了一次PWM输出的考点,要求某个引脚输出频率为1kHz,占空比为20%的PWM信号。之后大家在做到这道题的时候会发现,输出PWM信号并不难,但是输出PWM的代码一旦没写好,就很容易影响到其他模块(比如影响到温度读取或者时钟显示等)。以下是我的处理方法,通过这种处理能正常输出PWM信号,也可以不影响其他模块的正常使用。

if(pwm_flag==1)
{
	pp2_flag=0;
	if(pwm_tick<8)
	{
		if(pp1_flag==0)
		{
			pp1_flag=1;
			P0|=0x20;
			P2=P2&0x1F|0xA0;
			P2=P2&0x1F;
		}
	}
	else
	{
		if(pp1_flag==1)
		{
			pp1_flag=0;
			P0|=0x00;
			P2=P2&0x1F|0xA0;
			P2=P2&0x1F;
		}

	}
	if(++pwm_tick==10)  pwm_tick=0;
}
else if(pwm_flag==0)
{
	pp1_flag=0;
	if(pwm_tick<2)
	{
		if(pp2_flag==0)
		{
			pp2_flag=1;
			P0|=0x20;
			P2=P2&0x1F|0xA0;
			P2=P2&0x1F;
		}
	}
	else
	{
		if(pp2_flag==1)
		{
			pp2_flag=0;
			P0|=0x00;
			P2=P2&0x1F|0xA0;
			P2=P2&0x1F;
		}
	}
	if(++pwm_tick==10)  pwm_tick=0;
}

外部中断(以外中断0为例)

// 外部中断(这两句要写在main中)
IT0 = 0;                    //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1;                    //使能INT0中断

//-----------------------------------------
//中断服务程序
void exint0() interrupt 0       //INT0中断入口 INT0对应的应该是按键S5
{
	// 下面写要执行的任务
    ucLed ^= 0xff;
}

数码管闪烁

sprintf(seg_string,"P1    %2d"(unsigned int)dist);
if(shan_tick<2)  // 200ms亮灭闪烁
{
	seg_string[6]=' ';
	seg_string[7]=' ';
}
if(++shan_tick==4)  shan_tick=0;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/S13352784013/article/details/141718010

关于蓝桥杯单片机组自学的经验分享_菜小涛的博客-爱代码爱编程

        这篇文章主题如标题所示。先说一下经验分享,文章末再写一些碎碎念。            蓝桥杯单片机组 = 客观题 + 程序设计题 = 数模电 + C语言 + 单片机。                先说第一

蓝桥杯单片机组-爱代码爱编程

文章目录 前言一、参赛建议二、备赛过程1.资料2. 学习路线 三、比赛过程总结附-模板main.c 前言 前段时间整理硬盘发现了当时大二参加蓝桥杯时的一些记录,现在回想当时踩过的坑和备赛经历,现结

蓝桥杯第十届单片机组国赛讲解-爱代码爱编程

创作不易点点赞吧,呜呜呜 文章目录 前言 一、基础模块代码块 1、基础模块变量定义,用under表示 2、键盘、数码管、延时函数、定时器、超声波、串口等的一些模块 3、基础模块的声明 二、iic、onewire这些模块在这里噢 1、iic 2、onewire 三、主函数来咯,别害怕 1、变量声明及一些函数调用 2.ma

蓝桥杯单片机组的各模块代码总结(供参考学习)-爱代码爱编程

这是蓝桥杯单片机组各常考的使用以及总结,供新手朋友参考学习,如有错误,请批评指正。 //IIC.h //添加头文件 并且函数声明 #include "STC15F2K60S2.h" #include "intrins.h" u8 read_24c02(u8 add); void write_24c02(u8 add,u8 data1); u8 read_

第十四届蓝桥杯单片机组(赛题+程序)-爱代码爱编程

第十四届蓝桥杯单片机组(赛题+程序) 该赛题考于2023.4.8 ,于2023.4.28 复盘。 今年的题目是比较难的了,模块多,而且逻辑也更加复杂,考了NE555、I2C、DS1302、DS18B20,同时客观题也不好做。 笔者客观题只对3个,程序题大概完成80%,勉强进入省一。 一、赛题  1.客观题  答案: 1.D 

第十五届蓝桥杯单片机组——ds18b20模块(带可直接运行的示例代码)_ds18b20温度转换时间-爱代码爱编程

文章目录 一、DS18B20介绍二、DS18B20的温度转换与读取流程三、利用手册完成DS18B20的读写3.1 官方给的底层驱动代码3.2 手册指定的数据流3.3 结合ROM 命令流程图和功能命令流程图确认发