蓝桥杯单片机----省赛十三届第二次代码分享

一、题目分析

1.本届赛题添加了超声波,由于超声波加入,可能让题难度加大,但逻辑并不是很难,需要注意的是超声波获取的时间,避免与其他冲突,导致数码管闪烁。

2.参数退出界面生效问题,按键在界面切换时生效,保证参数设置状态下,测距功能不受影响。

二、代码

主函数

#include "main.h"

void main()
{
	Init_Sys();
	Timer2_Init();
	while(1)
	{
		Task_LED();
		Task_Collect();
		Task_key();
		Task_Seg();
	}
}
#ifndef __MAIN_H
#define __MAIN_H
#include <STC15F2K60S2.H>
#include "task.h"
#include "dsp.h"
#include "key.h"
#include "chaosheng.h"
#include "PCF8591.h"
#include "uart.h"

#define LED(x) {P0 = x;P2 = (P2 & 0x1f) | 0x80;P2 &= 0x1f;}
#define BUZ(x) {P0 = x;P2 = (P2 & 0x1f) | 0xa0;P2 &= 0x1f;}
#define COM(x) {P0 = x;P2 = (P2 & 0x1f) | 0xc0;P2 &= 0x1f;}
#define SEG(x) {P0 = x;P2 = (P2 & 0x1f) | 0xe0;P2 &= 0x1f;}
#endif

任务函数

#include "task.h"
unsigned int seg_count=0;
unsigned int key_count=0;
unsigned int dis_count=0;
unsigned int adc_count=0;
unsigned int led_count=0;

unsigned char ui=1;
unsigned char volt_up_can=45;
unsigned char volt_down_can=5;
unsigned char f_up_can=45;
unsigned char f_down_can=5;
unsigned int Dis=0;
unsigned int ADC=0;
unsigned char DAC=0;
unsigned char LED_state=0xff;
unsigned char uart[8]={0};
bit can_state=0;
bit f_led=0;
void Timer2_Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;			//定时器时钟1T模式
	T2L = 0x20;				//设置定时初始值
	T2H = 0xD1;				//设置定时初始值
	AUXR |= 0x10;			//定时器2开始计时
	IE2 |= 0x04;			//使能定时器2中断
	EA = 1;
}

void Init_Sys()
{
	LED(0xff);
	BUZ(0x00);
	Init_Dsp();
	Init_key();
	Uart1_Init();
}
void Timer2_Isr(void) interrupt 12
{
	GetDisplayStruct()->SegDisplay();
	if(key_count < 10)
		key_count++;
	if(seg_count < 50)
		seg_count++;
	if(led_count < 100)
		led_count++;
	if(adc_count < 150)
		adc_count++;
	if(dis_count < 200)
		dis_count++;
}

void Task_LED()
{
	if(led_count >= 100)
	{
		led_count=0;
		if(ui == 1)
		{
			LED_state &= ~0x01;
			LED_state |= 0x02;
			LED_state |= 0x04;
		}
		else if(ui == 2)
		{
			LED_state &= ~0x02;
			LED_state |= 0x01;
			LED_state |= 0x04;
		}
		else if(ui == 3)
		{
			LED_state &= ~0x04;
			LED_state |= 0x02;
			LED_state |= 0x01;
		}
		if((ADC < volt_up_can * 10) && (ADC > volt_down_can * 10))
		{
			if((LED_state & 0x80) == 0x80)
			{
				LED_state &= ~0x80;
			}
			else LED_state |= 0x80;
		}
		else LED_state |= 0x80;	
		LED(LED_state);
	}
}
void Task_Collect()
{
	if(dis_count >= 200)
	{
		dis_count = 0;
		if((ADC < volt_up_can * 10) && (ADC > volt_down_can * 10))
			Dis = GetDis();
		else Dis = 999;
		sprintf(uart,"%d\r\n",Dis);
		Send_String(uart);
	}
	if(adc_count >= 150)
	{
		adc_count = 0;
		ADC = (unsigned int)(PCF8591_ADC() * 500.0 / 255);
		if(Dis <= 20)PCF8591_DAC(61);
		else if(Dis >= 80)PCF8591_DAC(255);
		else
		{
			DAC = (unsigned char)(((255 - 61) / 60.0) * (Dis - 20) + 61);
			PCF8591_DAC(DAC);
		}
	}
}

