【蓝桥杯单片机】第十一届省赛

news2025/3/13 13:34:34

一、真题

 

二、创建工程

1.在C盘以外的盘新建文件夹,并在文件夹里面创建两个文件夹Driver 和Project

2.打开keil软件,在新建工程并选择刚刚建好的project文件夹,以准考证号命名

 3.选择对应的芯片型号

 4.选择否,即不创建启动文件

5.勾上生成hex文件的功能

 

6.添加头文件路径

三、模块构建 

1.编写初始化函数(init.c) 

void Cls_Peripheral(void);

  1. 关闭led    led对应的锁存器由Y4C控制
  2. 关闭蜂鸣器和继电器 由Y5C控制

2.编写LED函数(led.c)

void Led_Disp(unsigned char ucLed);

  1. 将ucLed取反的值赋给P0

  2. 开启锁存器 y4

  3. 关闭锁存器 y4

3.编写数码管函数(seg.c)

void Seg_Tran(unsigned char *pucSeg_Buf,unsigned char *pucSeg_Code);

(1)段码转换函数

  • 定义两个变量i,j
  • for循环加Switch语句进行段码转换,在资源数据包查找段码表,并根据题目要求进行段码转换
  • 注意添加空格代表都不显示
  • 注意8+4是C 不是A

void Seg_Disp(unsigned char *pucSeg_Code,unsigned char ucSeg_Pos);

(2)数码管显示函数

  • 要对数码管进行消隐y7
  • 显示的位置 y6
  • 显示的内容y7

4. 编写矩阵键盘代码(key.c)

unsigned char Key_Read_KBD(void);

  1. 有返回值
  2. 16个按键,要用十六位数据类型 unsigned int
  3. 依次将每一列设置为低电平,读取P3的低四位(&0x0f)存储到变量Key_New里,要忘记每个都左移4位,然后记得|
  4. 用Switch语句将按键按下后的值进行判断(Key_New取反 便于理解)
  5. 返回对应按键的值
  6. 不要忘记default 返回都没有按下的值 设为0

5.编写ADC代码

unsigned char PCF8591_ADC(void);

  1.  定义SCL,SDA
  2. 返回值类型
  3. 添加"intrins.h"头文件,接触nop错误
  4. 定义变量用于存储采集的电压
  5. 写入流程:开始--发送写入地址--等待应答--发送电位器地址--等待应答
  6. 读取流程:开始--发送读取地址--等待应答--变量接收数据--发送应答1--终止
  7. 读取地址为0x91 写入地址为0x90
  8. 电位器地址为0x43 
  9. 不要忘记把temp返回

 6.编写AT24C02代码

void EEPROM_Read(unsigned char *pucBuf,unsigned char addr,unsigned char num);

  •  读取流程:开始--发送写入地址--等待应答--发送写入位置-等待应答--开始--发送读取地址--等待应答--while(num--)来逐个存储读取的数据--if判断num是否为0--终止

void EEPROM_Write(unsigned char *pucBuf,unsigned char addr,unsigned char num)

  • 开始--发送写入地址--等待应答--发送写入位置--等待应答-- while(num--)来逐个将数据写入(加入延时保证稳定性)--终止

7.定时器函数编写

void Timer0Init(void); 

  1. 在sti-isp软件中生成定时长度为1ms的c代码,直接复制
  2. 不要忘记打开定时器0的开关和定时器总开关

 四、主函数代码

1.添加好所有头文件在主函数和工程文件夹中

2.外设初始化,定时器初始化,打开中断总开关

3.数码管函数编写

  • 定义数组和变量,数组分别为12为和8位,不加*  变量赋初值为0
  • 编写Seg_Proc();函数
  • 添加时间变量在定时器0中断进行自加
  • 200ms
  • 动态显示添加到中断里
  • 判断模式
  • 数码管转换函数不要忘

4.ADC函数编写

  • 时间200
  • 将读取的值赋值给变量,实际的值需要除以51.0是真实电压值

