蓝桥杯单片机第十届国赛-功能全部实现

前言:

本篇主要分享了蓝桥杯单片机第十届国赛代码,主要偏重于串口的考察

(所示代码在开发板上已经实现全部功能)

代码:

#include <STC15F2K60S2.H>
#include "InitHC138.h"
#include "Nixie.h"
#include "Key.h"
#include "Delay.h"
#include "csb.h"
#include "iic.h"
#include "onewire.h"
#include "stdio.h"
#include "Uart.h"

unsigned char Uart_Recv[10];
unsigned char Uart_Recv_Index;
float t;
bit flag_t=0;//温度读取
unsigned char length;//距离
unsigned int num;//参数变更次数
char temper_set=30;//温度参数
char length_set=35;//距离参数
unsigned char compare_t_set=30;
unsigned char compare_l_set=35;
bit turn=0;//0为数据界面 1为参数界面
unsigned char mode1;//数据切换
bit mode2=0;//参数切换
bit lock=0;//长按键锁住键盘
bit lock2=0;//长按键锁住键盘
bit time_1s=0;
bit time2_1s=0;
bit flag_dac=0;
bit flag_da=0;
bit flag_uart=0;
bit compare=0;//参数变化标志
float vcc;
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
}

void SystemInit()
{
	P0=0xff;
	InitHC138(4);
	P0=0x00;
	InitHC138(5);
}

void Led_Config(unsigned char pin,state)
{
	unsigned char i,ledstate;
	static unsigned char LED[8]={0,0,0,0,0,0,0,0};
	
	if(LED[pin]!=state)
	{
		LED[pin]=state;
		ledstate=0xff;
		
		for(i=0;i<8;i++)
		{
			ledstate=ledstate^(LED[i]<<i);
		}
		P0=ledstate;
		InitHC138(4);
	}
}
//数据界面

//温度数据
void Temper_page()
{
	Nixie_SetBuf(1,12);
	
	Nixie_SetBuf(2,19);
	Nixie_SetBuf(3,19);
	Nixie_SetBuf(4,19);
	
	Nixie_SetBuf(5,(unsigned char)t/10);
	Nixie_SetBuf(6,(unsigned char)t%10);
	Nixie_SetBuf(7,(unsigned int)(t*10)%10);
	Nixie_SetBuf(8,(unsigned int)(t*100)%10);
	point[6]=1;
}
//距离数据
void Distance_page()
{
	Nixie_SetBuf(1,16);
	
	Nixie_SetBuf(2,19);
	Nixie_SetBuf(3,19);
	Nixie_SetBuf(4,19);
	Nixie_SetBuf(5,19);
	Nixie_SetBuf(6,19);

	Nixie_SetBuf(7,length/10);
	Nixie_SetBuf(8,length%10);
	if(length>=99)length=99;
	point[6]=0;

}
//变更次数
void Num_page()
{
	Nixie_SetBuf(1,17);
	
	Nixie_SetBuf(2,19);
	Nixie_SetBuf(3,19);
		point[6]=0;

	if(num==0)
	{
		Nixie_SetBuf(4,19);
		Nixie_SetBuf(5,19);
		Nixie_SetBuf(6,19);
		Nixie_SetBuf(7,19);
		Nixie_SetBuf(8,19);
	}
	else if(num/10==0)
	{
		Nixie_SetBuf(4,19);
		Nixie_SetBuf(5,19);
		Nixie_SetBuf(6,19);
		Nixie_SetBuf(7,19);
		Nixie_SetBuf(8,num);
	}
	else if(num/100==0)
	{
		Nixie_SetBuf(4,19);
		Nixie_SetBuf(5,19);
		Nixie_SetBuf(6,19);
		Nixie_SetBuf(7,num/10);
		Nixie_SetBuf(8,num%10);
	}
	else if(num/1000==0)
	{
		Nixie_SetBuf(4,19);
		Nixie_SetBuf(5,19);
		Nixie_SetBuf(6,num/100);
		Nixie_SetBuf(7,num/10%10);
		Nixie_SetBuf(8,num%10);
	}
	else if(num/10000==0)
	{
		Nixie_SetBuf(4,19);
		Nixie_SetBuf(5,num/1000);
		Nixie_SetBuf(6,num/100%10);
		Nixie_SetBuf(7,num/10%10);
		Nixie_SetBuf(8,num%10);
	}
	else 
	{
		Nixie_SetBuf(4,num/10000);
		Nixie_SetBuf(5,num/1000%10);
		Nixie_SetBuf(6,num/100%10);
		Nixie_SetBuf(7,num/10%10);
		Nixie_SetBuf(8,num%10);		
	}
}