void Task_key()
{
	if(key_count >= 10)
	{
		key_count = 0;
		GetKeyStruct()->pFun();
	}	
	switch(GetKeyStruct()->value)
	{
		case 4:	
			if(ui == 1)ui = 2;
			else if(ui == 2)ui = 3;
			else if(ui == 3)ui = 1;
			volt_up_can = f_up_can;
			volt_down_can = f_down_can;
			GetKeyStruct()->value = 0;
		break;
		case 5:	
			if(can_state == 0)can_state=1;
			else can_state=0;
			GetKeyStruct()->value = 0;
		break;
		case 6:	
			if(can_state == 0)f_up_can+=5;
			else f_down_can+=5;
			if(f_up_can > 50)f_up_can=5;
			if(f_down_can > 50)f_down_can=5;
			GetKeyStruct()->value = 0;
		break;
		case 7:	
			if(can_state == 0)f_up_can-=5;
			else f_down_can-=5;
			if(f_up_can < 5)f_up_can=50;
			if(f_down_can < 5)f_down_can=50;
			GetKeyStruct()->value = 0;
		break;
	}
}
void Task_Seg()
{
	DisplayStruct* seg = GetDisplayStruct();
	if(seg_count < 50)
		return;
	seg_count=0;
	if(ui == 1)
	{
		seg->dot[0] = 5;
		seg->dot[1] = 10;
		seg->buf[0] = 11;
		seg->buf[1] = 10;
		seg->buf[2] = 10;
		seg->buf[3] = 10;
		seg->buf[4] = 10;
		seg->buf[5] = ADC / 100 % 10;
		seg->buf[6] = ADC / 10 % 10;
		seg->buf[7] = ADC % 10;
	}
	if(ui == 2)
	{
		seg->dot[0] = 3;
		seg->dot[1] = 6;
		seg->buf[0] = 12;
		seg->buf[1] = 10;
		seg->buf[2] = 10;
		seg->buf[3] = f_up_can / 10 % 10;
		seg->buf[4] = f_up_can % 10;
		seg->buf[5] = 10;
		seg->buf[6] = f_down_can / 10 % 10;
		seg->buf[7] = f_down_can % 10;
	}	
	if(ui == 3)
	{
		seg->dot[0] = 10;
		seg->dot[1] = 10;
		seg->buf[0] = 13;
		seg->buf[1] = 10;
		seg->buf[2] = 10;
		seg->buf[3] = 10;
		seg->buf[4] = 10;
		if(Dis != 999)
		{
			seg->buf[5] = (Dis > 99)?(Dis / 100 % 10):(10);
			seg->buf[6] = (Dis > 9)?(Dis / 10 % 10):(10);
			seg->buf[7] = Dis % 10;		
		}
		else 
		{
			seg->buf[5] = 14;
			seg->buf[6] = 14;
			seg->buf[7] = 14;
		}
	}
}

超声波(采用PCA模块)

