蓝桥杯学习笔记 CT107D 第十五届省赛

一.前言       

        这次蓝桥杯也是有惊无险侥幸拿到省一,准备把这一次省赛更完专注搞国赛去了

说一下这次比赛我的问题吧:

第一个就是频率测量时定时器的配置,我最开始是两个定时器分布位操作配置,但数码管显示异常,放在一个语句里面一起声明正常

第二个就是LED闪烁的代码过于复杂,想着能不能简化一些.

对于这次的数据包,在参考代码部分没有什么改动,照着去年来即可,就是原理图改动很大,但只需看第一页就行,如果不确定端口再去下面几页找端口,回来对应MCU的端口即可(除了按键其他都写在下图了)

二.试题

三. 代码部分

碎碎念:

我觉得这次的一个难点就是数据正负的处理,我的解决方法是原始数据仍为无符号整型,再置一个标志位,利用标志位来判断正负,以及校准时候对于校准值是加还是减.

#include <STC15F2K60S2.H>
#include "ds1302.h"
#include "iic.h"
sbit C1=P4^4;
sbit C2=P4^2;
sbit R1=P3^2;
sbit R2=P3^3;
code unsigned char SMG_Nodot[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char SMG_Mode=1;
unsigned int dat_f;
unsigned int dat_f_temp; 
unsigned int dat_f_max;
bit error=0;
unsigned int chaoxian=2000;
unsigned int jiaozhun;
unsigned char param_Mode=1;
unsigned char hour,min,sec;
unsigned char hour_temp,min_temp,sec_temp;
bit sign;
unsigned char huixian_Mode=1;
unsigned int count_f;
unsigned char count_times;
unsigned char DAC_Value;
unsigned char LED_times,warning_times;
bit LED_Flag,warning_Flag;
bit LED,warning;
unsigned char LED_Select=0xff;
void Delay_SMG(unsigned int t)
{
	while(t--);
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P0=dat;
	switch(channel)
	{
		case 4:
			P2=(P2&0x1f)|0x80;
		break;
		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;
	}
	P2=(P2&0x1f)|0x00;
}
void DS1302_Config()
{
	Write_Ds1302_Byte(0x8e,0x00);
	Write_Ds1302_Byte(0x80,0x05);
	Write_Ds1302_Byte(0x82,0x03);
	Write_Ds1302_Byte(0x84,0x13);
	Write_Ds1302_Byte(0x8e,0x80);
}
void DS1302_Read()
{
	hour=Read_Ds1302_Byte(0x85);
	min=Read_Ds1302_Byte(0x83);
	sec=Read_Ds1302_Byte(0x81);
}
void SMG_Display(unsigned char pos,unsigned char dat)
{
	SelectHC573(6,0x01<<(pos-1));
	SelectHC573(7,dat);
	Delay_SMG(500);
	SelectHC573(6,0x01<<(pos-1));
	SelectHC573(7,0xff);
}
void Display_Dynamic()
{
	if(SMG_Mode==1)
	{
		SMG_Display(1,SMG_Nodot[15]);
		if(error==0)
		{
			if(dat_f_temp>9999)
			{
				SMG_Display(4,SMG_Nodot[dat_f_temp/10000]);
			}
			if(dat_f_temp>999)
			{
				SMG_Display(5,SMG_Nodot[dat_f_temp%10000/1000]);
			}
			if(dat_f_temp>99)
			{
				SMG_Display(6,SMG_Nodot[dat_f_temp%1000/100]);
			}
			if(dat_f_temp>9)
			{
				SMG_Display(7,SMG_Nodot[dat_f_temp%100/10]);
			}
			SMG_Display(8,SMG_Nodot[dat_f_temp%10]);
	}
		if(error==1)
		{
			SMG_Display(7,0xc7);
			SMG_Display(8,0xc7);
		}
		}
	if(SMG_Mode==2)
	{
		SMG_Display(1,0x8c);
		SMG_Display(2,SMG_Nodot[param_Mode]);
		if(param_Mode==1)
		{
			
			if(param_Mode==1)
			{
				SMG_Display(5,SMG_Nodot[chaoxian/1000]);
				SMG_Display(6,SMG_Nodot[chaoxian%1000/100]);
				SMG_Display(7,SMG_Nodot[chaoxian%100/10]);
				SMG_Display(8,SMG_Nodot[chaoxian%10]);
			}
		}
		if(param_Mode==2)
		{
			if(sign==1)
			{
				SMG_Display(5,0xbf);
			}
			if(jiaozhun>9)
			{
				SMG_Display(6,SMG_Nodot[jiaozhun/100]);
				SMG_Display(7,SMG_Nodot[jiaozhun%100/10]);
				SMG_Display(8,SMG_Nodot[jiaozhun%10]);
			}
			if(jiaozhun<9)
			{
				SMG_Display(8,SMG_Nodot[jiaozhun]);
			}
		}
	}
	if(SMG_Mode==3)
	{
		SMG_Display(1,SMG_Nodot[hour/16]);
		SMG_Display(2,SMG_Nodot[hour%16]);
		SMG_Display(3,0xbf);
		SMG_Display(4,SMG_Nodot[min/16]);
		SMG_Display(5,SMG_Nodot[min%16]);
		SMG_Display(6,0xbf);
		SMG_Display(7,SMG_Nodot[sec/16]);
		SMG_Display(8,SMG_Nodot[sec%16]);
	}
	if(SMG_Mode==4)
	{
		SMG_Display(1,0x89);
		if(huixian_Mode==1)
		{
			SMG_Display(2,SMG_Nodot[15]);
			if(dat_f_max>9999)
			{
				SMG_Display(4,SMG_Nodot[dat_f_max/10000]);
			}
			if(dat_f_max>999)
			{
				SMG_Display(5,SMG_Nodot[dat_f_max%10000/1000]);
			}
			if(dat_f_max>99)
			{
				SMG_Display(6,SMG_Nodot[dat_f_max%1000/100]);
			}
			if(dat_f_max>9)
			{
				SMG_Display(7,SMG_Nodot[dat_f_max%100/10]);
			}
			SMG_Display(8,SMG_Nodot[dat_f_max%10]);
		}
		if(huixian_Mode==2)
		{
			SMG_Display(2,0x88);
			SMG_Display(3,SMG_Nodot[hour_temp/16]);
			SMG_Display(4,SMG_Nodot[hour_temp%16]);
			SMG_Display(5,SMG_Nodot[min_temp/16]);
			SMG_Display(6,SMG_Nodot[min_temp%16]);
			SMG_Display(7,SMG_Nodot[sec_temp/16]);
			SMG_Display(8,SMG_Nodot[sec_temp%16]);
		}
	}
}
void DAC_Write()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x43);
	I2CWaitAck();
	I2CSendByte(DAC_Value);
	I2CWaitAck();
	I2CStop();
}
void DAC_Caculate()
{
	float k;
	k=204.0/(chaoxian-500);
	if(dat_f>chaoxian)
	{
		DAC_Value=255;
	}
	if(dat_f<500||error==1)
	{
		DAC_Value=0;
	}
	if(dat_f>=500&&dat_f<=chaoxian&&error==0)
	{
		DAC_Value=(dat_f-500)*k+51;
	}	
	DAC_Write();
}
void chuafa_control()
{
	if(sign==1)
	{
		if(dat_f>jiaozhun)
		{
			dat_f_temp=dat_f-jiaozhun;
			error=0;
		}
		if(dat_f<jiaozhun)
		{
			error=1;
		}
	}
	if(sign==0)
	{
		error=0;
		dat_f_temp=dat_f+jiaozhun;
	}
	if(dat_f_temp>dat_f_max&&error==0)
	{
		dat_f_max=dat_f_temp;
		hour_temp=hour;
		min_temp=min;
		sec_temp=sec;
	}
}
void Scan_Key()
{
	C1=0;C2=1;
	R1=R2=1;
	if(R1==0)
	{
		Delay_SMG(500);
		if(R1==0)
		{
			if(SMG_Mode==2)
			{
				switch(param_Mode)
				{
					case 1:
						param_Mode=2;
					break;
					case 2:
						param_Mode=1;
					break;
				}
			}
			if(SMG_Mode==4)
			{
				switch(huixian_Mode)
				{
					case 1:
						huixian_Mode=2;
					break;
					case 2:
						huixian_Mode=1;
					break;
				}
			}
		}
		while(R1==0)
		{
			Display_Dynamic();
			DS1302_Read();
			chuafa_control();
		}
	}
	if(R2==0)
	{
		Delay_SMG(500);
		if(R2==0)
		{
			switch(SMG_Mode)
			{
				case 1:
					SMG_Mode=2;
					param_Mode=1;
				break;
				case 2:
					SMG_Mode=3;
				break;
				case 3:
					SMG_Mode=4;
					huixian_Mode=1;
				break;
				case 4:
					SMG_Mode=1;
				break;
			}
		}
		while(R2==0)
		{
			Display_Dynamic();
			DS1302_Read();
			chuafa_control();
		}
	}
	C1=1;C2=0;
	R1=R2=1;
	if(R1==0)
	{
		Delay_SMG(500);
		if(R1==0)
		{
			if(SMG_Mode==2&&param_Mode==1)
			{
				if(chaoxian>1000)
				{
					chaoxian-=1000;
				}
			}
			if(SMG_Mode==2&&param_Mode==2)
			{
				if(jiaozhun==0)
				{
					sign=1;
				}
				if(sign==0)
				{
					if(jiaozhun>0)
					{
						jiaozhun-=100;
					}
				}
				if(sign==1)
				{
					if(jiaozhun<900)
					{
						jiaozhun+=100;
					}
				}
			}
		}
		while(R1==0)
		{
			Display_Dynamic();
			DS1302_Read();
			chuafa_control();
		}
	}
	if(R2==0)
	{
		Delay_SMG(500);
		if(R2==0)
		{
			if(SMG_Mode==2&&param_Mode==1)
			{
				if(chaoxian<9000)
				{
					chaoxian+=1000;
				}
			}
			if(SMG_Mode==2&&param_Mode==2)
			{
				if(sign==0)
				{
					if(jiaozhun<900)
					{
						jiaozhun+=100;
					}
				}
				if(sign==1)
				{
					if(jiaozhun>0)
					{
						jiaozhun-=100;
					}
					if(jiaozhun==0)
					{
						sign=0;
					}
				}
			}
		}
		while(R2==0)
		{
			Display_Dynamic();
			DS1302_Read();
			chuafa_control();
		}
	}
}
void Timer1Init(void)		
{
	AUXR &= 0xBF;		
	TMOD = 0x06;		
	TL1 = 0xF0;		
	TH1 = 0xD8;		
	TF1 = 0;		
	TR1 = 1;		
	ET1=1;
	EA=1;
}
void Timer0_Init()
{
	TH0=0xff;
	TL0=0xff;
	//TMOD&=0xf6;
	TR0=1;
	ET0=1;
}
void Timer0_Service() interrupt 1
{
	count_f++;
}
void Timer1_Service() interrupt 3
{
	count_times++;
	if(count_times==100)
	{
		dat_f=count_f;
		count_f=0;
		count_times=0;
	}
	if(LED==1)
	{
		LED_times++;
		if(LED_times==20)
		{
			LED_times=0;
			LED_Flag=~LED_Flag;
			if(LED_Flag==1)
			{
				LED_Select&=0xfe;
				SelectHC573(4,LED_Select);
			}
			if(LED_Flag==0)
			{
				LED_Select|=0x01;
				SelectHC573(4,LED_Select);
			}
		}
	}
	if(warning==1)
	{
		warning_times++;
		if(warning_times==20)
		{
			warning_times=0;
			warning_Flag=~warning_Flag;
			if(warning_Flag==1&&error==0)
			{
				LED_Select&=0xfd;
				SelectHC573(4,LED_Select);
			}
			if(warning_Flag==0&&error==0)
			{
				LED_Select|=0x02;
				SelectHC573(4,LED_Select);
			}
		}
	}
}
void LED_Control()
{
	if(SMG_Mode==1)
	{
		LED=1;
	}
	if(SMG_Mode!=1)
	{
		LED=0;
        LED_Select|=0x01;
		SelectHC573(4,LED_Select);
	}
	if(dat_f_temp>chaoxian)
	{
		warning=1;
	}
	if(dat_f_temp<chaoxian)
	{
		warning=0;
        LED_Select|=0x02;
		SelectHC573(4,LED_Select);
	}
	if(error==1)
	{
		LED_Select&=0xfd;
		SelectHC573(4,LED_Select);
	}
	if(error==0&&warning==0)
	{
		LED_Select|=0x02;
		SelectHC573(4,LED_Select);
	}
}
void Sys_Init()
{
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	Timer1Init();
	Timer0_Init();
	DS1302_Config();
}
void main()
{
	Sys_Init();
	while(1)
	{
		Display_Dynamic();
		Scan_Key();
		DS1302_Read();
		DAC_Caculate();
		chuafa_control();
		LED_Control();
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值