蓝桥杯单片机---第十一届省赛题目解析

2024-03-29 14:52

本文主要是介绍蓝桥杯单片机---第十一届省赛题目解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 比赛题目
  • 一、代码相关定义、声明
    • 1.头文件声明
    • 2.变量声明
  • 二、主要函数
    • 1.main函数
    • 2.按键扫描
    • 3.数码管显示
    • 4.电压 & LED显示
    • 5.定时器中断
    • 6.消除85°C显示
  • 三、次要函数
    • 1.初始化函数Init
    • 2.按键函数Key
    • 3.LED函数Led
    • 4.数码管函数Seg
    • 5.iic函数中
    • 6.onewire函数中
  • 总结


比赛题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、代码相关定义、声明

1.头文件声明

/* 头文件声明区 */
#include <STC15F2K60S2.H>//单片机寄存器专用头文件
#include <Init.h>//初始化底层驱动专用头文件
#include <Led.h>//Led底层驱动专用头文件
#include <Key.h>//按键底层驱动专用头文件
#include <Seg.h>//数码管底层驱动专用头文件
#include "onewire.h"
#include "iic.h"

2.变量声明

/* 变量声明区 */
unsigned char Key_Val,Key_Down,Key_Old,Key_Up;//按键专用变量
unsigned char Key_Slow_Down;//按键减速专用变量
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 Seg_Pos;//数码管扫描专用变量
unsigned int Seg_Slow_Down;//数码管减速专用变量
unsigned char ucLed[8] = {0,0,0,0,0,0,0,0};//Led显示数据存放数组
unsigned char Seg_Disp_Mode;//数码管显示变量 0-数据界面 1-参数界面
float Temperature;//实时温度
unsigned char Seg_Disp_HL[2] = {30,20};//参数设置的显示
unsigned char Seg_Disp_control[2] = {30,20};//参数设置的控制
unsigned char Seg_Disp_HL_index = 1;//调节温度最大和最小的索引下标
unsigned char erro_flag = 0;//保存错误标记

二、主要函数

1.main函数

/* Main */
void main()
{rd_temperature();Delay750ms();System_Init();Timer0Init();while (1){Key_Proc();Seg_Proc();Led_Proc();}
}

2.按键扫描

/* 键盘处理函数 */
void Key_Proc()
{if(Key_Slow_Down) return;Key_Slow_Down = 1;//键盘减速程序Key_Val = Key_Read();//实时读取键码值Key_Down = Key_Val & (Key_Old ^ Key_Val);//捕捉按键下降沿Key_Up = ~Key_Val & (Key_Old ^ Key_Val);//捕捉按键上降沿Key_Old = Key_Val;//辅助扫描变量switch(Key_Down){case 4:if(++Seg_Disp_Mode == 2) Seg_Disp_Mode = 0;if(Seg_Disp_Mode == 1){Seg_Disp_HL_index = 1;Seg_Disp_HL[0] = Seg_Disp_control[0];Seg_Disp_HL[1] = Seg_Disp_control[1];}else{if(Seg_Disp_HL[0] >= Seg_Disp_HL[1]){erro_flag = 0;Seg_Disp_control[0] = Seg_Disp_HL[0];Seg_Disp_control[1] = Seg_Disp_HL[1];}else erro_flag = 1;}break;case 5:if(Seg_Disp_Mode == 1){Seg_Disp_HL_index ^= 1;}break;case 6:if(Seg_Disp_Mode == 1){if(++Seg_Disp_HL[Seg_Disp_HL_index] == 100) Seg_Disp_HL[Seg_Disp_HL_index] = 99;}break;case 7:if(Seg_Disp_Mode == 1){if(--Seg_Disp_HL[Seg_Disp_HL_index] == 255) Seg_Disp_HL[Seg_Disp_HL_index] = 0;}break;	}
}

3.数码管显示

/* 信息处理函数 */
void Seg_Proc()
{if(Seg_Slow_Down) return;Seg_Slow_Down = 1;//数码管减速程序//信息处理区域Temperature = rd_temperature();switch(Seg_Disp_Mode){case 0://数据界面Seg_Buf[0] = 11;Seg_Buf[3] = 10;Seg_Buf[4] = 10;Seg_Buf[6] = (unsigned char)Temperature / 10 % 10;Seg_Buf[7] = (unsigned char)Temperature % 10;break;case 1://参数界面Seg_Buf[0] = 12;Seg_Buf[3] = Seg_Disp_HL[0] / 10 % 10;Seg_Buf[4] = Seg_Disp_HL[0] % 10;Seg_Buf[6] = Seg_Disp_HL[1] / 10 % 10;Seg_Buf[7] = Seg_Disp_HL[1] % 10;break;}
}

