第十五届单片机模拟考试III

news2025/4/8 13:47:31

题目

题目不长 ,功能也不难,一道水题

按键功能

S4界面切换,S5 功能切换,在不同界面转换不同的功能,定义两个标志位记录即可。

S9复位,回到初始状态,记得界面也得回到初始的信号界面(这里算是一个坑点)

/*按键函数区域*/
void Key_Proc(){
	if(Key_Slow) return;
	Key_Slow = 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:
			Seg_Mode ^= 1;
		break;
		case 5:
			if(Seg_Mode == 0){//在信号界面,频率转换周期
				freq_zq = 1;
				time_start = 1;
			}
			else{//温度界面,小数转换成整数
				float_zs = 1;
			}
		break;
		case 9://复位
			float_zs = 0;
			freq_zq = 0;
			Seg_Mode = 0;
		break;
	}
}

显示功能 

基础的频率显示和温度显示,记得我们的按键S5界面内的模式切换,定义的标志位来对应不同的小界面,记得高位熄灭。

/*数码管函数区域*/
void Seg_Proc(){
	if(Seg_Slow) return;
	Seg_Slow = 1;
	
	temp = rd_tempature();
	if(temp>30) L7_Flag = 1;
	else L7_Flag = 0;
	
	if(Seg_Mode == 0){//频率界面
		Seg_Buf[0] = 11;//P
		Seg_Buf[1] = 10;
		Seg_Buf[2] = 10;
		Point[6] = 0;
		if(freq_zq ==0){//频率
			Seg_Buf[3] = freq>9999?freq/10000:10;
			Seg_Buf[4] = freq>999?freq%10000/1000:10;
			Seg_Buf[5] = freq>99?freq%1000/100:10;
			Seg_Buf[6] = freq>9?freq%100/10:10;
			Seg_Buf[7] = freq%10;
		}
		else{
			Seg_Buf[3] = zq>9999?zq/10000:10;
			Seg_Buf[4] = zq>999?zq%10000/1000:10;
			Seg_Buf[5] = zq>99?zq%1000/100:10;
			Seg_Buf[6] = zq>9?zq%100/10:10;
			Seg_Buf[7] = zq%10;
		}
	}
	else{//温度界面
		Seg_Buf[0] = 12;//C
		Seg_Buf[1] = 10;
		Seg_Buf[2] = 10;
		Seg_Buf[3] = 10;
		Seg_Buf[4] = 10;
		if(float_zs == 0){//小数
			Point[6] = 1;
			Seg_Buf[5] = (unsigned char)temp>10?(unsigned char)temp/10:10;
			Seg_Buf[6] = (unsigned char)temp%10;
			Seg_Buf[7] = (unsigned int)(temp*10)%10;
		}
		else{
			Point[6] = 0;
			Seg_Buf[5] = 10;
			Seg_Buf[6] = (unsigned char)temp>10?(unsigned char)temp/10:10;
			Seg_Buf[7] = (unsigned char)temp%10;
		}
		
	}
	
}

Led指示灯功能

L1,L2是常规的界面指示灯,L3是功能指示灯,L8状态指示灯,都很常规,L3,L8检测标志位即可.

/*Led函数区域*/
void Led_Proc(){
	Led_Buf[0] = (Seg_Mode==0);
	Led_Buf[1] = (Seg_Mode==1);
	Led_Buf[2] = time_start;//点亮1s后熄灭
	Led_Buf[7] = L7_flash;
}

完整主函数 

/*头文件区域*/
#include <STC15F2K60S2.H>
#include <Led.h>
#include <Seg.h>
#include <Init.h>
#include <Key.h>
#include <onewire.h>

