蓝桥杯:单片机组第十三届省赛第二场

遇到的问题:

目录

遇到的问题:

1.对于不能实时在DAC输出中对于L8闪烁

2.对于按键低阈值无论是在加减到4.0-4.5之间都会自动模式切换,不能像高阈值一样连贯的切换。


首先展示省赛题及其要求:

蓝桥杯:单片机组第十三届省赛第二场_第1张图片

蓝桥杯:单片机组第十三届省赛第二场_第2张图片 

蓝桥杯:单片机组第十三届省赛第二场_第3张图片 

蓝桥杯:单片机组第十三届省赛第二场_第4张图片 

蓝桥杯:单片机组第十三届省赛第二场_第5张图片 

蓝桥杯:单片机组第十三届省赛第二场_第6张图片 

蓝桥杯:单片机组第十三届省赛第二场_第7张图片 

蓝桥杯:单片机组第十三届省赛第二场_第8张图片 

 代码编写思路:

1.首先要将所有模块都测试的肯定是好用的,这样我们才可以开始进行程序的编写。

2.对于每一个模块来说都要进行封装成为一个函数,比如对于数码管显示,就用一个标志位来使用switch显示3中不同的显示界面,LED功能就单独封装一个函数,这样在我们测试或者是修改的时候会大大减轻我们的负担。

话不多说直接代码:

#include "smg.h"
#include "iic.h"
#include "KEY4.h"
#include "ultrasonic.h"

void Allinit(void)
{
	P2=0x80,P0=0xff;
	P2=0xa0,P0=0x00;
	P2=0xc0,P0=0xff;
	P2=0xe0,P0=0xff;
}


void Key_Port(void);
void SMG_DISPLAY(void);
void LED_PORT(void);
void DAC_Distance(void);

unsigned int ADCRead;
unsigned char Key_Value;
unsigned char Flag;//设置状态(3种切换)
bit Choose;//上下限参数的选择 
unsigned int U_UP=45,U_DOWN=5,U_UP_TEMP=45,U_DOWN_TEMP=5;//高低电压参数的选择
unsigned int C_Distance;


void main()
{
	Allinit();
	Timer0Init();
	Timer1Init();
	zero=11,one=11,two=11,three=11,four=11,five=11,six=11,seven=11;
	while(1)
	{
		C_Distance=get_distance();
		LED_PORT();
		SMG_DISPLAY();
		Key_Port();
		DAC_Distance();
		DisPlay1(zero,one);
		DisPlay2(two,three);
		DisPlay3(four,five);
		DisPlay4(six,seven);
	}
}


void SMG_DISPLAY(void)
{
	ADCRead=ADC_read(0x03);
	ADCRead=(int)ADCRead*1.96;
	switch(Flag)
	{
		case 0: zero=23,one=11,two=11,three=11,four=11,
						five=ADCRead/100+12,six=ADCRead/10%10,seven=ADCRead%10;break;

		case 1:
					if(ADCRead>(U_DOWN_TEMP*10)&&ADCRead<(U_UP_TEMP*10))
					{
						zero=25,one=11,two=11,three=11,four=11;
						if(C_Distance>100)
						{
							five=C_Distance/100,six=C_Distance/10%10,seven=C_Distance%10;
						}
					  else if(C_Distance<100&&C_Distance>10)
						{
							five=11,six=C_Distance/10,seven=C_Distance%10;
						}
						else if(C_Distance<10)
						{
							five=11,six=11,seven=C_Distance;
						}
					}
					if(ADCRead<=(U_DOWN_TEMP*10)||ADCRead>=(U_UP_TEMP*10))
					{
						zero=25,one=11,two=11,three=11,four=11,
						five=24,six=24,seven=24;
					}
					break;
		case 2:
					zero=22,one=11,two=11,three=U_UP/10+12,four=U_UP%10,
					five=11,six=U_DOWN/10+12,seven=U_DOWN%10;
					break;
	}
}

