基于CT107D单片机综合训练平台的秒表设计
1. 项目简介
在CT107D单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个具有清零、暂停、启动功能的秒表。秒表显示格式为:分-秒-0.05秒(即50ms),例如 08-26-18 表示8分26秒900毫秒。
-
独立按键S4:暂停/启动
-
独立按键S5:清零
-
按键均为按下有效。
本文将详细介绍代码实现,并提供完整的代码示例。
2. 硬件设计
2.1 硬件模块
-
单片机:STC89C52RC
-
数码管模块:用于显示时间,格式为
分-秒-0.05秒。 -
独立按键:
-
S4:暂停/启动
-
S5:清零
-
-
定时器T0:用于计时,每50ms触发一次中断。
2.2 硬件连接
-
数码管段选接P0口,位选接P2口。
-
独立按键S4接P3^3,S5接P3^2。
3. 软件设计
3.1 功能设计
-
定时器T0:每50ms触发一次中断,用于更新秒表时间。
-
数码管显示:显示当前时间,格式为
分-秒-0.05秒。 -
按键功能:
-
S4:按下后切换秒表的启动和暂停状态。
-
S5:按下后清零秒表时间。
-
3.2 代码实现
以下是完整的代码实现:
#include <REGX52.H>
// 数码管段码表
unsigned char code SMG[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e, 0xbf, 0x7f};
// 时间变量
unsigned char t_min = 0; // 分钟
unsigned char t_s = 0; // 秒
unsigned char t_ms = 0; // 0.05秒单位
// 按键定义
sbit S4 = P3^3; // 暂停/启动
sbit S5 = P3^2; // 清零
// 选择HC573锁存器
void SelectHC573(unsigned char channel)
{
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;
}
}
// 数码管显示函数
void Display_SMG(unsigned char value, unsigned char site)
{
SelectHC573(6); // 选择位选锁存器
P0 = 0x01 << site; // 选择数码管位
SelectHC573(7); // 选择段选锁存器
P0 = value; // 显示段码
}
// 显示时间函数
void Display_Timer()
{
Display_SMG(SMG[t_ms % 10], 7); // 显示0.05秒个位
Display_SMG(SMG[t_ms / 10], 6); // 显示0.05秒十位
Display_SMG(SMG[16], 5); // 显示分隔符“-”
Display_SMG(SMG[t_s % 10], 4); // 显示秒个位
Display_SMG(SMG[t_s / 10], 3); // 显示秒十位
Display_SMG(SMG[16], 2); // 显示分隔符“-”
Display_SMG(SMG[t_min % 10], 1); // 显示分钟个位
Display_SMG(SMG[t_min / 10], 0); // 显示分钟十位
}
// 定时器初始化函数
void InitTimer()
{
TMOD = 0x01; // 定时器T0模式1
TL0 = (65535 - 50000) % 256; // 50ms定时初值
TH0 = (65535 - 50000) / 256;
ET0 = 1; // 使能定时器T0中断
EA = 1; // 使能总中断
TR0 = 1; // 启动定时器T0
}
// 定时器T0中断服务函数
void ServiceTimer() interrupt 1
{
TL0 = (65535 - 50000) % 256; // 重装初值
TH0 = (65535 - 50000) / 256;
t_ms++; // 0.05秒单位加1
if (t_ms == 20) // 1秒到
{
t_s++; // 秒加1
t_ms = 0;
if (t_s == 60) // 1分钟到
{
t_min++; // 分钟加1
t_s = 0;
if (t_min == 100) t_min = 0; // 分钟溢出清零
}
}
Display_Timer(); // 刷新数码管显示
}
// 按键扫描函数
void Scanf_Key()
{
static bit key_state = 1; // 按键状态
if (S4 == 0 && key_state) // 检测S4按下
{
Delay(20); // 简单去抖
if (S4 == 0)
{
TR0 = ~TR0; // 切换启动/暂停
key_state = 0;
}
}
else if (S4 == 1)
{
key_state = 1; // 按键释放
}
if (S5 == 0) // 检测S5按下
{
Delay(20); // 简单去抖
if (S5 == 0)
{
t_min = 0; // 清零时间
t_s = 0;
t_ms = 0;
while (S5 == 0); // 等待按键释放
}
}
}
// 主函数
void main()
{
InitTimer(); // 初始化定时器
while (1)
{
Scanf_Key(); // 扫描按键
}
}
4. 代码解析
4.1 定时器T0
-
定时器T0设置为模式1,每50ms触发一次中断。
-
在中断服务函数
ServiceTimer()中,更新时间变量t_ms、t_s和t_min,并刷新数码管显示。
4.2 数码管显示
-
使用
Display_Timer()函数显示当前时间,格式为分-秒-0.05秒。 -
通过
SelectHC573()函数选择数码管位选和段选锁存器。
4.3 按键功能
-
S4:按下后切换秒表的启动和暂停状态。
-
S5:按下后清零秒表时间。
5. 总结
本文基于CT107D单片机综合训练平台,设计了一个具有启动、暂停和清零功能的秒表。通过定时器T0实现精确计时,数码管显示时间,独立按键控制秒表状态。代码结构清晰,功能完善,适合初学者学习和参考。
6. 参考资料
-
STC89C52RC数据手册
-
CT107D单片机综合训练平台用户手册
版权声明:本文为博主原创文章,转载请注明出处。
作者:[杜子不疼]
希望这篇博客对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。
相关文章:
基于CT107D单片机综合训练平台的秒表设计
1. 项目简介 在CT107D单片机综合训练平台上,利用定时器T0、数码管模块和2个独立按键(J5的2-3短接),设计一个具有清零、暂停、启动功能的秒表。秒表显示格式为:分-秒-0.05秒(即50ms),…...
opensuse [Linux] 系统挂在新的机械硬盘
opensuse [Linux] 系统挂在新的机械硬盘 需求描述 自用电脑型号如下: 电脑:Precision Tower 7810 (Dell Inc.) CPU : Intel Xeon CPU E5-2686 v4 2.30GHz GPU: NVIDIA GeForce GTX 1070 Linux版本:Linux version 6.…...
时间序列分析(四)——差分运算、延迟算子、AR(p)模型
此前篇章: 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 一、差分运算 差分运算的定义:差分运算是一种将非平稳时间序列转换…...
【CUDA】Triton
【CUDA】Triton 1. CUDA 与 Triton 的基本区别 CUDA 编程模型: 在传统的 CUDA 编程中,CUDA 是标量程序,带有阻塞线程(blocked threads)。 标量程序(Scalar Program):表示我们直接…...
Windows环境搭建ES集群
搭建步骤 下载安装包 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…...
langchain学习笔记之消息存储在内存中的实现方法
langchain学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储:完整代码 引言 本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。 背景 在与大模型交互过程中,经常出现消息管理方…...
怎么在智能合约中植入deepseek
怎么在智能合约中植入deepseek 这里写目录标题 怎么在智能合约中植入deepseek方法概述具体步骤1. 部署大语言模型到链下2. 创建预言机(Oracle)a. 部署预言机节点b. 创建自定义预言机接口(Custom Oracle)3. 设计智能合约a. 编写Solidity代码b. 部署智能合约4. 调用流程注意事…...
驱动开发系列37 - Linux Graphics 2D 绘制流程(二)- 画布创建和窗口关联
一:概述 前面介绍Pixmap表示一块画布,是绘制发生的地方,本节看看驱动程序如何为画布分配内存/显存,以及如何与窗口关联的。 二:为画布分配BO 在系统启动时(用户登录系统之后,会重启Xorg),在 Xorg 服务器初始化时,要为屏幕创建根窗口的 Pixmap,并绑定到 GPU framebu…...
B. Longest Divisors Interval
time limit per test 2 seconds memory limit per test 256 megabytes Given a positive integer nn, find the maximum size of an interval [l,r][l,r] of positive integers such that, for every ii in the interval (i.e., l≤i≤rl≤i≤r), nn is a multiple of ii. …...
前端与后端的对接事宜、注意事项
前端与后端的对接事宜、注意事项 一、对接核心流程(完整生命周期) #mermaid-svg-6yzij6OD8DKqiMLD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6yzij6OD8DKqiMLD .error-icon{fill:#552222;}#mermaid-svg-6yzi…...
【第13章:自监督学习与少样本学习—13.2 少样本学习(FSL)与元学习(Meta-Learning)的基础理论与应用案例】
凌晨三点的急诊室,值班医生李大夫正在使用AI辅助诊断系统——面对一张仅有3个标注病例的罕见皮肤病影像,系统竟然给出了95%置信度的准确诊断。这种"见微知著"的超能力,正是少样本学习技术创造的医学奇迹。 一、突破数据荒漠:少样本学习的生存法则 1.1 从人类学习…...
函数防抖和节流
所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次, 如果在 n 秒内又触发了事件,则会重新计算函数执行时间, 短时间高频率触发只有最后一次触发成功 开发使用场景: 搜索框防抖 fn代表要被防抖或者节流的函数&#x…...
linux--关于linux文件IO(2) open、read、lseek、stat
open 在linux中的读写文件有对应的命令。在终端中输入man 2 open可以打开open的手册页,注意man 2是linux自己的函数的一些手册,man 3是C库的手册 打开手册页之后找到open函数的用法如下: #以下是需要的库文件,man 2 open打开直接…...
利用xtquant高效获取财务数据:量化分析的重要补充
利用xtquant高效获取财务数据:量化分析的重要补充 在量化交易领域,虽然市场行情数据是核心,但财务数据作为企业基本面的重要反映,同样不可忽视。通过深入分析企业的财务报表,投资者可以更好地理解企业的经营状况和未来…...
Unity UI个人总结
个人总结,太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框,在1920x1080像素下在屏幕中长度占比1/19,在3840x2160,方框在屏幕中长度占比1/38。也就是像素长款不变,在屏幕中占比发生变化 2.…...
Javascript的数据类型
Javascript的数据类型 1.基本数据类型1.1七种基本数据类型1.2单独说说BigInt1.3其它注意点 2.引用数据类型3.基本数据类型和引用数据类型的区别4.双等于号和三等于号的区别5.Javascript的类型转换机制5.1显示转换(强制转换)5.2隐式转换(1)减、乘、除(2)加(加法要区别算,因为不…...
Day3 25/2/16 SUN
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p4&v…...
欧洲分组加密算法之Kasumi
目录 (1)FL函数 (2)FO函数 (3)FI函数 密钥扩展算法 欧洲分组加密算法之Kasumi Kasumi分组密码算法是由欧洲标准机构ETSI(European Telecommunications Standards Institute)下属的安全算法组于1999年设计的,被用于构造A5/3、GEA3、f8和f9算法,参与移动通信系统无线…...
vue使用v-chart的实践心得
开发Vue2和Vue3时,我们常常需要将数据以图表的形式展示给用户,而 V-Chart 作为一个轻量级且易于集成的图表库,是 Vue 开发的首选。这篇文章,我将写一下关于我在使用这方面的心得。 echarts官网:https://echarts.apach…...
Endnote使用笔记——持续更新
(1)如果样式库里没有想要的期刊格式,可以到这个网址进行下载,并放在本地安装Endnote的文件下边的styles文件里: https://endnote.com/downloads/styles/ (2)EndNote导入参考文献时,关…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
