蓝桥杯2024/1/28----十二届省赛题笔记

题目要求:

2、 竞赛板配置要求

2.1将 IAP15F2K61S2 单片机内部振荡器频率设定为 12MHz。
2.2键盘工作模式跳线 J5 配置为 KBD 键盘模式。
2.3扩展方式跳线 J13 配置为 IO 模式。
2.4 请注意 选手需严格按照以上要求配置竞赛板,编写和调试程序 不符合以上
配置要求的作品将被评为零分或者被酌情扣分。

3、 硬件框图

蓝桥杯2024/1/28----十二届省赛题笔记_第1张图片

4、 功能描述

4.1功能概述

1) 通过获取 DS18B20 温度传感器的温度数据,完成温度测量功能。
2) 通过 PCF8591 AD/DA 芯片完成 DAC 输出功能。
3) 通过数码管完成题目要求的数据显示功能。
4) 通过按键完成题目要求的显示界面切换和设置功能。
5) 通过 LED 指示灯完成题目要求的指示功能。

4.2性能要求

1) 温度数据刷新时间:≤1 秒。
2) DAC 输出电压刷新时间:≤0.5 秒。
3) 按键动作响应时间:≤0.2 秒。

4.3显示功能

蓝桥杯2024/1/28----十二届省赛题笔记_第2张图片

4.4按键功能

1) 功能说明
S4 :定义为“界面”按键,按下 S4 按键,切换温度显示界面、参数
设置界面和 DAC 输出界面,按键 S4 切换模式如图 5 所示:
S8 :定义为“减”按键
在参数界面下按下 S8 按键,温度参数减 1。
S9 :定义为“加”按键
在参数界面下按下 S9 按键,温度参数加 1。
S5 :定义为“模式”切换按键。
模式 1: DAC 输出电压与温度相关。
通过 DS18B20 采集到的实时温度小于温度参数时,
DAC 输出 0V,否则,
DAC 输出 5V。
模式 2: DAC 按照图 7 给出的关系输出电压。
2) 其它要求
按键应做好消抖处理,避免出现一次按键动作导致功能多次触发等问
题。 按键动作不影响数码管显示和数据采集过程。
S8、S9 按键仅在参数设置界面有效。
设定的温度参数在退出参数设置界面时生效。
蓝桥杯2024/1/28----十二届省赛题笔记_第3张图片

4.5LED 指示灯功能

1) 当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭。
2) 当前处于温度显示界面,指示灯 L2 点亮,否则熄灭。
3) 当前处于参数设置界面,指示灯 L3 点亮,否则熄灭。
4) 当前处于 DAC 输出界面,指示灯 L4 点亮,否则熄灭。

4.6初始状态说明

请严格按照以下要求设计作品的上电初始状态。
1) 处于温度显示界面。
2) 处于模式 1。
3) 温度参数为 25℃

每次建好工程文件夹,里边包含User(放工程文件,mian.c,可以在这里写如同我这个文章的文本文档)、Driver(存放底层文件如Led.c,Led.h等)
新建的工程先搭建框架,可以先书写底层函数(此次书写了六个函数并包含相应的头文件共十二个底层文件)


底层函数内容:

1.初始化底层驱动专用文件

比如先用3个IO口控制74HC138译码器,控制Y4为低电平;当Y4为低电平时,或非门74HC02控制Y4C为高电平,使74HC573的OE端口有效,OE端口有效时,可使用P0口控制LED的亮灭。
可以去多了解74HC138译码器,74HC02或非门,74HC573八路输出透明锁存器的相关内容会更好理解
#include

//关闭外设
void System_Init()
{
    P0 = 0xff;
    P2 = P2 & 0x1f | 0x80;
    P2 &= 0x1f;
    P0 = 0x00;
    P2 = P2 & 0x1f | 0xa0;
    P2 &= 0x1f;
}
//头文件
#include
void System_Init();

2.Led底层驱动专用文件

与初始化底层驱动专用文件同理,需要了解对应的锁存器控制,可以在使用的芯片数据手册查看
#include

