用汇编语言做单片机六位数码管时钟,使用AT89C51单片机和BCD编码的数码管。
时间: 2023-07-24 14:32:27 浏览: 143
好的,下面是使用AT89C51单片机和BCD编码的数码管的汇编程序,实现单片机六位数码管时钟的基本功能:
```
; 定义数码管引脚
SEGMENT0 EQU P1.0
SEGMENT1 EQU P1.1
SEGMENT2 EQU P1.2
SEGMENT3 EQU P1.3
SEGMENT4 EQU P1.4
SEGMENT5 EQU P1.5
DIGIT0 EQU P2.0
DIGIT1 EQU P2.1
DIGIT2 EQU P2.2
DIGIT3 EQU P2.3
DIGIT4 EQU P2.4
DIGIT5 EQU P2.5
ORG 0H
START:
MOV DPTR,#TIME ; 将DPTR指向TIME变量
MOVX A,@DPTR ; 将A寄存器中的值更新为TIME变量的值
MOV R0,#0AH ; 设置计数器初值
MOV R1,#00H
MOV R2,#0DH
MOV R3,#0FH
MOV R4,#0AH
MOV R5,#00H
TIMER:
MOV TH0,#3CH ; 设置定时器初值,定时1ms
MOV TL0,#00H
SETB TR0 ; 启动定时器
DJNZ R0,$ ; 计数器自减,循环10次
CLR TR0 ; 关闭定时器
MOV A,R5 ; 将时间的个位秒显示在数码管的第一位
MOV SEGMENT0,A
MOV A,R4 ; 将时间的十位秒显示在数码管的第二位
MOV SEGMENT1,A
MOV A,R3 ; 将时间的个位分显示在数码管的第三位
MOV SEGMENT2,A
MOV A,R2 ; 将时间的十位分显示在数码管的第四位
MOV SEGMENT3,A
MOV A,R1 ; 将时间的个位时显示在数码管的第五位
MOV SEGMENT4,A
MOV A,R0 ; 将时间的十位时显示在数码管的第六位
MOV SEGMENT5,A
MOV A,DIGIT0 ; 数码管扫描
CPL A ; 取反
MOV DIGIT0,A
JNZ NEXT
MOV A,R5 ; 秒加1
ADD A,#01H
ANL A,#0FH ; 取低4位
CJNE A,R5,SET_TIME ; 判断是否需要设置时间
MOV A,R4 ; 秒满60,分钟加1
ADD A,#01H
ANL A,#0FH
CJNE A,R4,NEXT1
MOV A,#00H ; 分钟满60,小时加1
MOV R4,A
MOV A,R3
ADD A,#01H
ANL A,#0FH
CJNE A,R3,NEXT1
MOV A,#00H
MOV R3,A
MOV A,R2 ; 小时满24,归零
ADD A,#01H
ANL A,#0FH
CJNE A,R2,NEXT1
MOV A,#00H
MOV R2,A
NEXT1:
MOV A,R1 ; 判断是否需要闪烁
ANL A,#0FH
CJNE A,#00H,NEXT
MOV A,R0
ANL A,#0FH
CJNE A,#00H,NEXT
MOV A,DIGIT1
CPL A
MOV DIGIT1,A
NEXT:
MOV A,DIGIT2
CPL A
MOV DIGIT2,A
MOV A,DIGIT3
CPL A
MOV DIGIT3,A
MOV A,DIGIT4
CPL A
MOV DIGIT4,A
MOV A,DIGIT5
CPL A
MOV DIGIT5,A
SJMP TIMER
SET_TIME: ; 设置时间
MOV A,DIGIT5
CPL A
MOV DIGIT5,A
JB P3.0,SET_TIME1
JB P3.1,SET_TIME2
JB P3.2,SET_TIME3
JB P3.3,SET_TIME4
JB P3.4,SET_TIME5
JB P3.5,SET_TIME6
SJMP SET_TIME
SET_TIME1: ; 秒加1
INC R5
CJNE R5,#0AH,SET_TIME
MOV A,#00H
MOV R5,A
SJMP SET_TIME
SET_TIME2: ; 分加1
INC R4
CJNE R4,#0AH,SET_TIME
MOV A,#00H
MOV R4,A
SJMP SET_TIME
SET_TIME3: ; 时加1
INC R3
CJNE R3,#0AH,SET_TIME
MOV A,#00H
MOV R3,A
SJMP SET_TIME
SET_TIME4: ; 分钟清零
MOV A,#00H
MOV R4,A
SJMP SET_TIME
SET_TIME5: ; 小时清零
MOV A,#00H
MOV R3,A
MOV R2,A
SJMP SET_TIME
SET_TIME6: ; 复位
MOV A,#00H
MOV R0,A
MOV R1,A
MOV R2,A
MOV R3,A
MOV R4,A
MOV R5,A
SJMP SET_TIME
```
这个程序基本上是在定时器中断中实现的,通过定时器控制数码管的扫描和时间的更新。其中SET_TIME子程序用于设置时间,通过按键控制。在TIMER子程序中,使用了闪烁的方法实现了秒钟和分钟的显示,在计时过程中还进行了时间的自动更新。
阅读全文