第十二届蓝桥杯

Posted 一心向月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十二届蓝桥杯相关的知识,希望对你有一定的参考价值。

通过学习与借鉴写的第十二届蓝桥杯单片机 简单易懂

全部程序请点击这里
提取码:azxy
主程序

#include"main.h"

extern bit timer_flag;				//使运行中断时与主函数不冲突
extern u8 key_flag;					//判断按键是否按下 
									//0:按下 
									//1:没按下
extern u8 key_num;					//按键反馈值
extern u8 smg_change[8];			//8个数码管显示
extern u8 code duan[15];			//0~9和要显示的数值

u8 mod_led=0xff;					//定义LED灯开关状态
u16 temp;							//温度值 
u16 wdcs=25;						//在参数温度时,温度参数变量
u16 wdcs_now=25;					//在程序运行时,生效温度参数
u16 dac=0;							//待输出的ADC电压值
u16 stan=0;							//界面切换 
									//0:为温度界面
									//1:为参数设置界面
									//2:DAC输出界面

u16 f_mod=0;					    //模式切换
								    //0:模式1
								    //1:模式2

/*==========================普通延迟函数============================*/
void delay(u16 i)
{
	while(i--);
}

/*==========================锁存器选择函数 =========================*/
void init_74hc573(num)
{
	switch(num)
	{
		case 4: P2=(P2&0x1f)|0x80; break;	  //选择LED控制
		case 5: P2=(P2&0x1f)|0xa0; break;	  //选择蜂鸣器和继电器控制
		case 6: P2=(P2&0x1f)|0xc0; break;	  //选择数码管位选
		case 7: P2=(P2&0x1f)|0xe0; break;	  //选择数码管段选
		case 0: P2=(P2&0x1f)|0x00; break;	  //所有不选择
	}
}


/*==========================系统初始化============================*/
void init_system()
{
	init_74hc573(4);				//关闭LED灯
	P0=0xff;
	init_74hc573(5);			    //关闭蜂鸣器
	P0=0x00;	
}


/*========================LED输出控制函数==========================*/
void set_led(u8 aa)
{
	init_74hc573(4);
	P0=aa;
	init_74hc573(0);		
}


/*=======================数码管输出控制函数=========================*/
void set_smg(u8 bb)
{
	init_74hc573(7);
	P0=bb;
	init_74hc573(6);
	P0=0x00;		
}


/*=======================温度显示界面函数==========================*/
void smg_wd()
{	
	temp=read_18b20float();
	set_led(0xff);
	mod_led=(mod_led|0xfe)&0xfd;
	set_led(mod_led);

	set_smg(0xff);
	smg_change[0]=duan[12];
	smg_change[1]=duan[10];
	smg_change[2]=duan[10];
	smg_change[3]=duan[10];
	smg_change[4]=duan[temp / 1000];
	smg_change[5]=duan[temp % 1000 / 100]+0x80;
	smg_change[6]=duan[temp % 100 / 10];
	smg_change[7]=duan[temp % 10];
	set_smg(0xff);	
}


/*=======================参数设置界面函数==========================*/
void smg_cs()
{
	set_led(0xff);
	mod_led=(mod_led|0xfe)&0xfb;
	set_led(mod_led);

	set_smg(0xff);
	smg_change[0]=duan[13];
	smg_change[1]=duan[10];
	smg_change[2]=duan[10];
	smg_change[3]=duan[10];
	smg_change[4]=duan[10];
	smg_change[5]=duan[10];
	smg_change[6]=duan[wdcs/ 10];
	smg_change[7]=duan[wdcs% 10];
	set_smg(0xff);
}


/*=======================DAC输出界面函数==========================*/
void smg_dac()
{	
	set_led(0xff);
	mod_led=(mod_led|0xfe)&0xf7;
	set_led(mod_led);

	set_smg(0xff);
	smg_change[0]=duan[14];
	smg_change[1]=duan[10];
	smg_change[2]=duan[10];
	smg_change[3]=duan[10];
	smg_change[4]=duan[10];
	smg_change[5]=duan[dac/100]+0x80;
	smg_change[6]=duan[(dac/10)%10];
	smg_change[7]=duan[dac% 10];
	set_smg(0xff);
}


/*=======================运行界面函数==========================*/
void running()
{
	u8 dat_dac;
	u16 tmp=0;
	temp=read_18b20float();
	switch(f_mod)
	{
		case 0:
		if(temp<(wdcs_now*100))
		{
			dac=0;
		}
		else
		{
			dac=500;
		}
	break;
	case 1:
		if(temp<2000)
		{
			dac=100;
		}
		else if(temp<4000)
		{
			tmp=(temp-2000)*15;
			dac=(tmp/100)+100;
		}
		else 
		{
			dac=400;
			
		}
	break;
	}
	dat_dac=dac*0.51;
	pcf8591(dat_dac);
}


/*=======================显示界面函数==========================*/
void displaysmg()
{
	switch(f_mod)
	{
		case 0:
		mod_led=0xfe;
		break;
		case 1:
		mod_led=0xff;
		break;
	}
	switch(stan)
	{
		case 0:
		running();
		smg_wd();
		break;
		case 1:
		running();
		smg_cs();
		break;
		case 2:
		running();
		smg_dac();
		break;

	}
}


/*=======================矩阵按键函数==========================*/
void key_cin()
{
	if(key_num==8)						 //如果S5按下
	{	
		f_mod++;
		if(f_mod==1) stan=0;
		if(f_mod==2)
		{
			f_mod=0;
			stan=0;
		}
		while(key_flag==0)				   //按键释放
		{
	     	displaysmg();
			delay(1000);
		}	   
	}
	if(key_num==12)					  	  //如果S4按下
	{	
		stan++;
		if(stan==1)
		{
		 	wdcs=wdcs_now;
		}
		else if(stan==2)
		{
		 	wdcs_now=wdcs;
			
		}
		else if(stan==3) stan=0;
		while(key_flag==0)				 //按键释放
		{
	     	displaysmg();
			delay(1000);
		}	  
		 
	}
	if(key_num==9)						//如果S9按下
	{
		if(stan==1)
		{
			wdcs++;
		}
		while(key_flag==0)				//按键释放
		{
	     	displaysmg();
			delay(1000);
		}	  
	}
	if(key_num==13)					   //如果S8按下
	{
		if(stan==1)
		{
			wdcs--;
		}
		while(key_flag==0)			  //按键释放
		{
	     	displaysmg();
			delay(1000);
		}	  
	}
}


/*=======================主函数==========================*/
void main()
{
	init_system();			   //系统初始化
	Timer0Init();			   //中断
	while(1)
	{	
		if(key_flag==1)		  //按键消抖
		{
			key_sd();
			key_flag=0;
		}
		running();
		displaysmg();
		key_cin();
		displaysmg();
	}
}

以上是关于第十二届蓝桥杯的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯单片机省赛程序设计总结

第十二届蓝桥杯单片机省赛程序设计总结

蓝桥杯单片机——第十二届蓝桥杯单片机第一场省赛

2021年软件类第十二届蓝桥杯 省赛 python组 F-J题解

《蓝桥杯真题》:2.第十二届省赛

蓝桥杯第十二届省赛