蓝桥杯单片机第13届省赛题

前言

笔者是参加第十三届蓝桥杯单片机15组的第二批成员,此次赛题是在4.9日拿到赛题时候第一时间练习并调试得到最终的模板。有不妥之处还望斧正,相互进步相互学习哈。

目录

前言

赛题感受

 代码驱动


赛题感受

       这是刚刚过去的第十三届第一场嵌入式的省赛,模拟比赛的时候,拿到赛题,就发现相较于上一年难了一些。在编程的初期还是有很多的bug,但也都一一化解,最终得到了完美的答案。

        在刚拿到赛题之时,首先脑中首先想到要用的是什么模块,先将所需要的模块整理出来,确定可以很好的使用,之后再开始研究赛题。

        问题1.LED与数码管乱串问题

        问题2.调节下载晶振的频率影响数码管显示温度

        问题3.LED闪烁与继电器等其他的模块有机结合

据我的感受,只要大家能够耐心一步一步思考,能够排查出自己出现bug的原因,一定能够实现完美运行的。

蓝桥杯单片机第13届省赛题_第1张图片蓝桥杯单片机第13届省赛题_第2张图片

蓝桥杯单片机第13届省赛题_第3张图片

蓝桥杯单片机第13届省赛题_第4张图片 

 

 代码驱动如下:

 

主文件下:

#include "Key16.h"
#include "smg.h"
#include "ds1302.h"	
#include "onewire.h"


void allinit(void)
{
	P2=P2&0x1f|0x80;
	P0=0xff;
	P2=P2&0x1f|0xa0;
	P0=0x00;
}

bit bit_5,bit_6;
u16 DS18B20_temp;

void control(void);
void Led_Port(void);
void Mode_Change(void);

void main()
{
	allinit();
	DS1302_init();
	Timer1Init();
	DS18B20_temp=(char)DS18B20Read();
	delay_ms(800);
	while(1)
		{
			Key_Prc();
			control();
			Led_Port();
			DS1302_read();
			Mode_Change();
			Display1(zero,one);
			Display2(two,three);
			Display3(four,five);
			Display4(six,seven);
		}
}

void control(void){
	DS18B20_temp=(char)DS18B20Read();
	if(bit_1==0){
		P2=0x80,P0=0xff,P0&=0xfd,P2=0x80;
			if(DS18B20_temp>=Temp_Para){
				P2=0xa0,P0=0x00,P0|=0x10,P2=0xa0;bit_3=1;
			}
			else if(DS18B20_temp=26)six=16;
		seven=DS18B20_temp/100%10;
	}
	else if(Mode_flag==1&&bit_2==0){
		zero=15,one=2,two=11,three=DS1302_time[2]/10,
		four=DS1302_time[2]%10,five=10,
		six=DS1302_time[1]/10,
		seven=DS1302_time[1]%10;
	}
	else if(Mode_flag==2){
		zero=15,one=3,two=11,three=11,four=11,five=11,
		six=Temp_Para/10,seven=Temp_Para%10;
	}
	if(bit_2==1){
		zero=15,one=2,two=11,three=DS1302_time[1]/10,
		four=DS1302_time[1]%10,
		five=10,
		six=DS1302_time[0]/10,
		seven=DS1302_time[0]%10;
	}
}

完整版矩阵按键:

#include "Key16.h"
#include "smg.h"
#include "ds1302.h"	

u8 Key_value,Key_flag,Key,Key_Down,Key_Up,Key_old;
u16 Key_temp;

u8 Mode_flag;
bit bit_1,bit_2,bit_3,bit_4;
u8 Temp_Para=23,bit_time;

void Timer1Init(void)		//1毫秒@11.0592MHz
{
	AUXR &= 0xBF;		//定时器时钟12T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x18;		//设置定时初值
	TH1 = 0xFC;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	EA=1;
	ET1=1;
}


