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

一、基本要求


使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的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();
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数组-二维数组

本笔记为47 数组-二维数组定义方式_哔哩哔哩_bilibili的学习笔记 二维数组 定义方式 注&#xff1a; 常用第二种方式定义&#xff0c;原因&#xff1a;第二种方式更清晰列数可以省行数不可省 &#xff0c;详见上述第四种定义方式 示例&#xff1a; 二维数组 数组名 作用&am…

CSS层叠样式表学习(引入方式)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS引入方式的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 五、CSS的三种样式表 5.1 CSS的三种样式表 按照CSS样式书写的位置(或者引入方式)&#xff0c;CSS样式表可…

笔记-Building Apps with the ABAP RESTful Application Programming Model-Week3

Week3 Unit 1: The Enhanced Business Scenario 本节介绍了将要练习的demo的业务场景,在前两周成果的基础上,也就是只读列表,也可以说是报表APP基础上启用了事务能力,也就是CURD以及自定义业务功能的能力,从创建基本的behavior definition,然后behavior definition proj…

基于GD32的简易数字示波器(2)- 原理图设计

这期记录的是项目实战&#xff0c;做一个简易的数字示波器。 教程来源于嘉立创&#xff0c;202&#xff1a;简易数字示波器项目文档 语雀 下图为示波器的指标 具有选择交流耦合还是直流耦合功能、输入信号不衰减或衰减50倍 输入频率理论最大800KHz输入幅值&#xff08;不衰…

2024HW-->Wireshark攻击流量分析

在HW中&#xff0c;最离不开的&#xff0c;肯定是看监控了&#xff0c;那么就要去了解一些wireshark的基础用法以及攻击的流量&#xff01;&#xff01;&#xff01;&#xff01; 1.Wireshark的基本用法 比如人家面试官给你一段流量包&#xff0c;你要会用 1.分组详情 对于我…

9_springboot_shiro_jwt_多端认证鉴权_整合jwt

1. Shiro框架回顾 到目前为之&#xff0c;Shiro框架本身的知识点已经介绍完了。web环境下&#xff0c;整个框架从使用的角度我们需要关注的几个点&#xff1a; 要使用Shiro框架&#xff0c;就要创建核心部件securityManager 对象。 SpringBoot项目中&#xff0c;引入shiro-spr…

蓝凌OA单点登录实现方案:以统一身份管理提升效率与安全新举措

蓝凌OA的优势与挑战 在数字化浪潮的推动下&#xff0c;企业对于高效、安全的身份管理需求愈发迫切。蓝凌OA系统&#xff0c;以其出色的流程管理和协同办公能力&#xff0c;已经成为众多企业实现数字化转型的重要工具。然而&#xff0c;随着企业信息化建设的不断深入&#xff0…

什么时候外部依赖接口慢拖死应用?

A应用调用B应用&#xff0c;当B应用的接口响应耗时平均都在3000ms的时&#xff0c;如果当前A调用B的请求数达300/s 那么在3s内A应用在途的请求数 300 * 3 900 &#xff0c;按照servlet原理一个http的请求需要一个线程提供服务&#xff0c;即需要900个线程提供服务&#xff0c…

CSS面试题常用知识总结day03

大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识 前端行业下坡路&#xff0c;甚至可说前端已死&#xff0c;我还想在前段行业在干下去&#xff0c;所以从新开始储备自己的知识。 从CSS——>Javascript——>VUE2——>Vuex、VueRouter、webpack——>…

聚能共创下一代智能终端操作系统 软通动力荣膺“OpenHarmony优秀贡献单位”

近日&#xff0c;由开放原子开源基金会指导&#xff0c;以“开源共享未来”为主题的OpenHarmony社区年会在北京成功举办。本次活动汇集OpenHarmony项目群共建单位及生态伙伴等多方力量&#xff0c;旨在对2023年度OpenHarmony年度开源事业全面总结的同时&#xff0c;吸引更多伙伴…

【Java EE】SpringBoot的创建与简单使用

文章目录 &#x1f340;环境准备&#x1f333;Maven&#x1f332;SpringBoot是什么&#x1f384;Spring Boot 项目创建&#x1f338;使用Idea创建&#x1f338;创建SpringBoot项⽬&#x1f338;SpringBoot项目的运行 ⭕总结 &#x1f340;环境准备 如果你的IDEA是专业版&#…

STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度

0 前言 如果我们只是使用MCU控制LED的亮灭&#xff0c;完全可以不关心GPIO的速度配置。但如果我们使用到了SPI、MII、RMII、FSMC等这些高速总线就必须要清楚每种GPIO速度配置对应的最高速度&#xff0c;避免因为GPIO速度配置过低导致总线速度提不上去。 既然如此&#xff0c;那…

Linux网络基础 (三) —— Socket

文章目录 Socket 编程基本概念Socket背景Socket 为了解决什么问题 socketsockaddr结构sockaddrsockaddr_insockaddr 和 sockaddr_in 的关系sockaddr_un 示例代码 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alaskan Malamute &#x1f4dc; 博主的代码仓库主页 [ Gitee ]&…

OpenHarmony实战:Combo解决方案之ASR芯片移植案例

本方案基于 OpenHarmony LiteOS-M 内核&#xff0c;使用 ASR582X 芯片的 DEV.WIFI.A 开发板进行开发移植。作为典型的 IOT Combo&#xff08;Wi-FiBLE&#xff09;解决方案&#xff0c;本文章介绍 ASR582X 的适配过程。 编译移植 目录规划 本方案的目录结构使用 Board 和 So…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

如何利用Flutter将应用成功上架至iOS平台:详细指南

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

如何卸载干净 IDEA(图文讲解)

更新时间 2022-12-20 11:一则或许对你有用的小广告 星球 内第一个项目&#xff1a;全栈前后端分离博客项目&#xff0c;演示地址&#xff1a;Weblog 前后端分离博客, 1.0 版本已经更新完毕&#xff0c;正在更新 2.0 版本。采用技术栈 Spring Boot Mybatis Plus Vue 3.x Vit…

【Consul】基于Golang实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制

【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制 大家好 我是寸铁&#x1f44a; 总结了一篇【Consul】基于Go实现Consul服务的注册、注销、修改、监控注册的服务变化、实时同步服务信息机制✨ 这应该是目前全网最全的使用golang手…

idea开发 java web 配电室后台管理系统bootstrap框架web结构java编程计算机网页

一、源码特点 java 配电室后台管理系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开发。 前段主要技术 cs…

Linux:权限篇

文章目录 前言1.用户2.文件的权限管理2.1 修改文件的权限2.2 修改文件的拥有者2.3 修改文件的所属组 3.file指令4.umask指令4.目录的权限管理总结 前言 Linux权限在两个地方有所体现&#xff0c;一种是使用用户&#xff1a;分为root超级用户员与普通用户。另一个是体现在文件的…