一.前言
这次蓝桥杯也是有惊无险侥幸拿到省一,准备把这一次省赛更完专注搞国赛去了
说一下这次比赛我的问题吧:
第一个就是频率测量时定时器的配置,我最开始是两个定时器分布位操作配置,但数码管显示异常,放在一个语句里面一起声明正常
第二个就是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&¶m_Mode==1)
{
if(chaoxian>1000)
{
chaoxian-=1000;
}
}
if(SMG_Mode==2&¶m_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&¶m_Mode==1)
{
if(chaoxian<9000)
{
chaoxian+=1000;
}
}
if(SMG_Mode==2&¶m_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();
}
}