基于AT89C51单片机用汇编语言编写一个程序控制8位数码管显示时间,时间显示格式为xx(小时)-yy(分钟)-zz(秒钟)
时间: 2023-06-25 08:06:34 浏览: 120
基于汇编语言编写的数码管显示时钟程序.pdf
下面是一个简单的程序,可以用来控制8位数码管显示时间。该程序使用AT89C51单片机和汇编语言编写。程序的功能为显示当前时间,时间格式为xx(小时)-yy(分钟)-zz(秒钟)。
```
; AT89C51程序,用于控制8位数码管显示时间
; 时间格式为xx(小时)-yy(分钟)-zz(秒钟)
ORG 0000H
; 定义端口
PORT EQU P1 ; 数码管控制端口
DELAY EQU 30H ; 延时计数器
; 定义常量
HR10 EQU 20H ; 小时的十位
HR1 EQU 21H ; 小时的个位
MIN10 EQU 22H ; 分钟的十位
MIN1 EQU 23H ; 分钟的个位
SEC10 EQU 24H ; 秒钟的十位
SEC1 EQU 25H ; 秒钟的个位
; 定义变量
HOUR DB 07H ; 小时变量
MINUTE DB 30H ; 分钟变量
SECOND DB 00H ; 秒钟变量
; 初始化
INIT:
MOV PORT, #0FFH ; 数码管控制端口初始化
MOV HOUR, #07H ; 小时初始化为7点
MOV MINUTE, #30H ; 分钟初始化为30分
MOV SECOND, #00H ; 秒钟初始化为0秒
; 循环
LOOP:
CALL DISP_TIME ; 显示时间
CALL DELAY_1S ; 延时1秒
INC SECOND ; 秒钟加1
CJNE SECOND, #60, SKIP_SEC_INC ; 如果秒钟不等于60,跳过增加分钟
MOV SECOND, #00H ; 秒钟归零
INC MINUTE ; 分钟加1
CJNE MINUTE, #60, SKIP_MIN_INC ; 如果分钟不等于60,跳过增加小时
MOV MINUTE, #00H ; 分钟归零
INC HOUR ; 小时加1
CJNE HOUR, #24, SKIP_HOUR_INC ; 如果小时不等于24,跳过归零小时
MOV HOUR, #00H ; 小时归零
; 跳过增加小时
SKIP_HOUR_INC:
; 跳过增加分钟
SKIP_MIN_INC:
; 跳过增加秒钟
SKIP_SEC_INC:
SJMP LOOP ; 循环
; 延时1秒
DELAY_1S:
MOV DELAY, #0FFH
DELAY_LOOP:
DJNZ DELAY, DELAY_LOOP
RET
; 显示时间
DISP_TIME:
MOV A, HOUR ; 获取小时
DIV AB, #10 ; 分解出十位数
MOV HR10, B ; 存储十位数到HR10
MOV A, HOUR ; 获取小时
DIV AB, #10 ; 分解出个位数
MOV HR1, B ; 存储个位数到HR1
MOV A, MINUTE ; 获取分钟
DIV AB, #10 ; 分解出十位数
MOV MIN10, B ; 存储十位数到MIN10
MOV A, MINUTE ; 获取分钟
DIV AB, #10 ; 分解出个位数
MOV MIN1, B ; 存储个位数到MIN1
MOV A, SECOND ; 获取秒钟
DIV AB, #10 ; 分解出十位数
MOV SEC10, B ; 存储十位数到SEC10
MOV A, SECOND ; 获取秒钟
DIV AB, #10 ; 分解出个位数
MOV SEC1, B ; 存储个位数到SEC1
MOV PORT, #0FFH ; 打开数码管
MOV A, HR10 ; 获取小时的十位数
ORL A, #80H ; 设置最高位为1
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
MOV PORT, #0FFH ; 打开数码管
MOV A, HR1 ; 获取小时的个位数
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
MOV PORT, #0FFH ; 打开数码管
MOV A, MIN10 ; 获取分钟的十位数
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
MOV PORT, #0FFH ; 打开数码管
MOV A, MIN1 ; 获取分钟的个位数
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
MOV PORT, #0FFH ; 打开数码管
MOV A, SEC10 ; 获取秒钟的十位数
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
MOV PORT, #0FFH ; 打开数码管
MOV A, SEC1 ; 获取秒钟的个位数
MOV PORT, A ; 输出到数码管
CALL DELAY ; 延时
RET
END
```
该程序使用P1端口控制8位数码管的显示,使用30H计数器进行延时。程序初始化小时、分钟和秒钟变量为7:30:00,然后循环显示时间,每秒钟增加一次秒钟变量。如果秒钟变量达到60,它将被重置为0,并且分钟变量将增加1。如果分钟变量达到60,它将被重置为0,并且小时变量将增加1。如果小时变量达到24,它将被重置为0。
显示时间的函数DISP_TIME分解小时、分钟和秒钟变量的十位数和个位数,并将它们存储在HR10、HR1、MIN10、MIN1、SEC10和SEC1变量中。然后,函数将这些变量输出到数码管中,每个数字之间延时一段时间。
该程序可以通过修改延时时间和端口定义来适应不同的硬件配置。
阅读全文