Proteus仿真电路图(下图)
数码管编码
本人使用AT89C51单片机来控制电路
使用共阴极七段数码管
采用两个数码管分别表示十位和个位,数码管编码与单片机引脚对应关系如下图:
因为没跟管脚对应一根晶体管,用编码查表赋值可以大大缩减代码数量
TAP:DB 3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH
实现暂停
为了实现计数暂停操作,使用外部中断INT_1,P3.3管脚。跳转进入中断程序,再进入事先准备好的循环计数程序,然后再利用中断跳出循环计数程序,实现暂停计数。大体框架如下:
INT_1:
CLR IE1
…………
JB IE1,LMP
…………
LMP:
CLR IE1
NOP
RETI
延时程序
为了数字的变化好观察又不至于太慢,设计延时程序:
TIME:
MOV R1,#200
JB IE1,LMP
MOV R2,#250
DJNZ R2,$
MOV R2,#250
DJNZ R2,$
DJNZ R1,TIME
大概延时0.3S
实现复位
采用复位电路实现
汇编语言展示
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INT_1
ORG 01000H
MAIN: SETB P3.3
MOV P0,#3FH
MOV P2,#3FH
MOV R4,#00H
MOV R3,#00H
MOV R1,#200
SETB IT1
SETB EA
SETB EX1
SETB P3.3
MOV SP,#60H
SJMP $
LJMP MAIN
INT_1:
CLR IE1
LOP:
MOV DPTR,#TAP
MOV A,R4
MOVC A,@A+DPTR
MOV P2,A
INC R4
TIME:
JB IE1,LMP
MOV R2,#250
DJNZ R2,$
MOV R2,#250
DJNZ R2,$
DJNZ R1,TIME
MOV A,R4
SUBB A,#09H
JZ LOOP
LJMP LUP
LOOP:
MOV R4,00H
INC R3
MOV A,R3
SUBB A,#0AH
JZ LUU
MOV DPTR,#TAP
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
LJMP LUP
LUU:
MOV R3,00H
MOV A,R3
MOV DPTR,#TAP
MOVC A,@A+DPTR
MOV P0,A
SJMP LUP
LUP:
LJMP LOP
LMP:
CLR IE1
NOP
RETI
TAP:DB 3FH,6H,5BH,4FH,66H,6DH,7DH,7H,7FH,6FH
END
在这段程序中
MOV A,##
SUBB A,###
JZ LOOP
LJMP LUP
用于判断计数是否超过9,方法较为复杂,读者可以用CJNE比较不相等转移指令自行改进