序言:
15届蓝桥杯单片机赛道题(第1场)并没有14届的省赛题难,但比14届以前的试题来说难度还是增加了的,尤其是他题目长度堪比国赛的长度,一定要仔细看题,不要缺少题目的要求。包含个人模版,此代码仅供参考。
题目:
![](https://i-blog.csdnimg.cn/blog_migrate/0631cccdb0a9e520e0c06aafc7e8e149.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/561b7e9f4d1504861d762b9c54564e0f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/185415ef4f3da331e8b630e91ec3965d.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/c3ac108e2f7d6c0f756baa62e0b333d6.jpeg)
代码:
main.c
#include <STC15F2K60S2.H>
#include "Init.h"
#include "SMG.h"
#include "Timer.h"
#include "Key.h"
#include "ds1302.h"
#include "iic.h"
extern long int F;
extern int Over_Limit_Para;
unsigned char *Time;
void main(void)
{
Sys_Init();
Init_Time();
Timer0Init();
Timer1Init();
while(1)
{
if(F < 0)
Set_Vcc(0);
else if(F >= 0 && F <= 500)
Set_Vcc(52);
else if(F >= 500 && F < Over_Limit_Para)
Set_Vcc(((4.0 / (Over_Limit_Para - 500.0)) * F +(Over_Limit_Para - 700.0)* 1.0/(Over_Limit_Para - 500.0)) * 51);
else
Set_Vcc(255);
Time = Aquire_Time();
Key_Pro();
Data();
}
}
Init.c
#include <STC15F2K60S2.H>
void Select_74HC573(unsigned char x)
{
switch(x)
{
case 4: P2 &= 0x1f; P2 |= 0x80;break;
case 5: P2 &= 0x1f; P2 |= 0xA0;break;
case 6: P2 &= 0x1f; P2 |= 0xC0;break;
case 7: P2 &= 0x1f; P2 |= 0xE0;break;
case 0: P2 &= 0x1f;break;
}
}
void Sys_Init(void)
{
P0 = 0x00;
Select_74HC573(5);
Select_74HC573(0);
P0 = 0x00;
Select_74HC573(6);
Select_74HC573(0);
P0 = 0xff;
Select_74HC573(4);
Select_74HC573(0);
P0 = 0xff;
Select_74HC573(7);
Select_74HC573(0);
}
SMG.c
#include <STC15F2K60S2.H>
#include "Init.h"
unsigned char code Number[] = {
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0x8e,0x8c,0x89,0x88,0xbf,0xc7
};
void Show_Char(unsigned char Row,Num)
{
Select_74HC573(7);
P0 = Number[Num];
Select_74HC573(6);
P0 = 0x01 << Row;
Select_74HC573(0);
}
unsigned char xdata a[4][8] = {
10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
};
unsigned char State = 0;
int Over_Limit_Para = 2000;
int Calibration_Para = 0;
extern unsigned char *Time;
extern char P_Flag,H_Flag;
extern long int F;
extern int Max_F;
extern unsigned char Max_Time[3];
void Data(void)
{
switch(State)
{
case 0:
a[0][0] = 11;a[0][1] = 10;a[0][2] = 10;
if(F >= 0)
{
if(F >= 10000)a[0][3] = F / 10000 % 10;else a[0][3] = 10;
if(F >= 1000)a[0][4] = F / 1000 % 10;else a[0][4] = 10;
if(F >= 100)a[0][5] = F / 100 % 10;else a[0][5] = 10;
if(F >= 10)a[0][6] = F / 10 % 10;else a[0][6] = 10;
a[0][7] = F / 1 % 10;
}
else if(F < 0)
{
a[0][3] = 10;a[0][4] = 10;a[0][5] = 10;a[0][6] = 16;a[0][7] = 16;
}
break;
case 1:
a[1][0] = 12;a[1][1] = P_Flag + 1;a[1][2] = 10;a[1][3] = 10;
if(!P_Flag)
{
a[1][4] = Over_Limit_Para / 1000;a[1][5] = 0;a[1][6] = 0;a[1][7] = 0;
}
else
{
if(Calibration_Para > 0)
{a[1][4] = 10;a[1][5] = Calibration_Para / 100;a[1][6] = 0;a[1][7] = 0;}
else if(Calibration_Para == 0)
{a[1][4] = 10;a[1][5] = 10;a[1][6] = 10;a[1][7] = 0;}
else
{a[1][4] = 15;a[1][5] = Calibration_Para * (-1) / 100;a[1][6] = 0;a[1][7] = 0;}
}
break;
case 2:
a[2][0] = Time[2] / 10;a[2][1] = Time[2] % 10;a[2][2] = 15;a[2][3] = Time[1] / 10;
a[2][4] = Time[1] % 10;a[2][5] = 15;a[2][6] = Time[0] / 10;a[2][7] = Time[0] % 10;
break;
case 3:
a[3][0] = 13;
if(!H_Flag)
{
a[3][1] = 11;a[3][2] = 10;
if(Max_F >= 10000)a[3][3] = Max_F / 10000 % 10;else a[3][3] = 10;
if(Max_F >= 1000)a[3][4] = Max_F / 1000 % 10;else a[3][4] = 10;
if(Max_F >= 100)a[3][5] = Max_F / 100 % 10;else a[3][5] = 10;
if(Max_F >= 10)a[3][6] = Max_F / 10 % 10;else a[3][6] = 10;
a[3][7] = Max_F / 1 % 10;
}
else
{
a[3][1] = 14;
a[3][2] = Max_Time[2] / 10;a[3][3] = Max_Time[2] % 10;
a[3][4] = Max_Time[1] / 10;a[3][5] = Max_Time[1] % 10;
a[3][6] = Max_Time[0] / 10;a[3][7] = Max_Time[0] % 10;
}
break;
}
}
unsigned char LED = 0xff;
unsigned char Flah_L1 = 0,Flah_L2 = 0;
void LED_Loop(void)
{
if(State == 0)
{
Flah_L1++;
if(Flah_L1 == 200)
{
Flah_L1 = 0;
LED ^= 0x01;
}
}
else
{
Flah_L1 = 0;
LED |= 0x01;
}
if(F > Over_Limit_Para)
{
Flah_L2++;
if(Flah_L2 == 200)
{
Flah_L2 = 0;
LED ^= 0x02;
}
}
else if(F < 0)
{
Flah_L2 = 0;
LED &= 0xFD;
}
else
{
Flah_L2 = 0;
LED |= 0x02;
}
P0 = LED;
Select_74HC573(4);
Select_74HC573(0);
}
void SMG_Loop(void)
{
static unsigned char i = 0;
Show_Char(i,a[State][i]);
i++;
i %= 8;
}
Timer.c
#include <STC15F2K60S2.H>
#include "SMG.h"
void Timer1Init(void)
{
AUXR &= 0xBF;
TMOD &= 0x0F;
TL1 = 0x18;
TH1 = 0xFC;
TF1 = 0;
TR1 = 1;
ET1 = 1;
EA = 1;
}
void Timer0Init(void)
{
AUXR &= 0x7F;
TMOD &= 0xF0;
TMOD |= 0x05;
TL0 = 0x00;
TH0 = 0x00;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
}
long int F = 0;
unsigned char K = 0;
void Timer0(void) interrupt 1
{
K++;
}
extern int Calibration_Para;
extern unsigned char *Time;
int Max_F = 0;
unsigned char Max_Time[3];
int count = 0;
void Timer1(void) interrupt 3
{
count++;
if(count % 2 == 0)
SMG_Loop();
if(count % 1000 == 0)
{
F = ((TH0 << 8) | TL0) + K * 65535 + Calibration_Para;
if(F > Max_F)
{
Max_Time[2] = Time[2];
Max_Time[1] = Time[1];
Max_Time[0] = Time[0];
Max_F = F;
}
TH0 = TL0 = K = 0;
}
LED_Loop();
}
Key.c
#include <STC15F2K60S2.H>
bit Key_Up = 1;
void Delay40ms() //@12.000MHz
{
unsigned char i, j, k;
i = 2;
j = 211;
k = 231;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned char Key_Loop(void)
{
P42 = 0; P44 = 1;
if(Key_Up && (!P33 || !P32))
{
Key_Up = 0;
Delay40ms();
if(!P33) return 8;
if(!P32) return 9;
}
P42 = 1; P44 = 0;
if(Key_Up && (!P33 || !P32))
{
Key_Up = 0;
Delay40ms();
if(!P33) return 4;
if(!P32) return 5;
}
P42 = 0;
if(P33 && P32)
{
Key_Up = 1;
}
return 0;
}
extern unsigned char State;
extern int Over_Limit_Para,Calibration_Para;
char P_Flag = 0;
char H_Flag = 0;
void Key_Pro(void)
{
unsigned char Key;
Key = Key_Loop();
switch(Key)
{
case 4:
State++;
State %= 4;
P_Flag = 0;
H_Flag = 0;
break;
case 5:
if(State == 1)
{
P_Flag++;
P_Flag %= 2;
}
else if(State == 3)
{
H_Flag++;
H_Flag %= 2;
}
break;
case 8:
if(State == 1 && P_Flag == 0)
{
Over_Limit_Para += 1000;
if(Over_Limit_Para == 10000)
Over_Limit_Para = 9000;
}
else if(State == 1 && P_Flag == 1)
{
Calibration_Para += 100;
if(Calibration_Para == 1000)
Calibration_Para = 900;
}
break;
case 9:
if(State == 1 && P_Flag == 0)
{
Over_Limit_Para -= 1000;
if(Over_Limit_Para == 0)
Over_Limit_Para = 1000;
}
else if(State == 1 && P_Flag == 1)
{
Calibration_Para -= 100;
if(Calibration_Para == -1000)
Calibration_Para = -900;
}
break;
}
}
ds1302.c
#include <STC15F2K60S2.H>
#include "intrins.h"
sbit SDA = P2^3;
sbit SCK = P1^7;
sbit RST = P1^3;
//
void Write_Ds1302(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK = 0;
SDA = temp&0x01;
temp>>=1;
SCK=1;
}
}
//
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
Write_Ds1302(dat);
RST=0;
}
//
unsigned char Read_Ds1302_Byte( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK=0; _nop_();
SCK=1; _nop_();
SDA=0; _nop_();
SDA=1; _nop_();
return (temp);
}
void Init_Time(void)
{
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);
}
unsigned char *Aquire_Time(void)
{
unsigned char Time[3];
Time[0] = Read_Ds1302_Byte(0x81) / 16 * 10 + Read_Ds1302_Byte(0x81) % 16 ;
Time[1] = Read_Ds1302_Byte(0x83) / 16 * 10 + Read_Ds1302_Byte(0x83) % 16 ;
Time[2] = Read_Ds1302_Byte(0x85) / 16 * 10 + Read_Ds1302_Byte(0x85) % 16 ;
return &Time;
}
iic.c
#include <STC15F2K60S2.H>
#include "intrins.h"
#define DELAY_TIME 10
sbit scl = P2^0;
sbit sda = P2^1;
//
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
//
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
//
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
//
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
void Set_Vcc(unsigned char Data)
{
I2CStart();
I2CSendByte(0x90);
I2CWaitAck();
I2CSendByte(0x43);
I2CWaitAck();
I2CSendByte(Data);
I2CWaitAck();
I2CStop();
}
完整工程代码:
https://pan.baidu.com/s/1ftcAluq6H-NonMhoRV4N8w?pwd=youz
总结:
犯懒了代码不想注释,如果有疑问,在评论区留下你的问题。这个代码,我不能保证拿满分,我自己比较粗心,如果哪里有问题,也请各位大佬在评论区留言,我会及时修改,想要完整代码,复制链接到浏览器就可。祝各位取得心仪的成绩。