当前位置: 首页 > news >正文

基于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_mst_s 和 t_min,并刷新数码管显示。

4.2 数码管显示

  • 使用 Display_Timer() 函数显示当前时间,格式为 分-秒-0.05秒

  • 通过 SelectHC573() 函数选择数码管位选和段选锁存器。

4.3 按键功能

  • S4:按下后切换秒表的启动和暂停状态。

  • S5:按下后清零秒表时间。


5. 总结

本文基于CT107D单片机综合训练平台,设计了一个具有启动、暂停和清零功能的秒表。通过定时器T0实现精确计时,数码管显示时间,独立按键控制秒表状态。代码结构清晰,功能完善,适合初学者学习和参考。


6. 参考资料

  • STC89C52RC数据手册

  • CT107D单片机综合训练平台用户手册


版权声明:本文为博主原创文章,转载请注明出处。
作者:[杜子不疼]


希望这篇博客对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。

相关文章:

基于CT107D单片机综合训练平台的秒表设计

1. 项目简介 在CT107D单片机综合训练平台上&#xff0c;利用定时器T0、数码管模块和2个独立按键&#xff08;J5的2-3短接&#xff09;&#xff0c;设计一个具有清零、暂停、启动功能的秒表。秒表显示格式为&#xff1a;分-秒-0.05秒&#xff08;即50ms&#xff09;&#xff0c…...

opensuse [Linux] 系统挂在新的机械硬盘

opensuse [Linux] 系统挂在新的机械硬盘 需求描述 自用电脑型号如下&#xff1a; 电脑&#xff1a;Precision Tower 7810 (Dell Inc.) CPU &#xff1a; Intel Xeon CPU E5-2686 v4 2.30GHz GPU&#xff1a; NVIDIA GeForce GTX 1070 Linux版本&#xff1a;Linux version 6.…...

时间序列分析(四)——差分运算、延迟算子、AR(p)模型

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 一、差分运算 差分运算的定义&#xff1a;差分运算是一种将非平稳时间序列转换…...

【CUDA】Triton

【CUDA】Triton 1. CUDA 与 Triton 的基本区别 CUDA 编程模型&#xff1a; 在传统的 CUDA 编程中&#xff0c;CUDA 是标量程序&#xff0c;带有阻塞线程&#xff08;blocked threads&#xff09;。 标量程序&#xff08;Scalar Program&#xff09;&#xff1a;表示我们直接…...

Windows环境搭建ES集群

搭建步骤 下载安装包 下载链接&#xff1a;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学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储&#xff1a;完整代码 引言 本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。 背景 在与大模型交互过程中&#xff0c;经常出现消息管理方…...

怎么在智能合约中植入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 从人类学习…...

函数防抖和节流

所谓防抖&#xff0c;就是指触发事件后在 n 秒内函数只能执行一次&#xff0c; 如果在 n 秒内又触发了事件&#xff0c;则会重新计算函数执行时间&#xff0c; 短时间高频率触发只有最后一次触发成功 开发使用场景&#xff1a; 搜索框防抖 fn代表要被防抖或者节流的函数&#x…...

linux--关于linux文件IO(2) open、read、lseek、stat

open 在linux中的读写文件有对应的命令。在终端中输入man 2 open可以打开open的手册页&#xff0c;注意man 2是linux自己的函数的一些手册&#xff0c;man 3是C库的手册 打开手册页之后找到open函数的用法如下&#xff1a; #以下是需要的库文件&#xff0c;man 2 open打开直接…...

利用xtquant高效获取财务数据:量化分析的重要补充

利用xtquant高效获取财务数据&#xff1a;量化分析的重要补充 在量化交易领域&#xff0c;虽然市场行情数据是核心&#xff0c;但财务数据作为企业基本面的重要反映&#xff0c;同样不可忽视。通过深入分析企业的财务报表&#xff0c;投资者可以更好地理解企业的经营状况和未来…...

Unity UI个人总结

个人总结&#xff0c;太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框&#xff0c;在1920x1080像素下在屏幕中长度占比1/19&#xff0c;在3840x2160&#xff0c;方框在屏幕中长度占比1/38。也就是像素长款不变&#xff0c;在屏幕中占比发生变化 2.…...

Javascript的数据类型

Javascript的数据类型 1.基本数据类型1.1七种基本数据类型1.2单独说说BigInt‌1.3其它注意点 2.引用数据类型3.基本数据类型和引用数据类型的区别4.双等于号和三等于号的区别5.Javascript的类型转换机制5.1显示转换(强制转换)5.2隐式转换(1)减、乘、除(2)加(加法要区别算,因为不…...

Day3 25/2/16 SUN

【一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;】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时&#xff0c;我们常常需要将数据以图表的形式展示给用户&#xff0c;而 V-Chart 作为一个轻量级且易于集成的图表库&#xff0c;是 Vue 开发的首选。这篇文章&#xff0c;我将写一下关于我在使用这方面的心得。 echarts官网&#xff1a;https://echarts.apach…...

Endnote使用笔记——持续更新

&#xff08;1&#xff09;如果样式库里没有想要的期刊格式&#xff0c;可以到这个网址进行下载&#xff0c;并放在本地安装Endnote的文件下边的styles文件里&#xff1a; https://endnote.com/downloads/styles/ &#xff08;2&#xff09;EndNote导入参考文献时&#xff0c;关…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...