void Led_Disp(unsigned char addr,enable)//LED
{
    static unsigned char temp = 0x00;
    static unsigned char temp_Old = 0xff;
    if(enable)
        temp |=0x01 << addr;
    else
        temp&= ~ (0x01 << addr);
    if(temp != temp_Old)
    {
        P0 = ~ temp;
        P2 = P2 & 0x1f | 0x80;
        P2 &= 0x1f;
        temp_Old = temp;
    }
}
void Beep(unsigned char flag)//蜂鸣器
{
    static unsigned char temp = 0x00;
    static unsigned char temp_Old = 0xff;
    if(flag)
        temp |=0x40 ;
    else
        temp &= ~ 0x40 ;
    if(temp != temp_Old)
    {
        P0 = ~ temp;
        P2 = P2 & 0x1f | 0xa0;
        P2 &= 0x1f;
        temp_Old = temp;
    }
}
void Relay(unsigned char flag)//继电器
{
    static unsigned char temp = 0x00;
    static unsigned char temp_Old = 0xff;
    if(flag)
        temp |= 0x10 ;
    else
        temp &= ~ 0x10 ;
    if(temp != temp_Old)
    {
        P0 = ~ temp;
        P2 = P2 & 0x1f | 0xa0;
        P2 &= 0x1f;
        temp_Old = temp;
    }
}

//头文件
#include
void Led_Disp(unsigned char addr,enable);

3.按键底层驱动专用文件

(板子上的按键从按键4开始到按键19,可根据实际硬件修改)
#include

unsigned char Key_Read()
{
    unsigned char temp = 0;
    P44 = 0; P42 = 1; P35 = 1; P34 = 1;//实际板子的连接
    //P37 = 0; P36 = 1; P35 = 1; P34 = 1;//这个是仿真使用的
    if(P33 == 0)temp = 4;
    if(P32 == 0)temp = 5;
    if(P31 == 0)temp = 6;
    if(P30 == 0)temp = 7;
    P44 = 1; P42 = 0; P35 = 1; P34 = 1;
    if(P33 == 0)temp = 8;
    if(P32 == 0)temp = 9;
    if(P31 == 0)temp = 10;
    if(P30 == 0)temp = 11;
    P44 = 1; P42 = 1; P35 = 0; P34 = 1;
    if(P33 == 0)temp = 12;
    if(P32 == 0)temp = 13;
    if(P31 == 0)temp = 14;
    if(P30 == 0)temp = 15;
    P44 = 1; P42 = 1; P35 = 1; P34 = 0;
    if(P33 == 0)temp = 16;
    if(P32 == 0)temp = 17;
    if(P31 == 0)temp = 18;
    if(P30 == 0)temp = 19;
    return temp;
    
}
//头文件
#include

unsigned char Key_Read();

4.数码管底层驱动专用文件

#include

unsigned char Seg_Dula[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc6,0x8c,0x88};//数码管段码储存数组
unsigned char Seg_Wela[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位码储存数组

void Seg_Disp(unsigned char wela,dula,point)//数码管显示函数
{
    P0 = 0xff; //
    P2 = P2 & 0x1f |0xe0;
    P2 &= 0x1f;
    P0 = Seg_Wela[wela];
    P2 = P2 & 0x1f |0xc0;
    P2 &= 0x1f;
    P0 = Seg_Dula[dula];
    if(point)
        P0 &= 0x7f;
    P2 = P2 & 0x1f |0xe0;
    P2 &= 0x1f;
}
//头文件
#include

void Seg_Disp(unsigned char wela,dula,point);

5.//DAC底层驱动专用头文件

/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "iic.h"


#include "intrins.h"

#define DELAY_TIME 5

#define Photo_Res_Channel 0x41
#define Adj_Res_Channel 0x43


//总线引脚定义


sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}

//总线启动条件


void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;    
}

//总线停止条件


void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答


void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;                      // 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答


bit IIC_WaitAck(void)
{
    bit ackbit;
    
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据


void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//从I2C总线上接收数据


unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
        SCL = 1;
    IIC_Delay(DELAY_TIME);
    da <<= 1;
    if(SDA) da |= 1;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    }
    return da;    
}


//函数名:DAC转换函数


//入口参数:要进行转换的数值
//返回值:无
//函数功能:对入口参数要转换的DA数据进行转换
void Da_Write(unsigned char dat)
{
    IIC_Start();//发送开启信号
    IIC_SendByte(0x90);//选择PCF8591芯片,确定写的模式
    IIC_WaitAck();//等待PCF8591反馈
    IIC_SendByte(0x41);//使能DA转换(随便写通道编号,不影响,主要的功能是使能DA)
    IIC_WaitAck();//等待PCF8591反馈
    IIC_SendByte(dat);//将待转换的数据发送出去
    IIC_WaitAck();//等待PCF8591反馈
    IIC_Stop();//停止发送
}
//头文件
# include "STC15F2K60S2.H"


