单元训练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电源控制来实现低功耗模式,即只有在触发时才执行程序,其余时间可以关闭一些没必要的设备…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