u8 Key_Read(void)
{
	P44=0,P42=1,P35=1,P34=1,P3|=0x0f;
	Key_temp=P3;
	P44=1,P42=0,P35=1,P34=1,P3|=0x0f;
	Key_temp=(Key_temp<<4)|(P3&0x0f);
	P44=1,P42=1,P35=0,P34=1,P3|=0x0f;
	Key_temp=(Key_temp<<4)|(P3&0x0f);
	P44=1,P42=1,P35=1,P34=0,P3|=0x0f;
	Key_temp=(Key_temp<<4)|(P3&0x0f);
	
	switch(~Key_temp){
		case 0x8000: Key_value=4;break;
		case 0x4000: Key_value=5;break;
		case 0x2000: Key_value=6;break;
		case 0x1000: Key_value=7;break;
			
		case 0x0800: Key_value=8;break;
		case 0x0400: Key_value=9;break;
		case 0x0200: Key_value=10;break;
		case 0x0100: Key_value=11;break;
			
		case 0x0080: Key_value=12;break;
		case 0x0040: Key_value=13;break;
		case 0x0020: Key_value=14;break;
		case 0x0010: Key_value=15;break;
			
		case 0x0008: Key_value=16;break;
		case 0x0004: Key_value=17;break;
		case 0x0002: Key_value=18;break;
		case 0x0001: Key_value=19;break;
		
		default :Key_value=0;
	}
	return (Key_value);
}


void Key_Prc(void){
	
	if(Key_flag) return;
		Key_flag=1;
	
	Key=Key_Read();
	Key_Down=Key&(Key^Key_old);
	Key_Up=~Key&(Key^Key_old);
	Key_old=Key;
	
	if(Key_Down){
		switch(Key){
			case 12:if(++Mode_flag==3)Mode_flag=0;break;
			case 13:bit_1=~bit_1;break;
			case 16:if(Mode_flag==2){
									if(++Temp_Para>99)Temp_Para=99;
									}break;
			case 17:if(Mode_flag==2){
									if(--Temp_Para<10)Temp_Para=10;
									}
							else if(Mode_flag==1)bit_2=1;break;
		}
	}
	
	
	if(Key_Up){
		switch(Key_Up){
			case 17:if(Mode_flag==1){
						bit_2=0;
						zero=15,one=2,two=11,three=DS1302_time[2]/10,
						four=DS1302_time[2]%10,
						five=10,
						six=DS1302_time[1]/10,
						seven=DS1302_time[1]%10;
			}
		}
	}
}


void Timer1() interrupt 3{
	if(++Key_flag==10) Key_flag=0;
	if(bit_3==1){
		bit_time++;
		if(bit_time==100)bit_4=1;
		else if(bit_time==200){bit_4=0;bit_time=0;}
	}
}

数码管代码如下:

#include "smg.h"

unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0xbf,0xff,0xc6,0x8c,0x88,0xc1,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xbf};//0-9
unsigned char smgwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
u8 zero,one,two,three,four,five,six,seven;


void Display1(zero,one)
{
	P2=0xc0,P0=smgwei[0];
	P2=0xff,P0=smgduan[zero];
	delay_ms(1);
	
	P2=0xc0,P0=smgwei[1];
	P2=0xff,P0=smgduan[one];
	delay_ms(1);
	
	P2=0xc0,P0=0xff;
	P2=0xff,P0=0xff;
}


void Display2(two,three)
{
	P2=0xc0,P0=smgwei[2];
	P2=0xff,P0=smgduan[two];
	delay_ms(1);
	
	P2=0xc0,P0=smgwei[3];
	P2=0xff,P0=smgduan[three];
	delay_ms(1);
	
	P2=0xc0,P0=0xff;
	P2=0xff,P0=0xff;
}

void Display3(four,five)
{
	P2=0xc0,P0=smgwei[4];
	P2=0xff,P0=smgduan[four];
	delay_ms(1);
	
	P2=0xc0,P0=smgwei[5];
	P2=0xff,P0=smgduan[five];
	delay_ms(1);
	
	P2=0xc0,P0=0xff;
	P2=0xff,P0=0xff;
}

void Display4(six,seven)
{
	P2=0xc0,P0=smgwei[6];
	P2=0xff,P0=smgduan[six];
	delay_ms(1);
	
	P2=0xc0,P0=smgwei[7];
	P2=0xff,P0=smgduan[seven];
	delay_ms(1);
	
	P2=0xc0,P0=0xff;
	P2=0xff,P0=0xff;
}

你可能感兴趣的:(第十三届省赛题,单片机)