单元训练10:定时器实现秒表功能-数组方式
蓝桥杯 小蜜蜂 单元训练10:定时器实现秒表功能-数组方式

/** @Description:* @Author: fdzhang* @Email: zfdc@qq.com* @Date: 2024-08-15 21:58:53* @LastEditTime: 2024-08-16 19:07:27* @LastEditors: fdzhang*/#include "stc15f2k60s2.h"#define LED(x) \{ \P2 = P2 & 0x1f | 0x80; \P0 = x; \P2 &= 0x1f; \}
// y7c 111,0xE0
#define SEG(x) \{ \P0 = x; \P2 = P2 & 0x1f | 0xE0; \P2 &= 0x1f; \}
// y6c 110,0xC0
#define COM(x) \{ \P0 = x; \P2 = P2 & 0x1f | 0xC0; \P2 &= 0x1f; \}typedef unsigned char uint8_t;uint8_t *setStopWatch(uint8_t min10, uint8_t min1, uint8_t sec10, uint8_t sec1, uint8_t ms10, uint8_t ms1)
{uint8_t *stopWatchTimer[6];*stopWatchTimer[0] = min10;*stopWatchTimer[1] = min1;*stopWatchTimer[2] = sec10;*stopWatchTimer[3] = sec1;*stopWatchTimer[4] = ms10;*stopWatchTimer[5] = ms1;return stopWatchTimer;
}uint8_t com1 = 0x01; // 定义数码管的8个口
uint8_t com2 = 0x02;
uint8_t com3 = 0x04;
uint8_t com4 = 0x08;
uint8_t com5 = 0x10;
uint8_t com6 = 0x20;
uint8_t com7 = 0x40;
uint8_t com8 = 0x80;sbit s4 = P3 ^ 3; // 定义按键
sbit s5 = P3 ^ 2;code unsigned char Seg_Table[] ={0xc0, // 00xf9, // 10xa4, // 20xb0, // 30x99, // 40x92, // 50x82, // 60xf8, // 70x80, // 80x90, // 90xBF // 符号"-"
};uint8_t timerCounter = 0;
uint8_t counter50ms = 0;
uint8_t counter1s = 0;
uint8_t counter1min = 0;
uint8_t counter1h = 0;void Timer0_Init(void) // 5毫秒@12MHz
{AUXR |= 0x80; // 定时器时钟1T模式TMOD &= 0xF0; // 设置定时器模式TL0 = 0xA0; // 设置定时初始值TH0 = 0x15; // 设置定时初始值TF0 = 0; // 清除TF0标志// TR0 = 1; // 定时器0开始计时 //因为题目要求可以暂停,所以一开始不要打开ET0 = 1; // 使能定时器0中断EA = 1;
}
// 使用STC - ISP中的延时计算器生成,
// 不想再使用定时器1生成时间间隔了,有些麻烦。
// 注意,延时500us会有重影
void Delay1ms() //@12.000MHz 使用STC-ISP中的延时计算器生成
{unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);
}void oneSegShow(uint8_t comX, uint8_t showNum) // 单数码管显示
{COM(comX);SEG(Seg_Table[showNum]);
}
void min10Seg1(uint8_t min10) // 1管显示分10位
{oneSegShow(com1, min10);
}
void min1Seg2(uint8_t min1) // 2管显示分个位
{oneSegShow(com2, min1);
}
void dashSeg3() // 3管显示符号-
{oneSegShow(com3, 10);
}
void sec10Seg4(uint8_t sec10) // 4管显示秒10位
{oneSegShow(com4, sec10);
}
void sec1Seg5(uint8_t sec1) // 5管显示秒个位
{oneSegShow(com5, sec1);
}
void dashSeg6() // 6管显示符号-
{oneSegShow(com6, 10);
}
void ms10Seg7(uint8_t ms10) // 7管显示毫秒10位
{oneSegShow(com7, ms10);
}
void ms1Seg8(uint8_t ms1) // 8管显示毫秒个位
{oneSegShow(com8, ms1);
}uint8_t arrayStatus; // 状态机显示方式
void segsAllShowFSM(uint8_t *stopWatchTimer) // Finite state machine
{switch (arrayStatus){case 0:min10Seg1(stopWatchTimer[0]);Delay1ms();arrayStatus = 1;break;case 1:min1Seg2(stopWatchTimer[1]);Delay1ms();arrayStatus = 2;break;case 2:dashSeg3();Delay1ms();arrayStatus = 3;break;case 3:sec10Seg4(stopWatchTimer[3]);Delay1ms();arrayStatus = 4;break;case 4:sec1Seg5(stopWatchTimer[4]);Delay1ms();arrayStatus = 5;break;case 5:dashSeg6();Delay1ms();arrayStatus = 6;break;case 6:ms10Seg7(stopWatchTimer[5]);Delay1ms();arrayStatus = 7;break;case 7:ms1Seg8(stopWatchTimer[6]);Delay1ms();arrayStatus = 0;break;default:arrayStatus = 0;break;}
}uint8_t s4Status;
uint8_t falling;
uint8_t counterOnOff = 0;uint8_t keyStatus;
uint8_t keyValue;void readKey()
{switch (keyStatus){case 0:if ((s4 == 0) | (s5 == 0)){keyStatus = 1;falling = 1;keyStatus = 1;}break;case 1:if (s5 == 0){keyValue = 5;}else if (s4 == 0){keyValue = 4;}if (falling){counterOnOff = ~counterOnOff;}if ((s4 == 0) | (s5 == 0)) // 如果长按锁定在当前状态{falling = 0;keyStatus = 1;}elsekeyStatus = 2;break;case 2:if ((s4 == 1) && (s5 == 1))keyStatus = 0;default:keyStatus = 0;break;}
}
void keyScan()
{uint8_t *arrayTimer;uint8_t ms10;uint8_t ms1;uint8_t sec10;uint8_t sec1;uint8_t min10;uint8_t min1;readKey();if (keyValue == 5){timerCounter = 0; // 清零counter50ms = 0;counter1s = 0;counter1min = 0;counter1h = 0;ms10 = counter50ms / 10;ms1 = counter50ms % 10;sec10 = counter1s / 10;sec1 = counter1s % 10;min10 = counter1min / 10;min1 = counter1min % 10;arrayTimer = setStopWatch(min10, min1, sec10, sec1, ms10, ms1);segsAllShowFSM(arrayTimer);}else if (keyValue == 4){ms10 = counter50ms / 10;ms1 = counter50ms % 10;sec10 = counter1s / 10;sec1 = counter1s % 10;min10 = counter1min / 10;min1 = counter1min % 10;arrayTimer = setStopWatch(min10, min1, sec10, sec1, ms10, ms1);segsAllShowFSM(arrayTimer);if (counterOnOff){TR0 = 1; // open timer启动恢复}else{TR0 = 0; // pause timer//暂停}}
}
void main()
{LED(0xff); // 关闭LEDCOM(0xFF); // 关闭数码管// SEG(Seg_Table[0]);Timer0_Init();while (1){keyScan();}
}void Timer0_Isr(void) interrupt 1
{if (++timerCounter == 10) // 5毫秒为基本单位,50ms为一个计时单元{timerCounter = 0;if (++counter50ms == 20) // 1s{counter50ms = 0; // 数码管显示的毫秒的数值if (++counter1s == 60) // 1min{counter1s = 0; // 数码管显示的秒的数值if (++counter1min == 60) // 1h{counter1min = 0; // 数码管显示的分的数值}}}}
}
相关文章:
单元训练10:定时器实现秒表功能-数组方式
蓝桥杯 小蜜蜂 单元训练10:定时器实现秒表功能-数组方式 /** Description:* Author: fdzhang* Email: zfdcqq.com* Date: 2024-08-15 21:58:53* LastEditTime: 2024-08-16 19:07:27* LastEditors: fdzhang*/#include "stc15f2k60s2.h"#define LED(x) …...
国外项目管理软件最佳实践:选型与应用
国内外主流的10款国外项目管理软件对比:PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、ProofHub、Zoho Projects、Hive。 在寻找适合的国外项目管理软件时,你是否感到不知从何选择?市场上琳琅满目的选项往往令人眼花缭乱&…...
Angular组件概念
Angular 是一个由 Google 维护的开源前端框架,用于构建单页面应用(SPA)和移动Web应用。Angular 应用由多个组件(Components)组成,这些组件是 Angular 应用构建块的基本单位。 1. Angular 组件的基本概念 …...
嵌入式人工智能ESP32(4-PWM呼吸灯)
1、PWM基本原理 PWM(Pulse-width modulation)是脉冲宽度调制的缩写。脉冲宽度调制是一种模拟信号电平数字编码方法。脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,…...
继承 (上)【C++】
文章目录 继承的定义继承的语法继承权限和继承到子类后父类成员的访问限定符的变化继承到子类后父类成员的访问限定符的变化 子类继承到了父类的什么?继承中的作用域子类和父类之间的赋值转换子类对象可以直接赋值给父类对象,但是父类对象不能直接赋值给…...
WPF打印控件内容
当我们想打印控件内容时,如一个Grid中的内容,可以用WPF中PrintDialog类的PrintVisual()方法来实现 界面如下: XAML代码如下 <Grid><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition Width"300"…...
[C++][opencv]基于opencv实现photoshop算法图像剪切
【测试环境】 vs2019 opencv4.8.0 【效果演示】 【核心实现代码】 //图像剪切 //参数:src为源图像, dst为结果图像, rect为剪切区域 //返回值:返回0表示成功,否则返回错误代码 int imageCrop(InputArray src, OutputArray dst,…...
四十、大数据技术之Kafka3.x(3)
🌻🌻 目录 一、Kafka Broker1.1 Kafka Broker工作流程1.1.1 Zookeeper 存储的Kafka信息1.1.2 Kafka Broker 总体工作流程1.1.3 Broker 重要参数 1.2 生产经验——节点服役和退役1.2.1 服役新节点1.2.2 退役旧节点 1.3 Kafka 副本1.3.1 副本基本信息1.3.2…...
redis——基本命令
什么是Reids(REmote Dictionary Server) Redis是现在主流的数据库之一,是一个使用ANSI C编写的开源、包含多种数据结构、支持网络的、基于内存、可选持久性的键值对存储数据。 特性 1.速度快 :Redis的数据全部存储瑜内存中。 …...
pytorch实现单层线性回归模型
文章目录 简述代码重构要点 数学模型、运行结果数据构建与分批模型封装运行测试 简述 python使用 数值微分法 求梯度,实现单层线性回归-CSDN博客 python使用 计算图(forward与backward) 求梯度,实现单层线性回归-CSDN博客 数值微分…...
智能小家电能否利用亚马逊VC搭上跨境快车?——WAYLI威利跨境助力商家
智能小家电行业在全球化背景下,正迎来前所未有的发展机遇。亚马逊为品牌商和制造商提供的一站式服务平台,为智能小家电企业提供了搭乘跨境快车、拓展国际市场的绝佳机会。 首先,亚马逊VC平台能够帮助智能小家电企业简化与亚马逊的合作流程&am…...
顺丰科技25届秋季校园招聘常见问题答疑及校招网申测评笔试题型分析SHL题库Verify测评
Q:顺丰科技2025届校园招聘面向对象是? A:2025届应届毕业生,毕业时间段为2024年10月1日至2025年9月30日(不满足以上毕业时间的同学可以关注顺丰科技社会招聘或实习生招聘)。 Q:我可以投递几个岗…...
深入理解 Kibana 配置文件:一份详尽的指南
Kibana 是一个强大的数据可视化平台,它允许用户通过 Elasticsearch 轻松地探索和分析数据。Kibana 的配置文件 kibana.yml 是定制和优化 Kibana 行为的关键。在这篇博客中,我们将深入探讨 kibana.yml 文件中的各个配置项,并提供示例说明。 服…...
算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)
😀前言 在编程过程中,链表是一种常见的数据结构,它能够高效地进行插入和删除操作。然而,遍历链表并找到特定节点是一个典型的挑战,尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…...
聊聊场景及场景测试
在我们进行测试过程中,有一种黑盒测试叫场景测试,我们完全是从用户的角度去理解系统,从而可以挖掘用户的隐含需求。 场景是指用户会使用这个系统来完成预定目标的所有情况的集合。 场景本身也代表了用户的需求,所以我们可以认为…...
Spring Web MVC入门(中)
1. 请求 访问不同的路径, 就是发送不同的请求. 在发送请求时, 可能会带⼀些参数, 所以学习Spring的请求, 主要 是学习如何传递参数到后端以及后端如何接收. 传递参数, 咱们主要是使⽤浏览器和Postman来模拟; 1.1 传递单个参数 接收单个参数,在Spring MV…...
Django后端架构开发:后台管理与会话技术详解
🌟 Django后端架构开发:后台管理与会话技术详解 🔹 后台管理:自定义模型类 Django的后台管理系统提供了强大的模型管理功能,你可以通过自定义模型类来控制模型在后台管理界面的显示和操作。自定义模型类通过继承admin…...
挑战Infiniband, 爆改Ethernet(2)
挑战Infiniband, 爆改Ethernet之物理层 前面说过UE为了挑战Infiniband在AI集群和HPC领域的优势地位,计划爆改以太网技术,以适应AI和HPC集群对高性能、可扩展网络的需求。正如UE联盟关于愿景的说明中宣称的:”提供一个完整的架构,通…...
Postman文件上传接口测试
接口介绍 返回示例 测试步骤 1.添加一个新请求,修改请求名,填写URL,选择请求方式 2.将剩下的media参数放在请求body里,选择form-data,选择key右边的类型为file类型,就会出现选择文件的按钮Select Files&a…...
stm32入门学习14-电源控制
有时候我们的程序中有些触发执行条件,有时这些触发频率很少,我们的程序就一直在循环,这样就很浪费电,我们可以通过PWR电源控制来实现低功耗模式,即只有在触发时才执行程序,其余时间可以关闭一些没必要的设备…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
