直接登录的网站注册品牌商标流程及费用
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单片机综合训练平台用户手册
 
版权声明:本文为博主原创文章,转载请注明出处。
 作者:[杜子不疼]
希望这篇博客对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。
