蓝桥杯单片机第十四届省赛模拟考试一

news2024/10/6 4:08:23

一、基本要求


使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。

硬件设置:

将IAP15F2K61S2单片机内部振荡器频率设定为12MHz,串口通信波特率为9600bps

键盘工作模式跳线J5配置为KBD矩阵按键模式。

扩展方式跳线J13配置为IO模式。

请注意:选手需严格按照以上要求配置竞赛板,编写和调试程序,不符合以上配置要求的作品将被评为零分或者被酌情扣分。

二、硬件框图


图1 系统硬件框图

三、功能描述


3.1 基本功能描述

1) 通过PCF8591的ADC通道测量电位器RB2的输出电压,模拟噪音分贝。噪音数据与电压关系曲线如下图所示。

图2 噪音分贝与电压采集关系曲线

2)通过数码管显示模拟的噪音分贝和分贝参数,显示界面可以通过按键切换。

3)通过串口向PC端返回当前噪音数据。

4)通过按键实现界面的切换和分贝参数的调整。

5)通过LED指示灯完成题目要求的输出指示功能。

3.2 数码管显示

1)噪音界面

噪音界面如图3所示,显示内容包括界面提示符(U1)和噪音数据,噪音数据保留小数点后1位有效数据。

固定使用三位数码管显示噪音数据,当数据长度不足3位时,高侧(左侧)数码管熄灭。

图3 噪音分贝显示界面(54.6dB)

2)参数界面

参数界面如图3所示,显示内容包括界面提示符(U2)和参数数据。

固定使用两位数码管显示分贝参数数据,当数据长度不足2位时,高侧(左侧)数码管熄灭。

图4 分贝参数显示界面(65dB)

3.3 按键功能

1)按键S12定义为“切换”按键,按下S12按键,能够切换“噪音分贝显示界面”、“分贝参数显示界面”。

图5 按键S12‘切换’

2)按键S16定义为“加”按键,在“分贝参数显示界面”时,按下S16按键,当前分贝参数加5dB。

图6 按键S16‘加’

3)按键S17定义为“减”按键,在“分贝参数显示界面”时,按下S17按键,当前分贝参数减5dB。

图7 按键S17‘减’

注意

按键S16和按键S17仅在“参数界面”有效

判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。

3.4 串口通信功能

当前界面处于噪音分贝显示界面时,当串口收到字符串“Return”时,将当前检测的噪音数据发送给PC端的串口调试工具。

串口打印格式为: “Noises:54.6dB”

设备串口返回数据格式为字符串。

串口通信波特率:9600bps,请使用竞赛平台上的USB转串口单元完成此项功能。

3.5 LED指示灯功能

1) 当前界面处于噪音分贝显示界面时,L1指示灯点亮,否则熄灭。

2) 当前界面处于分贝参数显示界面时,L2指示灯点亮,否则熄灭。

3) 当噪音分贝超过分贝参数时,L8指示灯以0.1s为间隔切换亮灭状态;否则熄灭。

4) 指示灯L3-L7处于熄灭状态。

3.6 初始化

1) 数码管默认处于噪音分贝显示界面。

2) 上电默认分贝参数为65dB,参数设置范围为0-90。

题目来源——4T官网

代码参考如下,4T测评其他功能都没问题,就只有L8闪烁周期有问题,实在找不出问题所在,如有大佬知晓,望指正

#include <STC15F2K60S2.H>
#include "iic.h"
#include "intrins.h"
#include "string.h"
#include "stdio.h"
#define TSMG 500
void send_mydat();
void SelectHC573(unsigned char channel,unsigned char dat);
sbit h3 = P3^2;
sbit h4 = P3^3;
sbit s3 = P3^5;
sbit s4 = P3^4;
code unsigned char Seg_Table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82,0xf8,
	                              0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86,0x8e };
