蓝桥杯单片机第三周第二讲

51单片机时钟系统

一、项目概述

这是一个基于51单片机实现的数字时钟系统,具有以下功能:

  • 实时时钟显示(时、分、秒)

  • 时钟时间设置

  • 闹钟设置与开关

  • LED指示灯显示

  • 数码管动态显示

二、头文件与变量说明

2.1 头文件

 #include <REGX52.H>    // 单片机寄存器定义
 #include<Key.h>        // 按键处理函数
 #include<Seg.h>        // 数码管显示函数

2.2 主要变量说明

变量名 类型 作用
Key_Slow_Down unsigned char 按键防抖延时(10ms)
Seg_Slow_Down unsigned int 数码管刷新延时(500ms)
Clock_Disp[3] unsigned char 当前时间数组:[时, 分, 秒]
Seg_Disp_Mode unsigned char 显示模式:0-显示时间,1-设置时间,2-设置闹钟
Alarm[3] unsigned char 闹钟时间数组
Alarm_Flag bit 闹钟开关:1-开,0-关

三、核心功能模块

3.1 按键处理函数 Key_Proc()

作用:检测按键动作并执行相应操作

按键功能表

按键 功能说明
按键1 进入时间设置模式
按键2 进入闹钟设置模式
按键3 切换设置项(时→分→秒)
按键4 开关闹钟功能
按键5 当前设置项数值+1
按键6 当前设置项数值-1
按键7 保存设置并返回显示模式
按键8 取消设置并返回显示模式

工作流程

  1. 每10ms检测一次按键(防抖处理)

  2. 识别按键按下动作

  3. 根据当前模式执行相应操作

3.2 显示处理函数 Seg_Proc()

作用:根据当前模式更新数码管显示数据

三种显示模式

  1. 模式0(正常显示):显示当前时间

  2. 模式1(时间设置):显示待设置的时间,当前设置项会闪烁

  3. 模式2(闹钟设置):显示待设置的闹钟时间,当前设置项会闪烁

闪烁效果:通过Seg_Flag变量控制,每500ms切换一次显示/隐藏

3.3 LED处理函数 Led_Proc()

作用:控制LED指示灯

逻辑规则

  1. 闹钟功能关闭时:所有LED熄灭

  2. 闹钟功能开启时:

    • 时间未到闹钟时间:LED熄灭

    • 时间到达闹钟时间:LED开始闪烁

    • 上午(0-11点):低4位LED交替闪烁

    • 下午(12-23点):高4位LED交替闪烁

3.4 定时器中断函数 Timer0Server()

作用:每1ms执行一次,实现多任务调度

执行的任务

  1. 时间更新:每1000ms(1秒)更新时间

  2. 数码管扫描:动态扫描6位数码管

  3. 变量更新:更新防抖计数器、闪烁标志位

  4. LED闪烁控制:每500ms切换LED状态

四、时间管理逻辑

4.1 时间递增规则

 秒加1 → 如果秒=60 → 秒归0,分加1
 分加1 → 如果分=60 → 分归0,时加1
 时加1 → 如果时=24 → 时归0

4.2 时间设置范围

  • 小时:0-23(24小时制)

  • 分钟:0-59

  • 秒钟:0-59

五、重要细节说明

5.1 防抖处理

  • 按键防抖:10ms检测间隔

  • 显示刷新:500ms更新一次显示数据

5.2 数据转换

数码管显示需要将时间数值拆分成十位和个位:

 // 例如:时间23 → 显示"2 3"
 十位 = 时间 / 10 % 10
 个位 = 时间 % 10

5.3 数组使用技巧

使用Clock_Set_Index作为指针,指向当前设置项:

  • 0:设置小时

  • 1:设置分钟

  • 2:设置秒钟

六、主程序流程

程序开始初始化定时器检测按键更新显示控制LED