//参数界面

//温度参数
void Temper_Setpage()
{
	Nixie_SetBuf(1,18);
	
	Nixie_SetBuf(2,19);
	Nixie_SetBuf(3,19);
	
	Nixie_SetBuf(4,1);
	
	Nixie_SetBuf(5,19);
	Nixie_SetBuf(6,19);
	
	Nixie_SetBuf(7,temper_set/10);
	Nixie_SetBuf(8,temper_set%10);
		point[6]=0;

}
//距离参数
void Length_Setpage()
{
	Nixie_SetBuf(1,18);
	
	Nixie_SetBuf(2,19);
	Nixie_SetBuf(3,19);
	
	Nixie_SetBuf(4,2);
	
	Nixie_SetBuf(5,19);
	Nixie_SetBuf(6,19);
	
	Nixie_SetBuf(7,length_set/10);
	Nixie_SetBuf(8,length_set%10);
		point[6]=0;

}

void Key_Loop()
{
	static unsigned char Key_Val,Key_Old,Key_Down,Key_Up;
	Key_Val=ScanKey();
	Key_Down=Key_Val&(Key_Old^Key_Val);
	Key_Up=~Key_Val&(Key_Old^Key_Val);	
	Key_Old=Key_Val;
	if(lock==0&&lock2==0)
{
	if(Key_Up==13)
	{
		if(turn==0)
		{
			turn=1;
			mode2=0;
		}
		else if(turn==1)
		{
			turn=0;
			mode1=0;
		}
	}
	else if(Key_Up==12)
	{
		if(turn==0)
		{
			if(mode1==0)mode1=1;
			else if(mode1==1)mode1=2;
			else if(mode1==2)mode1=0;
		}
		else if(turn==1)
		{
			if(mode2==0)mode2=1;
			else if(mode2==1)mode2=0;
		}
	}
	else if(Key_Up==16)
	{
		if(turn==1)
		{
			if(mode2==0)
			{
				temper_set-=2;
			  if(temper_set<0)temper_set=0;
			}
			else if(mode2==1)
			{
				length_set-=5;
				if(length_set<0)length_set=0;
			}
		}
	}
	else if(Key_Up==17)
	{
		if(turn==1)
		{
			if(mode2==0)
			{
				temper_set+=2;
			  if(temper_set>99)temper_set=99;
			}
			else if(mode2==1)
			{
				length_set+=5;
				if(length_set>99)length_set=99;
			}
		}
	}
}
	if(Key_Down==12)
	{
		time_1s=1;
	}
	else if(Key_Up==12)
	{
		time_1s=0;
	}
	if(Key_Down==13)
	{
		time2_1s=1;
	}
	else if(Key_Up==13)
	{
		time2_1s=0;
	}
}


//数据读取函数
void Date_Read()
{
	if(flag_t==1)
	{
		t=read_t();
		if(t>80)return ;
		flag_t=0;
	}
	if(flag_da==1)
	{
		DA_Write(vcc*51.0);
		length=csb();
		flag_da=0;
	}
		if(turn==0)
	{
		if(mode1==0)Temper_page();
		else if(mode1==1)Distance_page();
		else if(mode1==2)Num_page();
	}
	else if(turn==1)
	{
		if(mode2==0)Temper_Setpage();
		else if(mode2==1)Length_Setpage();
	}
	if(flag_dac==1)vcc=0.4;
else if(flag_dac==0)
{
	if(length<=length_set)vcc=2.0;
		else if(length>length_set)vcc=4.0;
}
}