4.电压 & LED显示

/* 其他显示函数 */
void Led_Proc()
{unsigned char i;ucLed[0] = (Temperature > Seg_Disp_control[0]);ucLed[2] = (Temperature < Seg_Disp_control[0]);ucLed[1] = (Temperature <= Seg_Disp_control[0] && Temperature >= Seg_Disp_control[1]);ucLed[3] = erro_flag;for(i = 0 ; i < 3 ; ++ i){if(ucLed[i] == 1){Da_Write(51*(4-i));break;}}
}

5.定时器中断

/* 定时器0中断初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式TL0 = 0x18;		//设置定时初始值TH0 = 0xFC;		//设置定时初始值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时ET0 = 1;    //定时器中断0打开EA = 1;     //总中断打开
}/* 定时器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]);}

6.消除85°C显示

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

三、次要函数

1.初始化函数Init

在Init.c文件当中

#include <Init.h>void System_Init()
{P0 = 0xff;P2 = P2 & 0x1f | 0x80;P2 &= 0x1f;P0 = 0x00;P2 = P2 & 0x1f | 0xa0;P2 &= 0x1f;
}

在Init.h文件当中

#include <STC15F2K60S2.H>
void System_Init();

2.按键函数Key

在Key.c文件当中

#include <Key.h>
/*
unsigned char Key_Read()
{unsigned char temp = 0;P44 = 0;P42 = 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;
}
*/
unsigned char Key_Read()
{unsigned char temp = 0;if(P33 == 0) temp = 4;if(P32 == 0) temp = 5;if(P31 == 0) temp = 6;if(P30 == 0) temp = 7;return temp;
}

在Key.h文件当中

#include <STC15F2K60S2.H>
unsigned char Key_Read();

3.LED函数Led

#include <Led.h>void Led_Disp(unsigned char addr,enable)
{static unsigned char temp = 0x00;static unsigned char temp_old = 0xff;if(enable)temp |= 0x01 << addr;elsetemp &= ~(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;elsetemp &= ~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;elsetemp &= ~0x10;if(temp != temp_old){P0 = temp;P2 = P2 & 0x1f | 0xa0;P2 &= 0x1f;temp_old = temp;		}	
}

4.数码管函数Seg

#include <Seg.h>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;	
}

5.iic函数中

/*	#   I2C代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "iic.h"#define DELAY_TIME	5//
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 I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   scl = 1;I2C_Delay(DELAY_TIME);da <<= 1;if(sda) da |= 0x01;scl = 0;I2C_Delay(DELAY_TIME);}return da;    
}//
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}//
void I2CSendAck(unsigned char ackbit)
{scl = 0;sda = ackbit; I2C_Delay(DELAY_TIME);scl = 1;I2C_Delay(DELAY_TIME);scl = 0; sda = 1;I2C_Delay(DELAY_TIME);
}
//=========================unsigned char Ad_Read(unsigned char addr)
{unsigned char temp;I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CStart();I2CSendByte(0x91);I2CWaitAck();temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return temp;
} void Da_Write(unsigned char dat)
{I2CStart();I2CSendByte(0x90);I2CWaitAck();I2CSendByte(0x41);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();
}

6.onewire函数中

/*	# 	单总线代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include <reg52.h>
sbit DQ = P1^4;
//
void Delay_OneWire(unsigned int 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;
}//
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 rd_temperature(void)
{unsigned char low,high;//返回温度的高低八位init_ds18b20();//初始化Write_DS18B20(0xcc);//跳过ROMWrite_DS18B20(0x44);//进行温度转换init_ds18b20();//初始化Write_DS18B20(0xcc);//跳过ROMWrite_DS18B20(0xbe);//读取温度low = Read_DS18B20();//读取低位high = Read_DS18B20();//读取高位return ((high << 8) | low ) / 16.0;
}

总结

这一套试题主要收获了就是:
1.如何设置参数一般都是设置两个数组一个控制一个展示,然后通过赋值的方式进行保存
2.知道了如何防止数组越界那样卡着它

这篇关于蓝桥杯单片机---第十一届省赛题目解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/858881

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

springboot项目中使用JOSN解析库的方法

《springboot项目中使用JOSN解析库的方法》JSON,全程是JavaScriptObjectNotation,是一种轻量级的数据交换格式,本文给大家介绍springboot项目中使用JOSN... 目录一、jsON解析简介二、Spring Boot项目中使用JSON解析1、pom.XML文件引入依

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