89c51单片机汇编语言程序六位数码管电子时钟
时间: 2023-11-28 17:08:42 浏览: 130
下面是一个基于89c51单片机的六位数码管电子时钟的汇编语言程序:
```
; 定义引脚和端口号
sbit D1 = P1^0;
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit D5 = P1^4;
sbit D6 = P1^5;
; 定义常量
DELAY_TIME equ 2 ; 延时时间
; 定义变量
HOUR db 00 ; 小时
MINUTE db 00 ; 分钟
SECOND db 00 ; 秒钟
; 主程序
MAIN:
CALL INIT ; 初始化
LOOP:
CALL DISPLAY ; 显示时间
ACALL DELAY ; 延时
ACALL TIME_INC ; 时间加 1
SJMP LOOP ; 无限循环
; 初始化程序
INIT:
MOV HOUR, #0 ; 初始化小时为 0
MOV MINUTE, #0 ; 初始化分钟为 0
MOV SECOND, #0 ; 初始化秒钟为 0
RET ; 返回
; 显示时间程序
DISPLAY:
MOV D1, #1 ; 选择第一个数码管
MOV P0, HOUR ; 显示小时的十位
ACALL DELAY ; 延时
MOV D1, #0 ; 关闭第一个数码管
MOV D2, #1 ; 选择第二个数码管
MOV P0, HOUR+1 ; 显示小时的个位
ACALL DELAY ; 延时
MOV D2, #0 ; 关闭第二个数码管
MOV D3, #1 ; 选择第三个数码管
MOV P0, MINUTE ; 显示分钟的十位
ACALL DELAY ; 延时
MOV D3, #0 ; 关闭第三个数码管
MOV D4, #1 ; 选择第四个数码管
MOV P0, MINUTE+1 ; 显示分钟的个位
ACALL DELAY ; 延时
MOV D4, #0 ; 关闭第四个数码管
MOV D5, #1 ; 选择第五个数码管
MOV P0, SECOND ; 显示秒钟的十位
ACALL DELAY ; 延时
MOV D5, #0 ; 关闭第五个数码管
MOV D6, #1 ; 选择第六个数码管
MOV P0, SECOND+1 ; 显示秒钟的个位
ACALL DELAY ; 延时
MOV D6, #0 ; 关闭第六个数码管
RET ; 返回
; 延时程序
DELAY:
MOV R7, #DELAY_TIME
DELAY_LOOP:
DJNZ R7, DELAY_LOOP
RET ; 返回
; 时间加 1 程序
TIME_INC:
INC SECOND+1 ; 秒钟的个位加 1
JZ SECOND_TENS_INC ; 如果秒钟的个位是 0,则秒钟的十位加 1
RET ; 返回
SECOND_TENS_INC:
INC SECOND ; 秒钟的十位加 1
JZ MINUTE_INC ; 如果秒钟的十位是 0,则分钟加 1
RET ; 返回
MINUTE_INC:
INC MINUTE+1 ; 分钟的个位加 1
JZ MINUTE_TENS_INC ; 如果分钟的个位是 0,则分钟的十位加 1
RET ; 返回
MINUTE_TENS_INC:
INC MINUTE ; 分钟的十位加 1
JZ HOUR_INC ; 如果分钟的十位是 0,则小时加 1
RET ; 返回
HOUR_INC:
INC HOUR+1 ; 小时的个位加 1
JZ HOUR_TENS_INC ; 如果小时的个位是 0,则小时的十位加 1
RET ; 返回
HOUR_TENS_INC:
INC HOUR ; 小时的十位加 1
RET ; 返回
```
该程序使用 P1 端口控制六个数码管的显示,使用 P0 端口显示时间。程序中定义了常量 DELAY_TIME 表示延时时间,变量 HOUR、MINUTE、SECOND 分别表示小时、分钟、秒钟。程序通过循环不断调用 DISPLAY、DELAY、TIME_INC 程序来实现时间显示和时间计数功能。
阅读全文