【第十三届蓝桥杯单片机国赛满分代码】

其他相关文章:
【提分必看!】蓝桥杯单片机提分技巧(国一经验分享)
【国一超全代码分享!】蓝桥杯单片机各模块代码整合
【蓝桥杯单片机客观题知识点汇总】

本代码经过编译后生成的hex文件经过了4T测试平台的满分测试。读者对代码有疑问的可以在评论区里提出。

主函数

#include "stdio.h"
#include "intrins.h"

#include "bsp_init.h"
#include "bsp_led.h"
#include "bsp_key.h"
#include "bsp_seg.h"
#include "bsp_sonic.h"
#include "bsp_555.h"
#include "bsp_iic.h"

#include "Timer.h"

//
void Key_Proc(void);
void Seg_Proc(void);

//
unsigned char Key_Slow=0;
unsigned char Seg_Slow=0;

unsigned char onems_tick=0;
unsigned char freq_tick=0;
unsigned char pwm_tick=0;
unsigned int clear_tick=0;

// 按键
unsigned char Key_Value;
unsigned char Key_Down;
unsigned char Key_Old;

// 数码管
unsigned char seg_string[11];
unsigned char seg_buf[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char pos=0;

// LED
unsigned char ucLed=0;

// EEPROM
unsigned char eeprom_string[2];

// 超声波和频率测量
unsigned char dist=0;
unsigned int freq=0;

// 逻辑标志位
unsigned char ui_state=0;
unsigned char par_mode=0;
bit cm_mode=0;
bit hz_mode=0;
bit pwm_flag=0;
bit dist_flag=0;
bit count_flag=0;
bit clear_flag=0;

bit pp1_flag=0;
bit pp2_flag=0;

// 湿度
unsigned char shidu=0;

// 参数
float freq_par=9.0;
unsigned char shidu_par=40;
float dist_par=0.6;

unsigned char count=0;


void main(void)
{
	Cls_Waishe();
	Sonic_Timer1Init();
	Freq_Timer0Init();
	Timer2Init();
	
	EA=1;
	
	while(1)
	{
		Key_Proc();
		Seg_Proc();
	}
}

//
void Key_Proc(void)
{
	if(Key_Slow)  return;
	Key_Slow=1;
	
	Key_Value=Read_BTN();
	Key_Down=Key_Value&(Key_Old^Key_Value);
	Key_Old=Key_Value;
	
	if(Key_Down==4)
	{
		ui_state++;
		if(ui_state>3)  ui_state=0;
	}
	
	if(ui_state==3 && Key_Down==5)
	{
		par_mode++;
		if(par_mode>2)  par_mode=0;
	}
	
	if(ui_state==0 && Key_Down==7) hz_mode^=1;
	if(ui_state==2 && Key_Down==6) cm_mode^=1;
	
	if(ui_state==3)
	{
		if(par_mode==0)
		{
			if(Key_Down==6)
			{
				freq_par+=0.5;
				if(freq_par>12.0)  freq_par=1.0;
			}
			else if(Key_Down==7)
			{
				freq_par-=0.5;
				if(freq_par<1.0)  freq_par=12.0;
			}
		}
		else if(par_mode==1)
		{
			if(Key_Down==6)
			{
				shidu_par+=10;
				if(shidu_par>60)  shidu_par=10;
			}
			else if(Key_Down==7)
			{
				shidu_par-=10;
				if(shidu_par<10)  shidu_par=60;
			}
		}
		else if(par_mode==2)
		{
			if(Key_Down==6)
			{
				dist_par+=0.1;
				if(dist_par>1.2)  dist_par=0.1;
			}
			else if(Key_Down==7)
			{
				dist_par-=0.1;
				if(dist_par<0.1)  dist_par=1.2;
			}
		}
	}
	
	if(ui_state==1)
	{
		if(Key_Value==7)
		{
			if(clear_tick++>100)
			{
				clear_flag=1;
			}
		}
		else
		{
			if(clear_flag==1)
			{
				clear_tick=0;
				clear_flag=0;
				count=0;
			}
			else
			{
				clear_tick=0;
			}
		}
	}
}
//
void Seg_Proc(void)
{
	if(Seg_Slow)  return;
	Seg_Slow=1;
	
	shidu=(Pcf_ADC(0x43)/51.0)*20.0;
	dist=Wave_Rec();
	
	if((dist/100.0)>dist_par)  
	{
		if(count_flag==0)
		{
			count_flag=1;
			count++;
		}
		dist_flag=1;
		ucLed |= 0x20;
	}
	else  
	{
		if(count_flag==1)
		{
			count_flag=0;
			count++;
		}
		dist_flag=0;
		ucLed &= 0xDF;
	}
	
	eeprom_string[0]=count;
	EEPROM_Write(eeprom_string,0,1);
	
	if(shidu<=shidu_par)
	{
		Pcf_DAC(51);
	}
	else if(shidu>=80)
	{
		Pcf_DAC(255);
	}
	else
	{
		Pcf_DAC(((4.0/(80.0-1.0*shidu_par))*(float)shidu+((80.0-5.0*shidu_par)/(80.0-1.0*shidu_par)))*51.0);
	}
	
	if(shidu>shidu_par)  ucLed |= 0x10;
	else  ucLed &= 0xEF;
	
	if(freq>(freq_par*1000))  
	{
		pwm_flag=1;
		ucLed |= 0x08;
	}
	else 
	{
		pwm_flag=0;
		ucLed &= 0xF7;
	}
	
	switch(ui_state)
	{
		case 0:
		{
			ucLed = ucLed&0xF9|0x01;
			par_mode=0;
			
			if(hz_mode==0)
			{
				sprintf(seg_string,"F %6d",freq);
			}
			else if(hz_mode==1)
			{
				sprintf(seg_string,"F %7.1f",freq/1000.0);
			}
			break;
		}
		
		case 1:
		{
			ucLed = ucLed&0xFA|0x02;
			sprintf(seg_string,"H     %2d",(unsigned int)shidu);
			break;
		}
		
		case 2:
		{
			ucLed = ucLed&0xFC|0x04;
			if(cm_mode==0)  
			{
				sprintf(seg_string,"A    %3d",(unsigned int)dist);
			}
			else if(cm_mode==1)
			{
				sprintf(seg_string,"A    %4.2f",dist/100.0);
			}
			break;
		}
		
		case 3:
		{
			if(par_mode==0)
			{
				ucLed = ucLed&0xF9^0x01;
				sprintf(seg_string,"P1   %4.1f",freq_par);
			}
			else if(par_mode==1)
			{
				ucLed = ucLed&0xFA^0x02;
				sprintf(seg_string,"P2    %2d",(unsigned int)shidu_par);
			}
			else if(par_mode==2)
			{
				ucLed = ucLed&0xFC^0x04;
				sprintf(seg_string,"P3    %3.1f",dist_par);
			}
			break;
		}
		
		default:break;
	}
	
	Seg_Tran(seg_string,seg_buf);
}

//-----------------------------------------------
//中断服务程序
void t2int() interrupt 12           //中断入口
{
	if(++onems_tick==10)
	{
		onems_tick=0;
		if(Key_Slow++==10)  Key_Slow=0;
		if(Seg_Slow++==100)  Seg_Slow=0;
		
		if(++freq_tick==100)
		{
			freq_tick=0;
			TR0 = 0;
			freq=((TH0<<8)|TL0);
			freq=freq*10;
			TL0 = 0;		
			TH0 = 0;		
			TR0 = 1;
		}
		
		Seg_Disp(seg_buf,pos);
		if(++pos==8)  pos=0;
		
		Led_Disp(ucLed);
	}
	
	if(dist_flag==0)  P0=0x00;
	else if(dist_flag==1)  P0=0x10;
//	
	if(pwm_flag==1)
	{
		pp2_flag=0;
		if(pwm_tick<8)
		{
			if(pp1_flag==0)
			{
				pp1_flag=1;
				P0|=0x20;
				P2=P2&0x1F|0xA0;
				P2=P2&0x1F;
			}
		}
		else
		{
			if(pp1_flag==1)
			{
				pp1_flag=0;
				P0|=0x00;
				P2=P2&0x1F|0xA0;
				P2=P2&0x1F;
			}

		}
		if(++pwm_tick==10)  pwm_tick=0;
	}
	else if(pwm_flag==0)
	{
		pp1_flag=0;
		if(pwm_tick<2)
		{
			if(pp2_flag==0)
			{
				pp2_flag=1;
				P0|=0x20;
				P2=P2&0x1F|0xA0;
				P2=P2&0x1F;
			}
		}
		else
		{
			if(pp2_flag==1)
			{
				pp2_flag=0;
				P0|=0x00;
				P2=P2&0x1F|0xA0;
				P2=P2&0x1F;
			}
		}
		if(++pwm_tick==10)  pwm_tick=0;
	}
}

其他模块

其他模块代码直接参考:【国一超全代码分享!】蓝桥杯单片机各模块代码整合

你可能感兴趣的:(蓝桥杯单片机竞赛,蓝桥杯,单片机,职场和发展,开发语言,笔记,嵌入式硬件,linux)