void LED_PORT(void)
{
	if(ADCRead<=(U_DOWN_TEMP*10)||ADCRead>=(U_UP_TEMP*10))
		{
			LED_flag=0;
			LED_flag_Change=0;
			P2=0x80,P0|=0x80,P2=0;
		}
		if(ADCRead>(U_DOWN_TEMP*10)&&ADCRead<(U_UP_TEMP*10))
		{
			LED_flag=1;
		}
	switch(Flag)
	{
		case 0:P2=0x80,P0&=0xfe,P0|=0x06,P2=0;break;
		case 1:P2=0x80,P0&=0xfd,P0|=0x05,P2=0;break;
		case 2:P2=0x80,P0&=0xfb,P0|=0x03,P2=0;break;
	}
		
	if(LED_flag_Change==1)
	{
		P2=0x80,P0&=0x7f,P2=0;
	}
	else if(LED_flag_Change==0)
	{
		P2=0x80,P0|=0x80,P2=0;
	}
}


void Key_Port(void)
{
	Key_Value=Key4();
	switch(Key_Value)
	{
		case 4:
					 if(++Flag==3){Flag=0;U_DOWN_TEMP=U_DOWN,U_UP_TEMP=U_UP;}
					 if(Flag==2){Choose=0;}
						break;
		case 5:
						if(Flag==2)
							{
								Choose=~Choose;
							}
							break; 
		case 6:
			if(Flag==2)
				{
					if(Choose==0)
						{
							U_UP+=5;if(U_UP>50){U_UP=5;}
						}
					else
						{
							U_DOWN+=5;if(U_DOWN>50){U_DOWN=5;}
						}
				}
						break;
		case 7:
			if(Flag==2)
			{
				if(Choose==0)
					{
						U_UP-=5;if(U_UP<5){U_UP=50;}
					}
				else 
					{
						U_DOWN-=5;if(U_DOWN<5){U_DOWN=50;}
					}
			}
			break;
	}
}


void DAC_Distance(void)
{
	if(LED_flag==1)
		{
			if(C_Distance<20)
				{
					DAC_read(51);
				}
				else if(C_Distance>=20&&C_Distance<=80)
				{
					DAC_read((int)(C_Distance*3.4-17));
				}
				else if(C_Distance>80)
				{
					DAC_read(255);
				}
		}
	if(LED_flag==0)
	{
		DAC_read(0);
	}
}

Key.c

#include "KEY4.h"

unsigned char Key_time;
bit LED_flag,LED_flag_Change;//灯闪烁标志位
unsigned char LED_Time;

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


unsigned char Key4(void)
{
	static unsigned char xstep;
	switch (xstep)
	{
		case 0:
					if(P30==0||P31==0||P32==0||P33==0)
					{
						xstep=1;
						Key_time=0;
					}break;
		case 1:if(Key_time>=20)xstep=2;break;
		case 2:
					if(P30==0) {xstep=3;return (7);}
					else if(P31==0) {xstep=3;return (6);}
					else if(P32==0) {xstep=3;return (5);}
					else if(P33==0) {xstep=3;return (4);}
					else if(P30==1&&P31==1&&P32==1&&P33==1)xstep=0;break;
		case 3:
					if(P30==1&&P31==1&&P32==1&&P33==1) xstep=0;break;
	}
	return 0;
}



void Timer1() interrupt 3
{
	Key_time++;
	if(LED_flag==1)
	{
		if(++LED_Time==100)
		{
			LED_flag_Change=~LED_flag_Change;
		}
	}

}

对于上面两个问题来说,第一个具体是逻辑上得问题,第二个是因为Key()不是都有返回值的。

对于考场上:

大家不用紧张,一定要保证自己上交的工程是你真正写的最好的别交错误了。

你可能感兴趣的:(单片机,嵌入式硬件,c语言)