void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
//函数名:DAC转换函数
//入口参数:要进行转换的数值
//返回值:无
//函数功能:对入口参数要转换的DA数据进行转换
void Da_Write(unsigned char dat);

6.//温度底层驱动专用头文件

/*    #     单总线代码片段说明
    1.     本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
    2.     参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
        中对单片机时钟频率的要求,进行代码调试和修改。
*/

#include "onewire.h"
#include "reg52.h"

sbit DQ = P1^4;

//单总线内部延时函数


void Delay_OneWire(unsigned int t) //12T 或1T,根据需要修改
{
    t *= 12;//用了温度这句必须写,设置为12T,这句官方不会写,这两句和下面的功能一样
    while(t--);
//    unsigned char i;
//    while(t--)
//        {
//            for(i=0;i<12;i++);
//        }
}

//单总线写操作


void Write_DS18B20(unsigned char dat)//写
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        DQ = 0;
        DQ = dat&0x01;
        Delay_OneWire(5);
        DQ = 1;
        dat >>= 1;
    }
    Delay_OneWire(5);
}

//单总线读操作


unsigned char Read_DS18B20(void)//读
{
    unsigned char i;
    unsigned char dat;
  
    for(i=0;i<8;i++)
    {
        DQ = 0;
        dat >>= 1;
        DQ = 1;
        if(DQ)
        {
            dat |= 0x80;
        }        
        Delay_OneWire(5);
    }
    return dat;
}

//DS18B20初始化


bit init_ds18b20(void)//初始化
{
      bit initflag = 0;
      
      DQ = 1;
      Delay_OneWire(12);
      DQ = 0;
      Delay_OneWire(80);
      DQ = 1;
      Delay_OneWire(10); 
    initflag = DQ;     
      Delay_OneWire(5);
  
      return initflag;
}


//函数名:读取温度函数


//入口参数:无
//函数功能:完成温度转换,并返回转换之后的温度数据
float Read_t()
{
    unsigned char high,low;//返回的温度数据的高低八位
    init_ds18b20();//初始化
    Write_DS18B20(0xcc);//跳过ROM
    Write_DS18B20(0x44);//进行温度转换
    init_ds18b20();//初始化
    Write_DS18B20(0xcc);//跳过ROM
    Write_DS18B20(0xbe);//读取温度
    low = Read_DS18B20();//读取低位
    high = Read_DS18B20();//读取高位
    return ((high << 8) |low) / 16.0;
}
//头文件
#ifndef __ONEWIRE_H
#define __ONEWIRE_H

float Read_t();

#endif

工程主函数内容:

1.头文件声明(把需要用到的头文件添加进来)


/*头文件声明区*/
#include //单片机寄存器专用头文件
#include //初始化底层驱动专用头文件
#include //Led底层驱动专用头文件
#include //按键底层驱动专用头文件
#include //数码管底层驱动专用头文件
#include "onewire.h"//温度底层驱动专用头文件
#include "iic.h"//DAC底层驱动专用头文件

2.变量声明(把需要用到的所有变量现在这里进行声明)


/*变量声明区*/
unsigned char Key_Val,Key_Old,Key_Down,Key_Up;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
unsigned char Seg_Slow_Down;//数码管减速专用变量
unsigned char Seg_Pos;//数码管扫描专用变量
unsigned char Seg_Buf[8] = {10,10,10,10,10,10,10,10};//数码管显示数据存放数组
unsigned char Seg_Point[8] = {0,0,0,0,0,0,0,0};//数码管小数点数据存放数组
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组
unsigned char Seg_Disp_Mode;//数码管显示模式 0-温度显示界面 1-参数设置界面 2-DAC输出界面
float Temperature;//实时温度变量
unsigned char Temp_Disp = 25;//温度参数变量(用于设置显示)
unsigned char Temp_Ctrol = 25;//温度参数控制变量(用于实际控制) 初始值:25
float Voltage_Output;//实时输出电压
bit Output_Mode;//DAC输出模式 0-DAC输出电压与温度相关 1-DAC给出的关系输出电压

3.按键处理函数(在这里编写按键控制的函数)


