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

倒计时汇编语言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 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素