蓝桥杯的被圈钱之旅(三):第十二届第二场(电子类)

一、前言:

这届赛题我认为是有一定难度的一届赛题。但是还好难度并不是很高,属于中规中矩的难度,闲话少数直接上。已经将所有的资料0积分上传,题目在资料里有,需要的自取

二、题目

 

三、 代码展示

因为文章篇幅原因,这里不展示全部代码,所有资料都已经0积分上传

一、独立键盘key.c

#include "key.h"
#include "led.h"
#include "freq.h"
#include "adda.h"
#include "timing.h"
#include "buffer.h"
//
unsigned char key_flag=0,key_sign=0;
unsigned int key_count=0;
unsigned char mode_dis=0;
unsigned char mode_chan=0;
unsigned int dianya_set=0;
unsigned int freq_set=0;
unsigned char led_enable=0;
//
extern unsigned int freq;
extern unsigned int dianya;
//
void key_scan()
{
	if((P3&0x0F)!=0x0F)
	{
		if(key_flag==0)
		{
	//判断为按下了某一引脚被拉低
		switch(P3&0x0F)
		{
			//当前有按键被按下,判断被按下的键
			case 0x07:
					key_sign=4;
					key_flag=4;
					return;
			case 0x0B:
					key_sign=5;
					key_flag=5;
					return;
			case 0x0D:
					key_sign=6;
					key_flag=6;
					return;
			case 0x0E:
					key_flag = 7; //判断为S7
					key_count = 1;
					return;
		}
	} 
		return;//判断为连按等情况,跳出函数
	}
		if(key_count>1000)
		{		//判断按下超过1000ms为长按
			key_sign = key_flag +16;
		}
		else if(key_count>10)
		{		//判断小于1000ms为短按,其中有10ms用来消抖
			key_sign = key_flag;
		}
		//变量清零
		key_flag = 0;
		key_count = 0;
}

void T1_isr() interrupt 3 //1ms定时器定时
{
//按键时长计时
	if(key_count){
		if(++key_count==0)key_count=1001;
	}
}

void key_jpy()
{
	if(key_sign==4)
	{
		key_sign=0;
		mode_dis=mode_dis+1;
		if(mode_dis>=3)
		{
			mode_dis=0;
		}
	}
	if(key_sign==5)
	{
		key_sign=0;
		mode_chan^=1;
	}
	if(key_sign==6)
	{
		key_sign=0;
		dianya_set=dianya;
	}
	if(key_sign==7)
	{
		key_sign=0;
		freq_set=freq;
	}
	if(key_sign==23)
	{
		key_sign=0;
		led_enable^=1;
	}
	if(mode_dis==0)
	{
		freq_dis();
	}
	if(mode_dis==1)
	{
	cycle_dis();
	mode_chan=0;
	}
	if(mode_dis==2&&mode_chan==0)
	{
	adc_one_dis();
	}
	if(mode_dis==2&&mode_chan==1)
	{
	adc_two_dis();
	}
}

二、频率测量freq.c

#include "freq.h"
extern unsigned char font[10];
extern unsigned char smgBuffer[10];
unsigned int freq;
void Timer0Init(void)		//100微秒@11.0592MHz
{
	TMOD |= 0x05;		//设置计数器,方式1
	TL0 = 0x00;			//设置计数初值
	TH0 = 0x00;			//设置计数初值
	TR0 = 1;				//计数器T0开始计数
}
void Timer2Init(void)		//50h毫秒@12.000MHz
{
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xB0;		//设置定时初值
	T2H = 0x3C;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	AUXR |= 0x10;		//定时器2开始计时
  IE2 |= 0x04;			//开定时器2中断
	EA=1;
}
void Timer2iqr() interrupt 12
{
	unsigned  int f;//
	((unsigned char *)&f)[0]=TL0;
	((unsigned char *)&f)[1]=TH0;//顺序列表的方式存储数值
	 //重置计数器
		TR0=0;//停止计数
		TL0=0x00;
		TH0=0x00;
		TR0=1;//开始计数
		freq=f*20;
}
void freq_dis()
{
	  smgBuffer[0]=0x8e;//1000 1110
	  smgBuffer[1]=0xff;
	  smgBuffer[2]=0xff;
		smgBuffer[3]=font[freq/10000%10];
		smgBuffer[4]=font[freq/1000%10];
	  smgBuffer[5]=font[freq/100%10];
	  smgBuffer[6]=font[freq/10%10];
	  smgBuffer[7]=font[freq%10];
}

三、led.c

#include "led.h"
unsigned char bdata led=0,out=0;
extern unsigned int dianya;
extern unsigned int freq;
extern unsigned char mode_dis;
extern unsigned int dianya_set;
extern unsigned int freq_set;
extern unsigned char led_enable;
sbit L1=led^0;
sbit L2=led^1;
sbit L3=led^2;
sbit L4=led^3;
sbit L5=led^4;
sbit L6=led^5;
sbit L7=led^6;
sbit L8=led^7;
sbit relay=out^4;
sbit buzz=out^6;
//
//
void led_show()
{
	if(led_enable==0)
	{
		led_dis();
	}
	if(led_enable==1)
	{
		led_init();
	}
}
void led_dis()
{
	P2&=0x1f;
	P0=~led;
	P2|=Y4;
	P2&=0x1f;
}
void out_dis()
{
	P2&=0x1f;
	P0=out;
	P2|=Y5;
	P2&=0x1f;
}

void led_init()
{
	P2&=0x1f;
	P0=0xff;
	P2|=Y4;
	P2&=0x1f;
}

void led_jpy()
{
	if(dianya>=dianya_set)
	{
		L1=1;
	}
	if(dianya<dianya_set)
	{
		L1=0;
	}
	if(freq>=freq_set)
	{
		L2=1;
	}
	if(freq<freq_set)
	{
		L2=0;
	}
	if(mode_dis==0)
	{
		L3=1;
		L4=0;
		L5=0;
	}
	if(mode_dis==1)
	{
		L3=0;
		L4=1;
		L5=0;
	}
	if(mode_dis==2)
	{
		L3=0;
		L4=0;
		L5=1;
	}
}
	

四、main.c

#include "sys.h"
#include "key.h"
#include "led.h"
#include "freq.h"
#include "adda.h"
#include "timing.h"
#include "buffer.h"
void main()
{
	Timer0Init();
	Timer2Init();
	buffer_init();
	Timer1Init();	
	while(1)
	{
		led_show();
		key_scan();
		led_jpy();
		key_jpy();
		buffer_dis();
		ADC_bright();
		ADC_dianweiqi();
	}
}

四、总结

这套题目难度适中,没有明显难点,属于中规中矩的一套赛题,难点在于独立键盘的长按响应。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

靳小锅er

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

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

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

打赏作者

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

抵扣说明:

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

余额充值