5.按键函数编写

  • 不用NE555时,不要短接,否则按键会失效

6.led函数编写

  •  200ms
  • 最后不要忘记调用led显示函数

五、难点解析

1.关于EEPROM 的断电保存

2.触发条件

3.指示灯 用到了ulms

4.无效按键的触发 

六、主函数代码

#include <stdio.h>
#include "seg.h"
#include "led.h"
#include "init.h"
#include "key.h"
#include "iic.h"
#include "tim.h"
//Seg
unsigned char pucSeg_Buf[12],pucSeg_Code[8],ucSeg_Pos=0;
//ADC
unsigned char ucADC=0;
float ADC_Pram=0;
unsigned int uicount=0;
unsigned char ucADC_Old=0;
//led
unsigned char ucLed=0;
//key
unsigned char Key_Val=0,Key_Val_Old=0;
unsigned int uiError=0;
//EEPROM
unsigned char EEPROM_Buf[2];
//timer
unsigned long ulms=0;
unsigned long ulled=0;
unsigned int uiSeg_Dly=0;
unsigned int uiADC_Dly=0;
unsigned int uiKey_Dly=0;
unsigned int uiLed_Dly=0;

//function
void Seg_Proc(void);
void ADC_Proc(void);
void Key_Proc(void);
void Led_Proc(void);
 
//mode
unsigned char Disp_Mode=0;

void main(void)
{
	Cls_Peripheral();
	EEPROM_Read(EEPROM_Buf,0x00,1);
	ADC_Pram=EEPROM_Buf[0]/10.0;
	Timer0Init();
	EA=1;
	while(1)
	{
		Seg_Proc();
		ADC_Proc();
		Key_Proc();
		Led_Proc();
	}
}
void Led_Proc(void)
{
	if(uiLed_Dly<200)
	return;
	uiLed_Dly=0;
	
	if(((ucADC/51.0)<ADC_Pram)&&(ulms-ulled>5000))
	{
		ucLed|=0x01;
	}
	else
		
	{
	  ucLed&=~0x01;
	}
	if(uicount%2==0)
	{
		ucLed&=~0x02;
	}
	else
	{
	  ucLed|=0x02;
	}
	if(uiError>=3)
	{
		ucLed|=0x04;
	}
	else
	{
	  ucLed&=~0x04;
	}
	Led_Disp(ucLed);
}

