基于51单片机,及其RTC实时时钟,设计一个可以实现倒计时功能的电子倒计时牌系统。
具体要求如下:
(1)可以用数码管显示倒计时的时分秒信息
(2)可以通过按键对倒计时设置初值;倒计时结束时可发出提示音或者用二极灯管指示。
倒计时汇编语言RTC实时时钟,使用汇编语言
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
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
解决 无用评论 打赏 举报
悬赏问题
- ¥15 PADS Logic 原理图
- ¥15 PADS Logic 图标
- ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
- ¥20 气象站点数据求取中~
- ¥15 如何获取APP内弹出的网址链接
- ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
- ¥50 STM32单片机传感器读取错误
- ¥15 (关键词-阻抗匹配,HFSS,RFID标签天线)
- ¥15 机器人轨迹规划相关问题
- ¥15 word样式右侧翻页键消失