/*键盘处理函数*/
void Key_Proc()
{
    if(Key_Slow_Down)return;
    Key_Slow_Down = 1;//键盘减速程序
    
    Key_Val = Key_Read();//实时读取键码值
    Key_Down = Key_Val & (Key_Val ^ Key_Old);//捕捉按键下降沿
    Key_Up = ~ Key_Val & (Key_Val ^ Key_Old);//捕捉按键上升沿
    Key_Old = Key_Val;//辅助扫描变量
    
    switch(Key_Down)
    {
        case 4://界面切换按键
            if(++Seg_Disp_Mode == 3)
            Seg_Disp_Mode = 0;//数码管显示模式在0-2之间循环切换
            if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
            Temp_Disp = Temp_Ctrol;//将实际控制数据赋值给设置变量 便于数据更改
            if(Seg_Disp_Mode == 2) //当界面从参数设置切换出去后
            Temp_Ctrol = Temp_Disp;//将设置数据保存到控制变量
        break;
        case 8://参数自减按键
            if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
            {
                if(--Temp_Disp == 255)//限制温度下限为0
                    Temp_Disp = 0;
            }
        break;
            case 9://参数自加按键
            if(Seg_Disp_Mode == 1)//当前处于温度参数设置界面
            {
                if(++Temp_Disp == 100)//限制温度上限为99
                    Temp_Disp = 99;
            }
        break;
            case 5://模式切换按键
                Output_Mode ^= 1;//切换输出模式
            break;
    }
    
}

4.信息处理函数(需要使用到到的函数进行简单的预处理)


/*信息处理函数*/
void Seg_Proc()
{
    if(Seg_Slow_Down)return;
    Seg_Slow_Down = 1;
    /*信息获取区域*/
    Temperature = Read_t();//实时读取温度值
    /*数据显示区域*/

        switch(Seg_Disp_Mode)
        {
            case 0://温度显示界面
                Seg_Buf[0] = 11;//显示C
                Seg_Buf[4] = (unsigned char)Temperature / 10 % 10;
                Seg_Buf[5] = (unsigned char)Temperature % 10;
                Seg_Buf[6] = (unsigned int)(Temperature * 100 )/ 10 % 10;
                Seg_Buf[7] = (unsigned int)(Temperature * 100 )% 10;
                //Seg_Point[5] = 1;//使能小数点
            break;
            case 1://参数设置界面
                Seg_Buf[0] = 12;//显示P
                Seg_Buf[4] = Seg_Buf[5] = 10;//熄灭第五、第六个数码管
                Seg_Buf[6] = Temp_Disp / 10 % 10;
                Seg_Buf[7] = Temp_Disp % 10;
                Seg_Point[5] = 0;
            break;
            case 2://DAC输出界面
                Seg_Buf[0] = 13;//显示A
                Seg_Buf[5] = (unsigned char)Voltage_Output % 10;
                Seg_Buf[6] = (unsigned int)(Voltage_Output * 100 )/ 10 % 10;
                Seg_Buf[7] = (unsigned int)(Voltage_Output * 100 )% 10;
                Seg_Point[5] = 1;
            break;
        }
            
}
int cnt1=0;


5.其他函数(其他编写的函数,在这里书写会比较方便理解)


/*其他函数*/
void Led_Proc()
{
    unsigned char i;//用于For循环
    /*DAC相关*/
    if(Output_Mode == 0)//DAC输出电压与温度相关,当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭
    {
        if(Temperature < Temp_Ctrol)//当实时温度小于温度参数时
            Voltage_Output = 0;//DAC输出0V
        else//当实时温度大于参数设置时
            Voltage_Output = 5;//DAC输出5V
    }
    else    //当前处于 DAC 输出界面,指示灯 L4 点亮,否则熄灭。
    {
        if(Temperature < 20)//当实时温度小于20度时,测试时难以达到相应温度可以修改实际温度看显示状况
            Voltage_Output = 1;//DAC输出1V
        else if(Temperature > 40)//当实时温度小于40度时,测试时难以达到相应温度可以修改实际温度看显示状况
            Voltage_Output = 4;//DAC输出4V
        else//当实时温度在20-40之间时
            Voltage_Output = 0.15*(Temperature - 20) + 1;//DAC输出与实时温度为一次函数关系,0.15=(40-20)/(4-1)V
    }
    Da_Write(Voltage_Output * 51);//实时输出DAC,0-255的范围和0-5V要对应上则*51
    
    /*LED相关*/
    //    ucLed[0] = !Ouput_Mode;//当前处于模式 1 状态,指示灯 L1 点亮,否则熄灭
    //    for(i=0;i<3;i++)//模式指示灯
    //     ucLed[1+i] = (i == Seg_Disp_Mode);
//这几个同样可以实现指示灯的状态,但是在上电时L1常亮出现异常,当前并非为模式一界面,切换到模式一界面后L4没有熄灭,按下S5后L4才会熄灭
    for(i= 0;i<3;i++)//模式指示灯,无异常
    {
        if( Output_Mode == 0)
        {
            if(i == Seg_Disp_Mode )//上电显示界面
            {
                cnt1=i+1;
                if(cnt1==3)//DAC显示界面两种模式和输出模式
                {
                    Led_Disp(0,1);//L1
                    Led_Disp(3,0);//当L1亮起熄灭L4
                }
                else
                {
                    Led_Disp(i+1,1);
                }
                
            }
            else
            {
                //Led_Disp(i+1,0);
                cnt1=i+1;
                if(cnt1==3) Led_Disp(0,0);
                else Led_Disp(i+1,0);
            }
        }
        else    //DAC
        {
            if(i == Seg_Disp_Mode )
            {
                Led_Disp(0,0);
                Led_Disp(i+1,1);
            }
            else
                Led_Disp(i+1,0);
        }

    }    
}