void Seg_Proc(void)
{
	if(uiSeg_Dly<200)
	return;
	uiSeg_Dly=0;
	if(Disp_Mode==0)
	{
		sprintf(pucSeg_Buf,"U    %4.2f",ucADC/51.0);
	}
	else if(Disp_Mode==1)
	{
		sprintf(pucSeg_Buf,"P    %4.2f",ADC_Pram);
	}
	else
	{
		sprintf(pucSeg_Buf,"N%7u",uicount);
	}
	Seg_Tran(pucSeg_Buf,pucSeg_Code);
}
void ADC_Proc(void)
{
	if(uiADC_Dly<500)
	return;
	uiADC_Dly=0;
	ucADC=PCF8591_ADC();
	if(((ucADC_Old/51.0)>ADC_Pram)&&((ucADC/51.0)<=ADC_Pram))
	{
		uicount++;
		ulled=ulms;
	}
	if(((ucADC_Old/51.0)<ADC_Pram)&&((ucADC/51.0)>=ADC_Pram))
	{
		ulled=ulms;
	}
	ucADC_Old=ucADC;
}
void Key_Proc(void)
{
	if(uiKey_Dly<20)
	return;
	uiKey_Dly=0;
	
	Key_Val=Key_Read_KBD();
	if(Key_Val==Key_Val_Old)
		return;
	switch (Key_Val)
	{
		case 12:
			uiError=0;
			Disp_Mode=(Disp_Mode+1)%3;
		if(Disp_Mode==2)
		{
			EEPROM_Buf[0]=(unsigned char)(ADC_Pram*10);
			EEPROM_Write(EEPROM_Buf,0x00,1);
		}
			break;
		case 13:
			if(Disp_Mode==2)
			{
				uiError=0;
				uicount=0;
			}
			else
			{
				uiError++;
			}
		case 16:
			if(Disp_Mode==1)
			{
				uiError=0;
				if(ADC_Pram>=5)
				{
					ADC_Pram=0;
				}
				else
				{
				ADC_Pram+=0.5;
				}
			}
			else
			{
				uiError++;
			}
			break;
			case 17:
			if(Disp_Mode==1)
			{
				uiError=0;
				if(ADC_Pram<=0.0)
				{
					ADC_Pram=5.0;
				}
				else
				{
				ADC_Pram-=0.5;
				}
			}
			else
			{
				uiError++;
			}
			break;
	}
		Key_Val_Old=Key_Val;
}
void Time_0(void) interrupt 1
{
	ulms++;
	uiSeg_Dly++;
	uiADC_Dly++;
	uiKey_Dly++;
	uiLed_Dly++;
	if(ulms%2==0)
	{
		ucSeg_Pos=(ucSeg_Pos+1)%8;
		Seg_Disp(pucSeg_Code,ucSeg_Pos);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【存储中间件】Neo4J图数据库超详细教程(一):相关介绍、特点及优势、数据模型、软件安装

文章目录 Neo4J超详细教程一、Neo4J相关介绍1.为什么需要图数据库方案1&#xff1a;Google方案2&#xff1a;Facebook 2.特点和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李…

xxl-job部署在docker-destop,实现定时发送预警信息给指定邮箱

XXL-JOB XXL-JOB是一个分布式任务调度平台&#xff08;XXL是作者徐雪里姓名拼音的首字母&#xff09;&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 源码仓库地址&#xff1a;https://github.com/xuxueli/xxl-job 源码结构&#xff1a; 系统架构 在xxl-j…

【QT】QScrollBar设置样式:圆角、隐藏箭头、上边距等

目录 0.简介 1.原理 2.具体代码 0.简介 环境&#xff1a;Ubuntu22.04、qtDesigner绘制UI 项目需要&#xff0c;按照UI修改滚动条样式&#xff0c;滚动条我使用的是QScrollBar&#xff0c;默认样式和修改之后的样式如下&#xff1a; 1.原理 2.具体代码 我是用qtDesigner绘制…

trae中文版AI搭建完整可用的项目框架

Trae 是由字节跳动推出的 AI 原生集成开发环境&#xff08;AI IDE&#xff09;&#xff0c;号称可以搭建完整项目&#xff0c;个人试用后体验确实比Cursor或cline更便捷&#xff0c;因为他多个文件关联准确率更高。 正式版的trae不支持大陆使用&#xff0c;不过目前已经推出了…

cfi网络安全 网络安全hcip

目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1&#xff0c;周期更新计时器 2&#xff0c;失效计时器 3&#xff0c;垃圾回收计时器 RIP的核心思…

Banana Pi 与瑞萨电子携手共同推动开源创新:BPI-AI2N

2025年3月11日&#xff0c; Banana Pi 开源硬件平台很高兴宣布&#xff0c;与全球知名半导体解决方案供应商瑞萨电子&#xff08;Renesas Electronics&#xff09;正式达成技术合作关系。此次合作标志着双方将在开源技术、嵌入式系统和物联网等领域展开深度合作&#xff0c;为全…

linux 命令 ls

ls 是 Linux 系统中用于列出目录内容的核心命令&#xff0c;几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时&#xff0c;默认列出当前目录的内容。 可以指定文件或目录路径&#xff0c;支持通配符&#xff08;如…

C#-扩展方法-Linq

密封类 sealed&#xff0c;无法被继承 var 可以定义匿名对象 static void test1() {var t 1;t "jack";//报错&#xff0c;类型已经确定好了var s new{id 1,name "tom"};Console.WriteLine(s.id s.name); } 扩展方法 对现有类型做方法的扩展&am…

Go红队开发—web网络编程

文章目录 web网络编程Req快速请求 调试DevModeDebugLogTraceInfo瓶颈分析 控制请求与响应控制请求的字段内容控制调试打印的内容分开dump请求与响应部分请求体设置 作用范围级别设置参数查询URL 路径参数表单请求设置请求头设置 判断响应状态码解析数据SetSuccessResultgjson响…

轻量级模块化前端框架:快速构建强大的Web界面

轻量级模块化前端框架&#xff1a;快速构建强大的Web界面 在当今快节奏的Web开发环境中&#xff0c;选择一个高效且灵活的前端框架至关重要。UIkit 是一个轻量级的模块化前端框架&#xff0c;旨在帮助开发者快速构建功能强大且响应迅速的Web界面。 UIkit提供了丰富的组件和工…

qt+opengl 播放yuv视频

一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

5G基本概念

作者:私语茶馆 1. 5G应用场景概述 1.1.5G应用场景 ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信); emBB:Enhanced Mobile Broadband ,移动互联网应用,是4G MBB(移动宽带)的升级,主要侧重于网络速率、带…

PH热榜 | 2025-03-12

1. Fluently 标语&#xff1a;开始说英语&#xff0c;就像说你的母语一样流利。 介绍&#xff1a;想象一下&#xff0c;有一个像人类一样的英语教练&#xff0c;全天候在线、价格却便宜15倍。这就是 Fluently &#x1f680; 纠正你的错误&#xff0c;提升你的词汇量、发音和语…

Python Web项目的服务器部署

一.部署运行 1.虚拟环境的安装&#xff1a;&#xff08;一行一行运行&#xff09; wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh bash miniconda.sh -b -p /opt/miniconda3 echo export PATH"/opt/miniconda3/bin:$PAT…

[项目]基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆

基于FreeRTOS的STM32四轴飞行器: 八.遥控器摇杆 一.摇杆数据的扫描二.处理摇杆数据三.微调按键处理 一.摇杆数据的扫描 下面摇杆初始化时&#xff0c;启动了ADC-DMA进行了采集&#xff0c;已经开始转换直接将数据通过DMA存入buff数组中&#xff1a; static uint16_t buff[4] …

附下载 | 2024 OWASP Top 10 基础设施安全风险.pdf

《2024 OWASP Top 10 基础设施安全风险》报告&#xff0c;由OWASP&#xff08;开放网络应用安全项目&#xff09;发布&#xff0c;旨在提升企业和组织对基础设施安全风险、威胁与漏洞的意识&#xff0c;并提供高质量的信息和最佳实践建议。报告列出了2024年最重要的10大基础设施…

Pytorch的一小步,昇腾芯片的一大步

Pytorch的一小步&#xff0c;昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息&#xff1a;PyTorch最新2.1版本宣布支持华为昇腾芯片&#xff01; 1、 发生了什么事儿&#xff1f; 在2023年10月4日PyTorch 2.1版本的发布博客上&#xff0c;PyTorch介绍的beta版本…

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

《A Gentle Introduction to Graph Neural Networks》-GNN的综述性论文

目录 一、什么数据可以表示成一张图 &#xff08;1&#xff09;什么是图&#xff1f; &#xff08;2&#xff09;如何表示图的属性 &#xff08;3&#xff09;images as graphs&#xff08;将图片表示为图&#xff09; &#xff08;4&#xff09;text as graphs&#xff08…

[023-01-40].第40节:组件应用 - OpenFeign与 Sentinel 集成实现fallback服务降级

SpringCloud学习大纲 一、需求说明&#xff1a; 需求1&#xff1a;通过fallback属性进行统一配置 a.问题分析&#xff1a; 1.需要实现cloudalibaba-consumer-nacos-order83模块通过OpenFeign调用cloudalibaba-provider-payment9001 83服务通过OpenFeign调用 9001微服务&…