基于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(SMGt_ms % 10, 7); // 显示0.05秒个位

Display_SMG(SMGt_ms / 10, 6); // 显示0.05秒十位

Display_SMG(SMG16, 5); // 显示分隔符"-"

Display_SMG(SMGt_s % 10, 4); // 显示秒个位

Display_SMG(SMGt_s / 10, 3); // 显示秒十位

Display_SMG(SMG16, 2); // 显示分隔符"-"

Display_SMG(SMGt_min % 10, 1); // 显示分钟个位

Display_SMG(SMGt_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_st_min,并刷新数码管显示。

4.2 数码管显示

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

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

4.3 按键功能

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

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


5. 总结

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


6. 参考资料

  • STC89C52RC数据手册

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


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


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

相关推荐
xuxie992 小时前
start9 霍尔双相编码器
单片机
兆龙电子单片机设计3 小时前
【STM32项目开源】STM32单片机语音分类垃圾桶-蓝牙APP
stm32·单片机·嵌入式硬件·物联网·开源·自动化·毕业设计
零涂毕业设计3 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
阿龙的工作记录5 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
ye150127774555 小时前
220V转5V1A隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
武汉万象奥科5 小时前
AGV导航控制器方案 | 基于HD-RK3576系列核心板的算控融合一体化平台
arm开发·嵌入式硬件·arm核心板·单板机
ye150127774556 小时前
DC24V-100V转3.3V500mA隔离芯片WT5602
单片机·嵌入式硬件·其他·硬件工程
Lumos6fly6 小时前
51单片机从零到实战(15)——数字时钟温度计
单片机·嵌入式硬件·51单片机
gwf2167 小时前
磨损均衡算法(Wear Leveling)——SSD如何让每块闪存“公平退休“?
运维·数据库·人工智能·python·嵌入式硬件·算法·智能硬件
zlinear数据采集卡8 小时前
从“脏信号”到“纳伏级纯净”:硬核拆解DABL7606的多级抗混叠滤波与24位过采样算法
arm开发·科技·嵌入式硬件·fpga开发·开源