第15届蓝桥杯单片机第一场省赛题(程序参考)

 序言:

        15届蓝桥杯单片机赛道题(第1场)并没有14届的省赛题难,但比14届以前的试题来说难度还是增加了的,尤其是他题目长度堪比国赛的长度,一定要仔细看题,不要缺少题目的要求。包含个人模版,此代码仅供参考。

题目:

                代码:

        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

        总结:

        犯懒了代码不想注释,如果有疑问,在评论区留下你的问题。这个代码,我不能保证拿满分,我自己比较粗心,如果哪里有问题,也请各位大佬在评论区留言,我会及时修改,想要完整代码,复制链接到浏览器就可。祝各位取得心仪的成绩。

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值