往期回顾
第三届蓝桥杯单片机省赛
第四届蓝桥杯单片机省赛
第五届蓝桥杯单片机省赛
第六届蓝桥杯单片机省赛
第七届蓝桥杯单片机省赛
第八届蓝桥杯单片机省赛
个人感觉这一届相对于以前应该是最难的一届,虽然用的东西少,但是如果是考场上想到就比较难了,对于那些只会八股文的来说
一、前期准备
1:本文使用的头文件是由stc生成
点击保存文件之后,保存至自己文件目录下方即可
2:本文使用的都是官方提供的底层驱动代码
二、代码详情
1.基础代码
蜂鸣器/继电器/led/定时器之类的代码
参考之前写的文章
第四届蓝桥杯代码讲解
2.按键详解
按键写法讲解
直接跳转以前的文章即可
多种蓝桥杯/51按键写法详解
3.驱动的处理
驱动写法讲解
直接跳转以前的文章即可
蓝桥杯驱动处理
4.数码管部分处理
直接跳转以前的文章即可
蓝桥杯数码管部分处理
4.总代码
#include<stc15f2k.h>
#include<iic.h>
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
char dula[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
char disdula[]={0,0,0,0,0,0,0,0};
int diswela=9,key,ms,wei=9,sign,run=9;
int date=1,clock_1=400,clock_2=400,clock_3=400,clock_4=400;
int rb,pwm,a,aa;
bit flag,stop,flag_1;
void zhuanhuan();
void buzz()
{
P2=((P2&0x1f)|0xa0);
P0=0x00;
P2&=0x1f;
}
void led(int x)
{
P2=((P2&0x1f)|0x80);
P0=x;
P2&=0x1f;
}
void delay(int x)
{
int i;
while(x--)
for(i=0;i<5*123;i++);
}
void din()
{
TMOD=0X10;
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
EA=1;
ET1=1;
TR1=1;
}
void display()
{
if(diswela==wei&ms>800)
{
if(wei==1)
diswela=diswela+1;
if(wei==4)
diswela=diswela+4;
}
P2=((P2&0x1f)|0xe0);
P0=0xff;
P2&=0x1f;
P2=((P2&0x1f)|0xc0);
P0=1<<diswela;
P2&=0x1f;
P2=((P2&0x1f)|0xe0);
P0=dula[disdula[diswela]];
P2&=0x1f;
if(++diswela>=10)diswela=0;
}
void display_1(int date)
{
disdula[0]=0;
disdula[1]=date;
disdula[2]=0;
disdula[3]=11;
if(date==1)
{
disdula[4]=clock_1/1000%10;
disdula[5]=clock_1/100%10;
disdula[6]=clock_1/10%10;
disdula[7]=clock_1/1%10;
}
if(date==2)
{
disdula[4]=clock_2/1000%10;
disdula[5]=clock_2/100%10;
disdula[6]=clock_2/10%10;
disdula[7]=clock_2/1%10;
}
if(date==3)
{
disdula[4]=clock_3/1000%10;
disdula[5]=clock_3/100%10;
disdula[6]=clock_3/10%10;
disdula[7]=clock_3/1%10;
}
if(date==4)
{
disdula[4]=clock_4/1000%10;
disdula[5]=clock_4/100%10;
disdula[6]=clock_4/10%10;
disdula[7]=clock_4/1%10;
}
}
char anjian()
{
int keyscan=0;
if(s4==0||s5==0||s6==0||s7==0)
{
delay(10);
if(s4==0)keyscan=4;
else if(s5==0)keyscan=5;
else if(s6==0)keyscan=6;
else if(s7==0)keyscan=7;
}while(s5==0||s6==0){display();display_1(date);}
return keyscan;
}
void at2402_write(int add,int date)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(date);
IIC_WaitAck();
IIC_Stop();
}
char at2402_read(int add)
{
int date;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
date=IIC_RecByte();
IIC_WaitAck();
IIC_SendByte(0);
IIC_Stop();
return date;
}
void ad()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
rb=IIC_RecByte();
IIC_WaitAck();
IIC_Stop();
zhuanhuan();
}
void display_2()
{
delay(1); //???????????
disdula[0]=11;
disdula[1]=11;
disdula[2]=11;
disdula[3]=11;
disdula[4]=11;
disdula[5]=11;
disdula[6]=0;
disdula[7]=rb%10;
}
void zhuanhuan()
{
if(rb>=0&rb<60)rb=1;
if(rb>=60&rb<120)rb=2;
if(rb>=120&rb<180)rb=3;
if(rb>=180&rb<=255)rb=4;
}
void led_mode()
{
int x;
static int i=0,mode=0;
if(stop==1)
{
switch(mode)
{
case 0:
x=~(0x01<<i);
aa=x;
led(x);
delay(clock_1);
if(++i>=8)
{
i=0;
mode=1;
}
break;
case 1:
x=~(0x80>>i);
aa=x;
led(x);
delay(clock_2);
if(++i>=8)
{
i=0;
mode=2;
}
break;
case 2:
x=~((0x01<<i)|(0x80>>i));
aa=x;
led(x);
delay(clock_3);
if(++i>=4)
{
i=0;
mode=3;
}
break;
case 3:
x=~((0x10<<i)|(0x08>>i));
aa=x;
led(x);
delay(clock_4);
if(++i>=4)
{
i=0;
mode=0;
}
break;
}
}
if(stop==0)led(0xff);
}
void renwu_1()
{
++sign;
if(sign<=1){wei=1;run=1;}
if(sign==2)wei=4;
if(sign>=3){wei=9;sign=0;run=9;}
}
void renwu_2()
{
if(wei==1)
{
date++;
if(date>=5)date=1;
}
if(wei==4)
{
if(date==1)
{
clock_1=clock_1+100;
if(clock_1>=1300)clock_1=400;
}
if(date==2)
{
clock_2=clock_2+100;
if(clock_2>=1300)clock_2=400;
}
if(date==3)
{
clock_3=clock_3+100;
if(clock_3>=1300)clock_3=400;
}
if(date==4)
{
clock_4=clock_4+100;
if(clock_4>=1300)clock_4=400;
}
}
}
void renwu_3()
{
if(wei==1)
{
date--;
if(date<=0)date=4;
}
if(wei==4)
{
if(date==1)
{
clock_1=clock_1-100;
if(clock_1<=300)clock_1=1200;
}
if(date==2)
{
clock_2=clock_2-100;
if(clock_2<=300)clock_2=1200;
}
if(date==3)
{
clock_3=clock_3-100;
if(clock_3<=300)clock_3=1200;
}
if(date==4)
{
clock_4=clock_4-100;
if(clock_4<=300)clock_4=1200;
}
}
}
void duqu()
{
clock_1=at2402_read(0x01)*100;
delay(10);
clock_2=at2402_read(0x02)*100;
delay(10);
clock_3=at2402_read(0x03)*100;
delay(10);
clock_4=at2402_read(0x04)*100;
delay(10);
}
void xieru()
{
if(date==1)
{
at2402_write(0x01,clock_1/100);
delay(10);
}
else if(date==2)
{
at2402_write(0x02,clock_2/100);
delay(10);
}
else if(date==3)
{
at2402_write(0x03,clock_3/100);
delay(10);
}
else if(date==4)
{
at2402_write(0x04,clock_4/100);
delay(10);
}
}
void take_on()
{
int i;
if(clock_1==0||clock_2==0||clock_3==0||clock_4==0)
{
for(i=0;i<4;i++)
{
if(clock_1==0)clock_1=400;
else if(clock_2==0)clock_2=400;
else if(clock_3==0)clock_3=400;
else if(clock_4==0)clock_4=400;
}
}
}
void renwu_6()
{
run=4;
while(1)
{
display_2();
display();
if(s4==1)
{
run=9;
break;
}
}
}
void pwm_1()
{
switch(rb)
{
case 1:pwm=1;break;
case 2:pwm=2;break;
case 3:pwm=3;break;
case 4:pwm=5;break;
}
}
void main()
{
duqu();
buzz();
led(0xff);
take_on();
din();
while(1)
{
if(flag_1==1){flag_1=0;led_mode();}
if(run==1)display_1(date);
if(wei==4)xieru();
ad();
pwm_1();
}
}
void qa() interrupt 3
{
TH1=(65536-11059/12)/256;
TL1=(65536-11059/12)%256;
ms++;;a++;
if(!(ms%100)){flag=1;flag_1=1;}
if(ms==1000)ms=0;
display();
if(run==9)diswela=9;
if(flag==1)
{
flag=0;
key=anjian();
switch(key)
{
case 4:
{
if(wei==1||wei==4)
{
renwu_3();
while(!s4)
{
if(wei==1||wei==4)
{
display_1(date);
display();
}
}
}
if(wei==9)
renwu_6();
break;
}
case 5:renwu_2(); break;
case 6:renwu_1(); break;
case 7:
if(stop==0)stop=1;
else stop=0;
while(!s7)
{
if(wei==1||wei==4)
{
display_1(date);
display();
}
else
{
diswela=8;
display();
display_1(date);
}
}
break;
}
}
if(stop==1)
{
if(a==pwm)led(0xff);
if(a>=5){led(aa);a=0;}
}
}