跪求使用C51芯片和数码管,且利用中断来写段数字时钟。

2025-03-22 13:06:25
推荐回答(2个)
回答1:

STRT EQU P3.0
STP EQU P3.1
CLRR EQU P3.2
ORG 0000H
SJMP MAIN
ORG 000BH
AJMP T0INT0
ORG 0030H
MAIN: MOV SP,#60H;设置堆栈指针
MOV R4,#10;R4=10
MOV TMOD,#01H;定期器0方式1
MOV TH0,#03CH;12M晶振时定时初值取#3CB0H
MOV TL0,#0B0H
SETB ET0;开定时器0中断
SETB EA;开定时器总中断
K1:
LCALL DISP
JB STRT,K2
LCALL DISP
JNB STRT,START
K2: LCALL DISP
JB STP,K3
LCALL DISP
JNB STP,STOP
K3: LCALL DISP
JB CLRR,K1
LCALL DISP
JNB CLRR,CLEAR
AJMP K1
START: SETB TR0
AJMP K1
STOP: CLR TR0
AJMP K2
CLEAR: CLR TR0
MOV A,#0
MOV 20H,A
MOV 21H,A
MOV 22H,A
MOV 23H,A
MOV 24H,A
MOV 25H,A
MOV 26H,A
MOV 27H,A
MOV 28H,A

AJMP K1
DISP: MOV A,24H;要显示的秒数
MOV B,#10
DIV AB
MOV 20H,B;余数(秒个位数)
MOV 21H,A;商(秒十位数)

MOV A,25H;要显示的分数
MOV B,#10
DIV AB
MOV 22H,B ;余数(分个位数)
MOV 23H,A ;商(分十位数)

MOV A,20H ;秒个位
ACALL SEG7;获得要显示的数值

MOV A,26H;要显示的小时数
MOV B,#10
DIV AB
MOV 27H,B ;余数(小时个位数)
MOV 28H,A ;商(小时十位数)

MOV A,20H ;秒个位
ACALL SEG7;获得要显示的数值
MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#01H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

MOV A,21H ;秒十位
ACALL SEG7;获得要显示的数值

MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#02H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

MOV A,22H;分个位
ACALL SEG7;获得要显示的数值

MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#04H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

MOV A,23H;分十位
ACALL SEG7;获得要显示的数值

MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#08H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

MOV A,27H;小时个位
ACALL SEG7;获得要显示的数值

MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#10H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

MOV A,28H; 小时十位
ACALL SEG7;获得要显示的数值

MOV DPTR ,#8004H
MOVX @DPTR ,A
MOV DPTR ,#8002H
MOV A,#20H
MOVX @DPTR,A
ACALL DLY;调用延时
MOV A,#00H ;清位选
MOVX @DPTR,A

RET
T0INT0: MOV TH0,#0FDH;定时中断子程序。重装定时常数//虚拟一个比较大的初值便于查看时间情况
MOV TL0,#0E8H
DJNZ R4,T0INTR;50msX20=1S,未满20次,跳出中断子程序
MOV R4,#20 ;20装入R4中
INC 24H ;要显示的秒数+1
MOV A,24H ;将要显示的秒数放入A中
CJNE A,#60,T0INTR;秒数不等于60跳转到TOINTR
MOV 24H,#0 ;若秒数=60时,清零
INC 25H ;分钟数+1
MOV A,25H ;分钟数+1,放入A中
CJNE A,#60,T0INTR;比较分钟数不等于60则跳转到TOINTR
MOV 25H,#0 ;分钟数等于60则清零
INC 26H
CJNE A,#24,T0INTR;小时数不等于24跳转到TOINTR
MOV 26H,#0 ;小时数等于24则清零
T0INTR: RETI

DLY: MOV R7,#10 ;延时程序
D1: MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET

SEG7: INC A ;A内容+1
MOV DPTR,#TABLE ;把表首地址放入DPTR
MOVC A,@A+DPTR ;DPTR+A地址下内容放入A,查表
RET
TABLE: DB 3FH; 0
DB C0H; 0
DB F9H; 1
DB A4H; 2
DB B0H; 3
DB 99H; 4
DB 92H; 5
DB 82H; 6
DB F8H; 7
DB 80H; 8
DB 90H; 9
END

回答2:

你得留下邮箱,不然仿真图怎么给你。