code unsigned char nodot[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char adc_value = 0;
float adc_volt = 0;
float dB_value = 0;
unsigned int dB_smg = 0;
unsigned char dB_param = 65;
unsigned char UI = 0;//0-噪音界面 1-参数界面
unsigned char stat_dat = 0;//数据接收完成状态
unsigned char str_dat[20];//储存接收的数据
unsigned char receve_dat = 0;//接受的一位数据
unsigned char send_dat[20];//要发送的数据
unsigned char stat_RX = 0;
unsigned char num = 0;
unsigned char stat_led = 0xff;
unsigned char count_01s = 0;
unsigned char stat_warn = 0;
void Delay20ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 1;
	j = 234;
	k = 113;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Timer5Init(void)		//50毫秒@12.000MHz
{
	AUXR &= 0xFB;		//定时器时钟12T模式
	T2L = 0xB0;		//设置定时初值
	T2H = 0x3C;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	EA = 1;
	IE2 |= 0x04;
}
void Sevice_timer2() interrupt 12
{
	if(stat_warn == 1)
	{
		count_01s++;
		if(count_01s == 2)
		{
			count_01s = 0;
			if((stat_led & 0x80) == 0x00)//亮状态
			{
				stat_led |= 0x80;
				SelectHC573(4,stat_led);
			}
			else
			{
				stat_led &= 0x7f;
				SelectHC573(4,stat_led);
			}
		}
	}
}
void Init_Uart()
{
	PCON &= 0x7f;
	SCON = 0x50;
	AUXR |= 0x40;
	AUXR &= 0xfe;
	TMOD &= 0x0f;
	TMOD |= 0x20;
	TL1 = 0xd9;
	TH1 = 0xd9;
	ET1 = 0;
	TR1 = 1;
	EA = 1;
	ES = 1;
}
void sevice_Uart() interrupt 4
{
	if(RI == 1)
	{
		RI = 0;
		receve_dat = SBUF;
		if((stat_RX == 0) && (stat_dat == 0))
		{
			if(receve_dat == 'R')
			{
				num = 0;
				stat_RX = 1;
				str_dat[num++] = receve_dat;
			}
		}
		else if(stat_RX == 1)
		{
			str_dat[num++] = receve_dat;
			if(num == 6)
			{
				stat_dat = 1;
				str_dat[num] = '\0';
				stat_RX = 0;
			}
		}
	}
}
void Uart_sendbyt(unsigned char dat)
{
	SBUF = dat;
	while(TI == 0);
	TI = 0;
}
void Uart_sendsting(char *dat)
{
	while(*dat != '\0')
	{
		Uart_sendbyt(*dat++);
	}
}
void read_myvolt()
{
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(0x03);
	I2CWaitAck();
	I2CStop();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	adc_value = I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	adc_volt = adc_value * (5.0 / 255);
	dB_value = adc_volt * 18;
	dB_smg = dB_value * 10;
}
void SelectHC573(unsigned char channel,unsigned char dat)
{
	P2 = (P2 & 0x1f) | 0x00;
	P0 = dat;
	switch(channel)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
		case 0:
			P2 = (P2 & 0x1f) | 0x00;
		break;
	}
	P2 = (P2 & 0x1f) | 0x00;
}
void DelaySMG(unsigned int t)
{
	while(t--);
}
void DisplaySMG_Bit(unsigned char pos,unsigned char value)
{
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,value);
	DelaySMG(TSMG);
	SelectHC573(6,0x01 << pos);
	SelectHC573(7,0xff);
}
void DisplaySMG_ALL(unsigned char value)
{
	SelectHC573(6,0xff);
	SelectHC573(7,value);
}
void DisplaySMG_Info()
{
	if(UI == 0)
	{
		DisplaySMG_Bit(0,0xc1);
		DisplaySMG_Bit(1,Seg_Table[1]);	
		if(dB_smg > 99)
		DisplaySMG_Bit(5,Seg_Table[dB_smg / 100]);
		DisplaySMG_Bit(6,nodot[dB_smg / 10 % 10]);
		DisplaySMG_Bit(7,Seg_Table[dB_smg % 10]);
	}
	else if(UI == 1)
	{
		DisplaySMG_Bit(0,0xc1);
		DisplaySMG_Bit(1,Seg_Table[2]);	
		if(dB_param > 9)
		DisplaySMG_Bit(6,Seg_Table[dB_param / 10]);
		DisplaySMG_Bit(7,Seg_Table[dB_param % 10]);
	}
	
}
void Scan_key()
{
	h4 = 0;
	s3 = s4 = h3 = 1;
	if(s3 == 0)//12
	{
		Delay20ms();
		if(s3 == 0)
		{
			if(UI == 0)
			{
				UI = 1;
			}
			else
			{
				UI = 0;
			}
			while(s3 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	if(s4 == 0)//16
	{
		Delay20ms();
		if(s4 == 0)
		{
			if(dB_param == 90)
			{
				dB_param = 0;
			}
			else
			{
				dB_param+=5;
			}
			while(s4 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
	h3 = 0;
	h4 = s3 = s3 = 1;
	if(s4 == 0)//17
	{
		Delay20ms();
		if(s4 == 0)
		{
			if(dB_param == 0)
			{
				dB_param = 90;
			}
			else
			{
				dB_param -= 5;
			}
			while(s4 == 0)
			{
				DisplaySMG_Info();
			}
		}
	}
}
void send_mydat()
{
	if(stat_dat == 1)
	{
		if(UI == 0)
		{
			if(strcmp(str_dat,"Return") == 0)
			{
				sprintf(send_dat,"Noises:%.1fdB",dB_value);
				Uart_sendsting(send_dat);
			}
		}
		stat_dat = 0;
	}
}
void led_control()
{
	if(UI == 0)
	{
		stat_led = 0xfe;
		SelectHC573(4,stat_led);
	}
	if(UI == 1)
	{
		stat_led = 0xfd;
		SelectHC573(4,stat_led);
	}
	if((int)dB_value > dB_param)
	{
		stat_warn = 1;
	}
	else
	{
		stat_warn = 0;
		stat_led |= 0x80;
		SelectHC573(4,stat_led);
	}
}
void main()
{
	Init_Uart();
	Timer5Init();
	DisplaySMG_ALL(0xff);
	SelectHC573(4,0xff);
	SelectHC573(5,0x00);
	while(1)
	{
		led_control();
		send_mydat();
		Scan_key();
		DisplaySMG_Info();
		read_myvolt();
	}
}

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

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

相关文章

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型 文章目录 SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型3. 发布/订阅模型之fanout模型1. 说明1. 消息发布者1. 创建工作队列的配置类2. 发布消费Controller 2. 消息消费者One3. 消息消费者Two4. 消息消费者…

windows上使用influx2.7学习

参考 官方文档&#xff1a;https://docs.influxdata.com/influxdb/v2/ 下载 需要下载两样东西&#xff1a;influxd.exe和influx.exe influxd:influx数据库的服务端。下载地址&#xff1a;https://dl.influxdata.com/influxdb/releases/influxdb2-2.7.5-windows.zipinflux:连…

C# 实现子进程跟随主进程关闭

文章目录 前言一、如何实现&#xff1f;1、创建作业对象&#xff08;1&#xff09;、创建对象&#xff08;2&#xff09;、设置销毁作业时&#xff0c;关闭拥有的进程 2、子进程加入作业对象3、销毁作业对象&#xff08;1&#xff09;、手动销毁&#xff08;2&#xff09;、所在…

算法设计与分析实验报告c++实现(连续邮资问题、卫兵布置问题、圆排列问题、求解填字游戏问题、分支限界法求解旅行售货员(TSP)问题)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1.连续邮资…

最好用的安卓按钮(3)

属性解释 按钮文字 app:text“床前明月光” 按钮文字颜色 app:textColor“color/color_white” 按钮文字大小 app:textSize“22sp” 按钮背景颜色 app:color_normal“color/color_accent” 0x2 单独设置每个圆角 效果 代码 <top.androidman.SuperButton android:layo…

软考 系统架构设计师系列知识点之数据库基本概念(4)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之数据库基本概念&#xff08;3&#xff09; 所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 6.1.3 数据库管理系统 DBMS&#xff08;DataBase Management System&#xff0c;数据库管理系统&am…

【Linux】SSH协议应用

SSH协议 SSH简介实现OpenSSH ssh中的四个文件~/.ssh文件路径实验解析 SSH 简介 SSH&#xff08;secure shell&#xff09;只是一种协议&#xff0c;存在多种实现&#xff0c;既有商业实现&#xff0c;也有开源实现。本文针对的实现是OpenSSH&#xff0c;它是自由软件&#xf…

ZYNQ实验--CIC插值滤波器实验

一、CIC滤波器介绍 CIC (Cascaded Integrator-Comb) 滤波器是一种常用的数字信号处理滤波器&#xff0c;主要用于降采样&#xff08;decimation&#xff09;和升采样&#xff08;interpolation&#xff09;操作。它具有简单的硬件实现、高效的运算速度以及适用于需要快速处理的…

应届生选导师的创业公司,还是去中厂?

点击上方&#xff0c;选择“置顶/星标公众号” 福利干货&#xff0c;第一时间送达 导师是做自动化设备的控制软件&#xff0c;公司做纯软件。导师能给一样的工资&#xff0c;五人左右团队&#xff0c;潜在收入可能要高一些。纠结哪个对今后的发展更好一些。 大家好&#xff0…

【论文阅读笔记】Mamba模型代码理解

0.开源代码地址 官方实现&#xff1a;state-spaces/mamba (github.com) 最简化实现&#xff1a;johnma2006/mamba-minimal: Simple, minimal implementation of the Mamba SSM in one file of PyTorch. (github.com) 直接实现&#xff1a;alxndrTL/mamba.py: A simple and e…

Java 接口提示500,但console并不报错。

因为习惯了C语言printf打印&#xff0c;且当时并不明白try catch意义所在 如图所示&#xff0c;下添加了行号打印 但只打印出了line 89&#xff0c;无line 91&#xff0c;也无报错 所以使用try catch 包裹Sql查询封装函数 e.printStackTrace(); 果真打印出了 查看Entity类&…

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…

DFS:floodfill算法解决矩阵联通块问题

floodfill&#xff0c;翻译为洪水灌溉&#xff0c;而floodfill算法本质上是为了解决在矩阵中性质相同的联通块问题。 一、图像渲染 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int prev;//记住初始值int m,…

什么是广播系统语言传输指数 STIPA

基础知识 通过广播系统播放一个确定的信号&#xff08;STIPA 测试信号&#xff09;&#xff0c;再在待测点测量其到达后的质量即可。IEC 60268-16 标准中定义通过单一值表示清晰度结果&#xff0c;0 表示完全无法理解&#xff0c;1 表示完美理解。测量单位是 STI&#xff08;语…

C#探索之路基础夯实篇(3):面向对象的三大特性和五大原则详解

文章目录 前提&#xff1a;一、特性&#xff1a;二、原则&#xff1a;三、示例1. 单一职责原则 (Single Responsibility Principle, SRP)&#xff1a;2. 开放-封闭原则 (Open-Closed Principle, OCP)&#xff1a;3. 里氏替换原则 (Liskov Substitution Principle, LSP)&#xf…

移动硬盘能当u盘重装系统吗?做启动数据还能恢复吗

在数字时代&#xff0c;随着技术的不断发展&#xff0c;我们越来越依赖于各种存储设备&#xff0c;其中移动硬盘以其大容量和便携性受到广大用户的青睐。不过&#xff0c;有时我们可能会遇到需要使用U盘来重装系统的情况&#xff0c;而手头又没有合适的U盘。这时&#xff0c;我…

Spring Boot-01-通过一个项目快速入门

官方参考文档&#xff1a;Spring Boot Reference Documentation 0. 概述 Spring的缺点&#xff1a; 1. 配置繁琐&#xff1a;虽然Spring的组件代码是轻量级&#xff0c;但它的配置却是重量级的。 2. 依赖繁琐&#xff1a;项目的依赖管理也是一件耗时耗力的事情。分析要导入哪…

03-JAVA设计模式-工厂模式详解

工厂模式 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种封装对象创建过程的机制&#xff0c;将对象的创建与使用分离。 这种设计模式允许我们在不修改客户端代码的情况下引入新的对象类型。 在Java中&#xff0c;工厂设计模式主要有三种形式&#xff1a;简单工厂…

【CNN】ConvMixer探究ViT的Patch Embedding: Patches Are All You Need?

Patches Are All You Need? 探究Patch Embedding在ViT上的作用&#xff0c;CNN是否可用该操作提升性能&#xff1f; 论文链接&#xff1a;https://openreview.net/pdf?idTVHS5Y4dNvM 代码链接&#xff1a;https://github.com/tmp-iclr/convmixer 1、摘要 ViT的性能是由于T…

基于Spark中随机森林模型的天气预测系统

基于Spark中随机森林模型的天气预测系统 在这篇文章中&#xff0c;我们将探讨如何使用Apache Spark和随机森林算法来构建一个天气预测系统。该系统将利用历史天气数据&#xff0c;通过机器学习模型预测未来的天气情况&#xff0c;特别是针对是否下雨的二元分类问题。 简介 Ap…