/*参数变量区域*/
unsigned char Seg_Pos;
unsigned char Key_Down,Key_Val,Key_Old,Key_Up;
unsigned char Seg_Slow,Key_Slow;
unsigned int Time_1s;
//数组
unsigned char Seg_Buf[] = {10,10,10,10,10,10,10,10};
unsigned char Led_Buf[] = {0,0,0,0,0,0,0,0};
unsigned char Point[] = {0,0,0,0,0,0,0,0};
//数据
unsigned char Seg_Mode;//0信号1温度
unsigned int freq;
unsigned int zq;
float temp;
bit freq_zq;//默认0频率。1周期
bit float_zs;//默认0小数,1整数
bit time_start;
bit L7_Flag;
bit L7_flash;
unsigned int Time_L3_1s;
unsigned char Time_100ms;
/*按键函数区域*/
void Key_Proc(){
	if(Key_Slow) return;
	Key_Slow = 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:
			Seg_Mode ^= 1;
		break;
		case 5:
			if(Seg_Mode == 0){//在信号界面,频率转换周期
				freq_zq = 1;
				time_start = 1;
			}
			else{//温度界面,小数转换成整数
				float_zs = 1;
			}
		break;
		case 9://复位
			float_zs = 0;
			freq_zq = 0;
			Seg_Mode = 0;
		break;
	}
}
/*数码管函数区域*/
void Seg_Proc(){
	if(Seg_Slow) return;
	Seg_Slow = 1;
	
	temp = rd_tempature();
	if(temp>30) L7_Flag = 1;
	else L7_Flag = 0;
	
	if(Seg_Mode == 0){//频率界面
		Seg_Buf[0] = 11;//P
		Seg_Buf[1] = 10;
		Seg_Buf[2] = 10;
		Point[6] = 0;
		if(freq_zq ==0){//频率
			Seg_Buf[3] = freq>9999?freq/10000:10;
			Seg_Buf[4] = freq>999?freq%10000/1000:10;
			Seg_Buf[5] = freq>99?freq%1000/100:10;
			Seg_Buf[6] = freq>9?freq%100/10:10;
			Seg_Buf[7] = freq%10;
		}
		else{
			Seg_Buf[3] = zq>9999?zq/10000:10;
			Seg_Buf[4] = zq>999?zq%10000/1000:10;
			Seg_Buf[5] = zq>99?zq%1000/100:10;
			Seg_Buf[6] = zq>9?zq%100/10:10;
			Seg_Buf[7] = zq%10;
		}
	}
	else{//温度界面
		Seg_Buf[0] = 12;//C
		Seg_Buf[1] = 10;
		Seg_Buf[2] = 10;
		Seg_Buf[3] = 10;
		Seg_Buf[4] = 10;
		if(float_zs == 0){//小数
			Point[6] = 1;
			Seg_Buf[5] = (unsigned char)temp>10?(unsigned char)temp/10:10;
			Seg_Buf[6] = (unsigned char)temp%10;
			Seg_Buf[7] = (unsigned int)(temp*10)%10;
		}
		else{
			Point[6] = 0;
			Seg_Buf[5] = 10;
			Seg_Buf[6] = (unsigned char)temp>10?(unsigned char)temp/10:10;
			Seg_Buf[7] = (unsigned char)temp%10;
		}
		
	}
	
}

/*Led函数区域*/
void Led_Proc(){
	Led_Buf[0] = (Seg_Mode==0);
	Led_Buf[1] = (Seg_Mode==1);
	Led_Buf[2] = time_start;//点亮1s后熄灭
	Led_Buf[7] = L7_flash;
}

/*定时器0初始化函数*/
void Timer0_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x05;
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0x00;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
}

/*定时器1初始化函数*/
void Timer1_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;			//定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0x18;				//设置定时初始值
	TH1 = 0xFC;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;
	EA = 1;
}

/*定时器1中断服务函数*/
void Time1_Service() interrupt 3
{
	if(++Seg_Slow == 200) Seg_Slow = 0;
	if(++Key_Slow == 50) Key_Slow = 0;
	
	if(++Seg_Pos == 8) Seg_Pos = 0;
	Led_Disp(Seg_Pos,Led_Buf[Seg_Pos]);
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Point[Seg_Pos]);
	
	if(++Time_1s == 1000){
		Time_1s = 0;
		TR0 = 0;
		freq = TH0<<8|TL0;
		zq = 1000000/freq;
		TH0 = TL0 = 0;
		TR0 = 1;
	}
	
	if(time_start){
		if(++Time_L3_1s == 1000){
			Time_L3_1s = 0;
			time_start = 0;//停止计时
		}
	}
	else Time_L3_1s = 0;
	
	if(L7_Flag){
		if(++Time_100ms == 100){
			Time_100ms = 0;
			L7_flash ^= 1;
		}
	}
	else{
		Time_100ms = 0;
		L7_flash = 0;
	}
}