#include "chaosheng.h"
sbit TX = P1^0;
sbit RX = P1^1;
void Delay12us(void)	//@12.000MHz
{
	unsigned char data i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

void Send_40KHz()
{
	unsigned char i=8;
	while(i--)
	{
		TX = 1;
		Delay12us();
		TX = 0;
		Delay12us();
	}
}

unsigned int GetDis()
{
	unsigned int t;
	CMOD = 0x00;
	CH = CL = 0;
	Send_40KHz();
	CR = 1;
	while((CF == 0) && (RX == 1));
	CR = 0;
	if(CF == 1)
	{
		CF = 0;
		return 0;
	}
	else
	{
		t = (CH << 8) | CL;
		return (unsigned int)(t * 0.0172);
	}
}

附上所有代码链接,大家可以参考学习。 

​​​​​​​​​​​​​​蓝桥杯单片机十三届第二次https://gitcode.com/fsm_csdn/lanqiao13-2

<think>好的,我现在需要帮助用户了解第十五届蓝桥杯单片机的相关信息,包括比规则、参经验和题目类型。首先,根据用户提供的引用内容,我需要整理现有的信息,并结合一般性的比情况进行分析。 首先,查看用户提供的引用。引用[1]提到用户参加了第十三届,获得二等奖,并分享单片机组的比内容。引用[3]涉及国客观题和Scratch竞规则,可能对单片机的客观题部分有参考价值。引用[4]是第十五届的真题示例,涉及编程题目,这可能说明题目类型包括算法和实际应用问题。 接下来,我需要归纳可能的比规则。根据引用[3],蓝桥杯其他组别的比有时长1.5小时,包含5-10道题,且有步骤得分规则。虽然这是Scratch组的规则,但单片机组的比可能有类似的结构,比如客观题和设计题结合,时间可能更长。例如,引用[2]提到EDA组的有客观题和设计题,单片机可能类似。 参经验方面,引用[1]的用户提到自己只参加过一次,但可以推测需要熟悉开发环境、模块设计等。引用[2]中关于EDA组的复盘可能对准备单片机有帮助,比如时间分配、模块化设计策略。 题目类型方面,引用[4]的题目是编程题,涉及算法优化,可能单片机也有类似的编程任务,比如控制外设、传感器数据处理等。此外,引用[3]提到客观题可能涉及单片机基础知识,如硬件结构、通信协议等。 需要确保回答的结构清晰,分点说明比信息、规则、经验、题目类型。可能还需要结合用户提供的引用中的具体例子,比如步骤得分规则、模块化设计的重要性等。同时,生成的相关问题需要围绕用户可能的后续疑问,如备策略、资源推荐等。 最后,检查是否符合系统级指令:使用正确的中文和LaTeX格式,引用标识正确,生成相关问题。确保没有使用Markdown格式,回答自然流畅。</think>### 第十五届蓝桥杯单片机相关信息整理 #### 1. **比信息与规则** - **竞形式**: 蓝桥杯单片机通常包含**客观题**和**设计题**两部分。根据往届规则(如第十三届[^1]、第十四届EDA组[^2]): - **客观题**:涉及单片机基础知识(如8051架构、定时器配置、通信协议等),可能包含选择题、填空题或简答题。 - **设计题**:要求基于官方开发板(如CT107D)完成硬件控制、传感器数据采集、外设驱动等任务,需编写C语言程序并调试。 - **评分规则**:部分题目采用**步骤得分制**,即完成部分功能即可获得对应分数[^3]。 - **比时长**: 参考其他组别(如EDA组1.5小时),单片机可能为4小时左右,需合理分配时间。 #### 2. **参经验与策略** - **硬件熟悉度**: 需熟练掌握开发板的外设模块(如LED、数码管、矩阵键盘、ADC/DAC、I²C/SPI通信)及驱动方法[^1]。 - **模块化编程**: 将功能拆分为独立模块(如按键扫描、显示刷新),便于调试和复用[^2]。 - **真题训练**: 参考往届题目(如第十四届的“力量值分组”算法题[^4]),练习编程逻辑和优化能力。 #### 3. **题目类型示例** - **客观题**: - 单片机中断优先级如何配置? - 计算定时器初值以实现10ms定时。 - **设计题**: - 任务:通过温度传感器DS18B20采集数据,并在LCD上动态显示曲线。 - 要求:支持按键切换显示模式,数据存储至EEPROM[^1]。 #### 4. **备建议** 1. **开发环境**: 熟悉Keil C51和STC-ISP下载工具,掌握在线调试技巧。 2. **代码规范**: 注重可读性,添加必要注释,避免因格式问题扣分[^2]。 3. **模拟训练**: 使用往届题模拟实战,限时完成功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值