一、前言:
这届赛题我认为是有一定难度的一届赛题。但是还好难度并不是很高,属于中规中矩的难度,闲话少数直接上。已经将所有的资料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();
}
}
四、总结
这套题目难度适中,没有明显难点,属于中规中矩的一套赛题,难点在于独立键盘的长按响应。