6.定时器0中断初始化函数

(这个可以使用STC的定时器计算那里生成c代码,后面要自己添加ET0,EA打开中断)
/*定时器0初始化函数*/
void Timer0Init(void)        //1毫秒@12.000MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
    TMOD &= 0xF0;        //设置定时器模式
    TL0 = 0x18;        //设置定时初值
    TH0 = 0xFC;        //设置定时初值
    TF0 = 0;        //清除TF0标志
    TR0 = 1;        //定时器0开始计时
    ET0 = 1;
    EA = 1;
}


7.定时器0中断服务函数

(为了定时执行特定的任务,如此处设置了定时的时间触发了数码管和LED产生特定反应)
/*定时器0中断服务函数*/
void Timer0server() interrupt  1
{
    if(++Key_Slow_Down == 10)Key_Slow_Down = 0;//键盘减速专用
    if(++Seg_Slow_Down == 500)Seg_Slow_Down = 0;//数码管减速专用
    if(++Seg_Pos == 8)Seg_Pos = 0;//数码管显示专用
    Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
    
    //Led_Disp(Seg_Pos,ucLed[Seg_Pos]);//0  +1
}


/*延时函数*/


void Delay750ms()        //@12.000MHz
{
    unsigned char i, j, k;
    i = 35;
    j = 51;
    k = 182;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

8.主函数Main(调用书写的函数实现所需的相应功能)


/*Main*/
void main()
{
    Read_t();//上电读取一次温度并且延时750ms避免数据出现85
    Delay750ms();
    Sys_Init();
    Timer0Init();
    while(1)
    {
        Key_Proc();
        Seg_Proc();
        Led_Proc();
    }
}

DS18B20相关资料:

蓝桥杯2024/1/28----十二届省赛题笔记_第4张图片蓝桥杯2024/1/28----十二届省赛题笔记_第5张图片蓝桥杯2024/1/28----十二届省赛题笔记_第6张图片蓝桥杯2024/1/28----十二届省赛题笔记_第7张图片蓝桥杯2024/1/28----十二届省赛题笔记_第8张图片

Bit15-bit11:符号位;bit10-bit4:整数位;bit3-bit0:小数位

蓝桥杯2024/1/28----十二届省赛题笔记_第9张图片

后面返回值的时候有一个/ 16.0 ,等价于*0.625;这两个都是计算精度的。

蓝桥杯2024/1/28----十二届省赛题笔记_第10张图片蓝桥杯2024/1/28----十二届省赛题笔记_第11张图片蓝桥杯2024/1/28----十二届省赛题笔记_第12张图片蓝桥杯2024/1/28----十二届省赛题笔记_第13张图片蓝桥杯2024/1/28----十二届省赛题笔记_第14张图片蓝桥杯2024/1/28----十二届省赛题笔记_第15张图片蓝桥杯2024/1/28----十二届省赛题笔记_第16张图片蓝桥杯2024/1/28----十二届省赛题笔记_第17张图片蓝桥杯2024/1/28----十二届省赛题笔记_第18张图片蓝桥杯2024/1/28----十二届省赛题笔记_第19张图片蓝桥杯2024/1/28----十二届省赛题笔记_第20张图片

这两个为了更好的运行效果,可以直接在主函数调用,当把这两个语句放到while循环里面,或者读取的语句放入while循环里会产生大约10秒的延时才会显示数据,与预期750ms的效果相差较大。产生这么久的延时主要由于中断的数码管显示延时占用了较多次,可以把延时改小尝试。

你可能感兴趣的:(蓝桥杯笔记,蓝桥杯,笔记,职场和发展,单片机)