//串口
void Uart_Page()
{
	if(Uart_Recv_Index>0)
	{
	if(Uart_Recv_Index==4)
	{
		if(Uart_Recv[0]=='S'&&Uart_Recv[1]=='T'&&Uart_Recv[2]=='\r'&&Uart_Recv[3]=='\n')
		{
			printf("$%2d,%.2f\r\n",(unsigned int)length,t);
		}
		else printf("ERROR\r\n");
	}
   else if(Uart_Recv_Index==6)
	 {
		 if(Uart_Recv[0]=='P'&&Uart_Recv[1]=='A'&&Uart_Recv[2]=='R'&&Uart_Recv[3]=='A'&&Uart_Recv[4]=='\r'&&Uart_Recv[5]=='\n')
		{
			printf("#%2d,%2d\r\n",(unsigned int)temper_set,(unsigned int)length_set);			
		}
		else 
			printf("ERROR\r\n");
	 }
		else	printf("ERROR\r\n");
	Uart_Recv_Index=0;
  }
}

void main()
{
	
	Timer0Init();
	SystemInit();
	UartInit();
	read_t();
	Delay(750);
	
	while(1)
	{
		Date_Read();
		if(flag_uart==1)
		{
			Uart_Page();
			flag_uart=0;
		}
		
		if(t>temper_set&&t<80)
		{
			Led_Config(0,1);
		}
		else if(t<=temper_set||t>80)
		{
			Led_Config(0,0);			
		}
			
		if(length<length_set)
		{
			Led_Config(1,1);
		}
		else if(length>=length_set)
		{
			Led_Config(1,0);			
		}
		if(flag_dac==0)
		{
			Led_Config(2,1);			
		}
		else if(flag_dac==1)
		{
			Led_Config(2,0);						
		}
	
		if(compare==1)
		{
					if(compare_t_set!=temper_set)
		{
			num++;
			compare_t_set=temper_set;
		}
		else if(compare_l_set!=length_set)
		{
			num++;
			compare_l_set=length_set;
		}
    compare=0;
		}
	}
}


void Timer0_Service() interrupt 1
{
	static unsigned char count1=0;
	static unsigned char count2=0;
	static unsigned int count3=0;
	static unsigned char count4=0;
	static unsigned int count5=0;
	static unsigned int count6=0;
	static unsigned char count7=0;
	static unsigned char count8=0;
	
	count1++;
	count2++;
	count3++;
	count4++;
	count7++;
	count8++;
	if(count8>=200)
	{
		flag_uart=1;
		count8=0;
	}
	if(time_1s==1)
	{
		count5++;
	}
	if(count5<1000)
	{
		if(time_1s==0)
		count5=0;	
		
		lock=0;
	}
		if(count5>=1000)
	{  
		if(time_1s==0)
	{
		num=0;
		count5=0;
	}
   lock=1;
	}
	
	if(time2_1s==1)
	{
		count6++;
	}
	if(count6<1000)
	{
		if(time2_1s==0)
		count6=0;	
		
		lock2=0;
	}
		if(count6>=1000)
	{  
		if(time2_1s==0)
	{
		flag_dac=!flag_dac;
		count6=0;
	}
   lock2=1;
	}
if(count7>=199)
{
	count7=0;
	flag_da=1;
}
	
	if(count1>=2)
	{
		Nixie_Loop();
		count1=0;
	}
	if(count2>=10)
	{
		Key_Loop();
		count2=0;
	}
	if(count3>=399)
	{
		flag_t=1;
		count3=0;
	}
	if(count4>=100)
	{
		count4=0;
		compare=1;
	}
}

void Uart_Sev() interrupt 4
{
	if(RI)
	{
		Uart_Recv[Uart_Recv_Index]=SBUF;
		Uart_Recv_Index++;
		RI=0;
	}
	
}

/*
#ifndef ___H__
#define ___H__



#endif
*/


  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值