void main(){
	Timer0_Init();
	Timer1_Init();
	Sys_Init();
	while(1){
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

一道水的不能再水的题目

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

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

相关文章

测试:正交法设计测试用例

目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量&#xff0c;让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3)&#xff0c;含意如下&#xff1a; “L”代表正…

[ctfshow web入门] web5

前置知识 引用博客&#xff1a;phps的利用 当服务器配置了 .phps 文件类型时&#xff0c;访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码&#xff0c;而不是执行它。.phps被作为辅助开发者的一种功能&#xff0c;开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …

Qt基本框架(2)

本篇主要介绍如何设置窗口&#xff0c;以及在窗口中添加按钮 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类&#xff0c;通过合理设计…

基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

用HTML.CSS.JavaScript实现一个贪吃蛇小游戏

目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏&#xff0c;曾经风靡一时。今天&#xff0c;我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目&#xff0c…

JVM——模型分析、回收机制

方法区&#xff1a;存储已被虚拟机加载的类元数据信息(元空间) 堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 虚拟机栈&#xff1a;虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…

7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”

引言&#xff1a;当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份&#xff0c;每次对话都要求重复验证&#xff0c;引发大量投诉。引入LangChain 记忆系统后&#xff0c;客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储&#xff0c;教你构建符合…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…

【文献阅读】Vision-Language Models for Vision Tasks: A Survey

发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络&#xff08;DNN&#xff09;训练中严重依赖标注数据&#xff0c;并且通常为每个单一视觉识别任务训练一个DNN&#xff0c;这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战&#xff0c;视觉语言模型&am…

spring-cloud-alibaba-nacos-config使用说明

一、核心功能与定位 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Alibaba 生态中的核心组件之一&#xff0c;专为微服务架构提供动态配置管理能力。它通过整合 Nacos 的配置中心功能&#xff0c;替代传统的 Spring Cloud Config&#xff0c;提供更高效的配置集中化管理…

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…

【嵌入式系统设计师】知识点:第2章 嵌入式系统硬件基础知识

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…

Vue2_Vue.js教程

目录 一、Vue.js安装 1、独立版本 2、CDN 方法 3、npm 方法 二、Vue Al编程助手 三、Vue.js目录结构 目录解析 四、Vue.js 起步 1.如何定义数据对象和方法并渲染进页面 五、Vue.js 模板语法 插值 文本_{{}} Html_v-html 指令 属性_v-bind (数据传输工具)指令 表…

【工业场景】用YOLOv12实现饮料类别识别

饮料类别识别任务的意义在于帮助人们更快速地识别和区分不同类型的饮料&#xff0c;从而提高消费者的购物体验和满意度。对于商家而言&#xff0c;饮料类别识别可以帮助他们更好地管理库存、优化货架布局和预测销售趋势&#xff0c;从而提高运营效率和利润。此外&#xff0c;饮…

从小米汽车事故反思 LabVIEW 开发

近期&#xff0c;小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考&#xff0c;也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域&#xff0c;尤其是涉及到智能驾驶辅助系统时&#xff0c;安全是…

Vue3+Vite+TypeScript+Element Plus开发-04.静态菜单设计

系列文档目录 Vue3ViteTypeScript安装 Element Plus安装与配置 主页设计与router配置 静态菜单设计 Pinia引入 文章目录 目录 系列文档目录 文章目录 前言 一、Aside设计 二、动态增加菜单 三.布局引用在Main中显示 参考文献&#xff1a; 前言 在本系列文档中&…

大数据技术发展与应用趋势分析

大数据技术发展与应用趋势分析 文章目录 大数据技术发展与应用趋势分析1. 大数据概述2 大数据技术架构2.1 数据采集层2.2 数据存储层2.3 数据处理层2.4 数据分析层 3 大数据发展趋势3.1 AI驱动的分析与自动化3.2 隐私保护分析技术3.3 混合云架构的普及3.4 数据网格架构3.5 量子…

与Linux操作系统相关的引导和服务

目录 一.Linux操作系统引导过程 1.1引导过程总览 1.2系统初始化进程 1.2.1init进程 1.2.2sysmted 1.3systemd单元类型 二.排除启动类故障 2.1MBR扇区故障 2.1.1故障原因 2.1.2故障现象 2.1.3解决办法 2.1.4模拟修复MBR扇区故障 1)添加新的硬盘 2&#xff09;进行…

STM32单片机入门学习——第16节: [6-4] PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.05 STM32开发板学习——第16节: [6-4] PWM驱动LED呼吸灯&PWM驱动舵机&PWM驱…

基础框架系列分享:一个通用的Excel报表生成管理框架

由于我们系统经常要生成大量的Excel报表&#xff08;Word&#xff0c;PDF报表也有&#xff0c;另行分享&#xff09;&#xff0c;最初始他们的方案是&#xff0c;设计一个表&#xff0c;和Excel完全对应&#xff0c;然后读表&#xff0c;把数据填进去&#xff0c;这显然是非常不…