m0_73504569 2023-05-28 15:06 采纳率: 50%
浏览 58
已结题

倒计时汇编语言RTC实时时钟,使用汇编语言

基于51单片机,及其RTC实时时钟,设计一个可以实现倒计时功能的电子倒计时牌系统。
具体要求如下:
(1)可以用数码管显示倒计时的时分秒信息
(2)可以通过按键对倒计时设置初值;倒计时结束时可发出提示音或者用二极灯管指示。

  • 写回答

6条回答 默认 最新

  • qllaoda 2023-05-28 15:29
    关注
    获得1.95元问题酬金
    
    ; 定义端口和控制信号
    DIO_PORT   equ P1   ; 数码管段选控制端口
    DIO_CTRL   equ P2   ; 数码管位选控制端口
    DS1302_RST equ P3.7 ; DS1302复位信号
    DS1302_CLK equ P3.6 ; DS1302时钟信号
    DS1302_DAT equ P3.5 ; DS1302数据信号
    BUZZER     equ P0.0 ; 蜂鸣器信号
    LED        equ P0.1 ; 二极灯管信号
    BTN_SET    equ P0.2 ; 设置按键信号
    
    ; 定义数码管显示字符表
    SEG_TABLE  db 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
    
    ; 定义计时变量
    hours      dw 0     ; 小时
    minutes    dw 0     ; 分钟
    seconds    dw 0     ; 秒钟
    
    ; 主程序入口
    MAIN:
        mov A, #0FFh  ; 设置A寄存器为全1,用于数码管清零
        mov DIO_CTRL, A  ; 数码管位选控制端口置1,关闭所有数码管
        mov DIO_PORT, A  ; 数码管段选控制端口置1,清空显示内容
        mov BUZZER, #0   ; 关闭蜂鸣器
        mov LED, #1      ; 关闭二极灯管
        mov BTN_SET, #1  ; 设置按键信号口为输入
        call DS1302_Init  ; 初始化DS1302时钟芯片
        call SetInitialTime  ; 设置初始时间
    
    COUNTDOWN_LOOP:
        call DS1302_ReadTime  ; 读取当前时间
        call DisplayTime  ; 显示当前时间
        call CheckButton  ; 检查设置按键是否按下
        call Countdown  ; 倒计时处理
        sjmp COUNTDOWN_LOOP
    
    ; DS1302时钟芯片初始化
    DS1302_Init:
        mov DS1302_RST, #0  ; 拉低DS1302复位信号
        acall DelayShort  ; 延时一段时间
        mov DS1302_RST, #1  ; 拉高DS1302复位信号
        acall DelayShort  ; 延时一段时间
        ret
    
    ; 设置初始时间
    SetInitialTime:
        acall DisplayTime  ; 显示当前时间
        acall WaitForButtonPress  ; 等待设置按键按下
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        cjne A, #0, SetHours  ; 如果按键按下,则设置小时
        acall WaitForButtonRelease  ; 等待设置按键释放
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        cjne A, #0, SetMinutes  ; 如果按键按下,则设置分钟
        acall WaitForButtonRelease  ; 等待设置按键释放
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        cjne A, #0, SetSeconds  ; 如果按键按下,则设置秒钟
        ret
    
    SetHours:
        acall WaitForButtonRelease  ; 等待设置按键释放
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        inc hours  ; 小时加1
        cjne A, #0, SetHours  ; 如果按键按下,则继续增加小时
        ret
    
    SetMinutes:
        acall WaitForButtonRelease  ; 等待设置按键释放
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        inc minutes  ; 分钟加1
        cjne A, #0, SetMinutes  ; 如果按键按下,则继续增加分钟
        ret
    
    SetSeconds:
        acall WaitForButtonRelease  ; 等待设置按键释放
        acall DelayShort  ; 延时一段时间,防止按键抖动
        acall ReadButton  ; 读取设置按键状态
        inc seconds  ; 秒钟加1
        cjne A, #0, SetSeconds  ; 如果按键按下,则继续增加秒钟
        ret
    
    ; 显示当前时间
    DisplayTime:
        mov A, DIO_CTRL  ; 保存数码管位选控制端口状态
        push A  ; 将数码管位选控制端口状态保存到栈中
        mov DIO_CTRL, #0FFh  ; 数码管位选控制端口置1,关闭所有数码管
        mov A, DIO_PORT  ; 保存数码管段选控制端口状态
        push A  ; 将数码管段选控制端口状态保存到栈中
    
        ; 显示小时
        mov A, hours
        mov R7, #2  ; 循环计数器
        mov R6, #10  ; 循环次数
    DISPLAY_HOURS:
        mov R0, #0
        mov R1, A
        div AB, R6
        mov A, B
        add A, #48  ; 转换为ASCII码
        mov DIO_PORT, A
        acall DelayShort  ; 延时一段时间
        mov A, R1
        mov R1, B
        cjne R7, #0, DISPLAY_HOURS  ; 循环显示小时的十位和个位
        mov A, #0  ; 显示冒号
        mov DIO_PORT, A
        acall DelayShort  ; 延时一段时间
    
        ; 显示分钟
        mov A, minutes
        mov R7, #2  ; 循环计数器
        mov R6, #10  ; 循环次数
    DISPLAY_MINUTES:
        mov R0, #0
        mov R1, A
        div AB, R6
        mov A, B
        add A, #48  ; 转换为ASCII码
        mov DIO_PORT, A
        acall DelayShort  ; 延时一段时间
        mov A, R1
        mov R1, B
        cjne R7, #0, DISPLAY_MINUTES  ; 循环显示分钟的十位和个位
        mov A, #0  ; 显示冒号
        mov DIO_PORT, A
        acall DelayShort  ; 延时一段时间
    
        ; 显示秒钟
        mov A, seconds
        mov R7, #2  ; 循环计数器
        mov R6, #10  ; 循环次数
    DISPLAY_SECONDS:
        mov R0, #0
        mov R1, A
        div AB, R6
        mov A, B
        add A, #48  ; 转换为ASCII码
        mov DIO_PORT, A
        acall DelayShort  ; 延时一段时间
        mov A, R1
        mov R1, B
        cjne R7, #0, DISPLAY_SECONDS  ; 循环显示秒钟的十位和个位
    
        pop A  ; 恢复数码管段选控制端口状态
        mov DIO_PORT, A  ; 恢复数码管段选控制端口状态
        acall DelayShort  ; 延时一段时间
        pop A  ; 恢复数码管位选控制端口状态
        mov DIO_CTRL, A  ; 恢复数码管位选控制端口状态
        acall DelayShort  ; 延时一段时间
        ret
    
    ; 检查设置按键是否按下
    CheckButton:
        acall ReadButton  ; 读取设置按键状态
        cjne A, #0, Exit  ; 如果按键按下,则跳出循环
        ret
    
    Exit:
        ret
    
    ; 倒计时处理
    Countdown:
        mov A, seconds
        orl A, minutes
        orl A, hours
        jz CountdownEnd  ; 如果时间为0,则倒计时结束
    
        ; 减少一秒钟
        dec seconds
        cjne seconds, #0FFh, CountdownCheckMin  ; 如果秒钟不为0xFF,则跳过减少分钟的步骤
        dec minutes  ; 秒钟减少到0后,减少一分钟
    CountdownCheckMin:
        cjne minutes, #0FFh, CountdownCheckHour  ; 如果分钟不为0xFF,则跳过减少小时的步骤
        dec hours  ; 分钟减少到0后,减少一小时
    CountdownCheckHour:
        ret
    
    CountdownEnd:
        acall Beep  ; 发出提示音
        acall BlinkLED  ; 闪烁二极灯管
        ret
    
    ; 延时一段时间
    DelayShort:
        ; 在此处填入延时代码
        ret
    
    ; 读取设置按键状态
    ReadButton:
        ; 在此处填入读取按键状态代码
        ret
    
    ; 等待设置按键按下
    WaitForButtonPress:
        ; 在此处填入等待按键按下代码
        ret
    
    ; 等待设置按键释放
    WaitForButtonRelease:
        ; 在此处填入等待按键释放代码
        ret
    
    ; 发出提示音
    Beep:
        ; 在此处填入发出提示音代码
        ret
    
    ; 闪烁二极灯管
    BlinkLED:
        ; 在此处填入闪烁二极灯管代码
        ret
    
    ; DS1302时钟芯片读取当前时间
    DS1302_ReadTime:
        ; 在此处填入读取当前时间代码
        ret
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 修改了问题 5月29日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 Python信息系统tkinter代码错在哪里
  • ¥15 FOR循环语句显示查询超过300S错误怎么办
  • ¥15 个人通讯录管理系统 C语言 程序设计 需要能运行成功的 结构体和数组 Visual C++编译器
  • ¥15 数电设计题 没有设计思路 不知道用什么芯片进行设计 求提供设计思路
  • ¥15 在动态多目标优化问题中,第一幅图展示的是问题DF6的相关定义和绘制的POS和POF图,请问图中公式PS(t)和PF(t)是如何推导的
  • ¥60 先数学建模,接着设计一种优化算法结合案例给出智能仓储四向穿梭车的调度计划
  • ¥15 Errno2:No such file or directory,在当前文件确实没有该图片,怎么解决?
  • ¥15 博世摄像头数据存储的问题(iscsi)
  • ¥15 如何实现对学生籍贯信息管理系统的选择排序
  • ¥15 写一个51单片机的时钟代码