蓝桥杯第十二届单片机省赛真题(CT107D——IAP15F2K61S2)


前言

相关说明:

开发板:CT107D (IAP15F2K61S2)
开发环境:Keil5
涉及题目:第十二届蓝桥杯单片机省赛真题
在这里插入图片描述


主要函数代码及说明:

一、代码相关定义、声明

1.头文件声明

#include "stdio.h"
#include "Timer.h"
#include "bsp_init.h"
#include "bsp_key.h"
#include "bsp_seg.h"
#include "bsp_led.h"
#include "bsp_onewire.h"
#include "bsp_iic.h"

2.变量声明

//--定时器滴答变量
unsigned long ms_Tick = 0;

//--定时器减速变量
unsigned int Key_Slow_Down;
unsigned int Seg_Slow_Down;
unsigned int Led_Slow_Down;
unsigned int Volatge_Output_Slow_Down;

//--按键专用变量
unsigned char Key_Value;
unsigned char Key_Old, Key_Down;

//--数码管专用变量
unsigned char seg_string[10];
unsigned char seg_buf[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char pos;

//--LED专用变量
unsigned char ucLed = 0x00;

unsigned char Disp_Interface = 0;//显示界面,0-温度显示,1-参数设置,2-DA输出界面
unsigned char Temp_Compare_Disp = 25;//温度比较值,单纯用来显示和设置时候使用
unsigned char Temp_Compare_Ctrl = 25;//温度比较值,真正起作用的
bit DA_Output_Mode = 0;//DA输出的模式,0-模式1;1-模式2
float Temp;//真实的温度数据
unsigned char DA_Inter_Num = 0;//控制DA输出电压的内部给定数值,0-255

3.函数声明

void Key_Proc(void);
void Seg_Proc(void);
void Led_Proc(void);
void Voltage_Output_Proc(void);
void Delay750ms();//用来消除85°C显示

二、主要函数

1.main函数

void main(void)
{

	Cls_Peripheral();//关闭LED/继电器/蜂鸣器
	Timer1Init();//定时器1初始化
	EA = 1;//打开总中断
	rd_temperature();
	Delay750ms();//用于消除上电显示85°C的影响
	while(1)
	{
		Key_Proc();
		Seg_Proc();
		Led_Proc();
		Voltage_Output_Proc();
	}
}

2.按键扫描

void	Key_Proc(void)
{
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;
	
	//三行代码
	Key_Value = Key_Read();
	Key_Down = Key_Value & (Key_Old ^ Key_Value);//下降沿,按得哪个按键,这个值就是几
	Key_Old = Key_Value;//检测电平,一直按着一直等于一个数

	switch(Key_Down)
	{
		case 4://显示界面切换按键,0-温度显示,1-参数设置,2-DA输出界面
				if(++Disp_Interface == 3) Disp_Interface = 0;
				if(Disp_Interface == 2) Temp_Compare_Ctrl = Temp_Compare_Disp;//使能设定的比较值
				break;
		
		case 8://参数设置数值-
				if(Disp_Interface == 1) 
				{
					Temp_Compare_Disp--;
					if(Temp_Compare_Disp > 200)//将下限设置为0
						Temp_Compare_Disp = 0;
				}
					break;
				
		case 9:///参数设置数值+
				if(Disp_Interface == 1) 
				{
					Temp_Compare_Disp++;
					if(Temp_Compare_Disp > 99)//将上限设置为99
						Temp_Compare_Disp = 99;
				}
					break;
				
		case 5://DA输出的模式切换,0-模式1;1-模式2
				DA_Output_Mode ^= 1;
				break;
	}
}

3.数码管显示

void Seg_Proc(void)
{
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;
	
	Temp = rd_temperature()/16.0;//采集温度数据
	
	switch(Disp_Interface)//显示界面切换按键,0-温度显示,1-参数设置,2-DA输出界面
	{
		case 0://温度显示
 	  	sprintf(seg_string,"C   %5.2f",Temp);
			break;		
		
		case 1://参数设置
			sprintf(seg_string,"P     %02d",(unsigned int)Temp_Compare_Disp);	
			break;			
		
		case 2://DA输出界面
			sprintf(seg_string,"A    %4.2f",DA_Inter_Num/51.0);	
			break;		
	}
	
	Seg_Tran(seg_string, seg_buf);
}

4.电压模式1、2输出

void Voltage_Output_Proc(void)
{
	if(Volatge_Output_Slow_Down) return;
	Volatge_Output_Slow_Down = 1;	
	
	if(DA_Output_Mode == 0)//0-模式1;1-模式2
	{
		if(Temp < Temp_Compare_Ctrl)
			DA_Inter_Num = 0;
		else 
			DA_Inter_Num = 255;			
	}
	else
	{
		if(Temp < 20)
			DA_Inter_Num = 51;	
		else if(Temp > 40)
			DA_Inter_Num = 204;	
		else
			DA_Inter_Num = 7.65*Temp - 102;
	}	
	
	Pcf8591_Dac(DA_Inter_Num);	
}

5.LED显示

void	Led_Proc(void)
{
	if(Led_Slow_Down) return;
	Led_Slow_Down = 1;
		
 	if(DA_Output_Mode == 0)//0-模式1,L1点亮;1-模式2,L1熄灭
		ucLed |= 0x01;			
	else 
	 	ucLed &= (~0x01);	
	
	switch(Disp_Interface)//显示界面切换按键,0-温度显示,1-参数设置,2-DA输出界面
	{
		case 0://温度显示,L2亮
			ucLed &= (~0x0E);
			ucLed |= 0x02;		
			break;		
		case 1://参数设置,L3亮
			ucLed &= (~0x0E);			
			ucLed |= 0x04;
			break;				
		case 2://DA输出界面,L4亮
			ucLed &= (~0x0E);			
			ucLed |= 0x08;
			break;		
	}			
}

6.定时器中断

void tm1_isr() interrupt 3
{
	ms_Tick++;//滴答定时器,能记录的数据长达29天

	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;//减速变量区,控制子函数的刷新频率
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;	
	if(++Led_Slow_Down == 100) Led_Slow_Down = 0;	
	if(++Volatge_Output_Slow_Down == 500) Volatge_Output_Slow_Down = 0;	
	
    Seg_Disp(seg_buf, pos);//用于数码管显示
	if(++pos == 8) pos = 0;
	
	Led_Disp(ucLed);//用于LED显示
}

7.消除85°C显示

void Delay750ms()		//@12.000MHz  用来消除85°C显示
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

三、省赛国赛经验

  省赛和国赛的题目最起码要做过一遍。主要训练逻辑思路,可以先用自己写好的各个模块驱动代码。比赛前几天全部代码都要重新写,包括新建工程开始,到各个驱动模块代码。比赛的时候,我是先写好大模板和各个模块的代码,然后才开始做按要求去实现功能的,功能由简单到难。

  • 15
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值