;TO口输入1HZ左右的方波信号,用定时器获得方波的一个周期,再计算1分钟的周期数
;我的锁存器373使能端全部接地使能,P0口送出数据去显示,P2口锁存信号
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;计数程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 00H
MAIN:
MOV TMOD,#26H ;Timer1工作在定时模式2下,Timer0工作在计数模式2下
MOV TH1,#56 ;定时器Timer1初始值设为56
MOV TL1,#56
MOV TH0,#0FFH ;计数器Timer0初始值设为0FFH,计数一次就溢出
MOV TL0,#0FFH
RESTART:
CLR A ;清零A
MOV R0,A ;清零R0
SETB TR0 ;启动计数器Timer0
CHECK0:
JNB TF0,CHECK0 ;第一个周期波放过,以便得到完整的周期波
CLR TF0
SETB TR1 ;启动定时器Timer1
CHECK1:
JB TF0,STOP_T1 ;一次计数完成则停止定时器Timer1
JNB TF1,CHECK1 ;定时器Timer1没溢出则继续检测
CLR TF1 ;定时器Timer1溢出则清零TF1,重新计数
INC A ;完成一次200uS的定时,A加1
CJNE A,#250,CHECK1 ;完成200×250=0.05s定时,R0加1
CLR A
INC R0 ;R0存储0.05S的个数
JMP CHECK1
STOP_T1:
CLR TF0
CLR TR1 ;关闭定时器Timer1
CALCULATE: ;计算一分钟的方波数
MOV B,R0 ;公式:60/(0.05*R0)=1200/R0=6*(200/R0)=6*商+6*余数/R0
MOV A,#200
DIV AB
MOV R1,B
MOV B,#6
MUL AB
MOV R2,A
MOV B,R1
MOV A,#6
MUL AB
MOV B,R0
DIV AB
ADD A,R2
CALL DISPLAY
JMP RESTART
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:
DGE EQU 50H ;个位数存放处
SHI EQU 51H ;十位数存放处
BAI EQU 52H ;百位数存放处
START:
MOV B,#100
DIV AB
MOV BAI,A
MOV A,B
MOV B,#10 ;把数字10放入b寄存器
DIV AB ;a除以b,a然后存商,b存余数
MOV SHI,A ;把商a放回个位数存放处
MOV DGE,B ;把余数b放回个位数存放处
DLOOP:
MOV DPTR,#TABLE ;指定查表启始地址
MOV A,BAI ;取百位数
MOVC A,@A+DPTR ;查百位数的7段代码
SETB P2.2
MOV P0,A ;送出百位数的7段代码去显示
CALL DELAY
CLR P2.2 ;来个下降沿,锁存百位数字
MOV DPTR,#TABLE ;指定查表启始地址
MOV A,SHI ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
SETB P2.1
MOV P0,A ;送出十位数的7段代码去显示
CALL DELAY
CLR P2.1 ;来个下降沿,锁存十位数字
MOV DPTR,#TABLE ;指定查表启始地址
MOV A,DGE ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
SETB P2.0
MOV P0,A ;送出个位数的7段代码去显示
CALL DELAY
CLR P2.0 ;来个下降沿,锁存个位数字
DELAY: ;延时子程序,延时5ms
MOV R4,#20
D1:
MOV R3,#250
DJNZ R3,$
DJNZ R4,D1
RET
TABLE: ;段数码管各划的数字排列表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;显示内容的对应代码
;0 1 2 3 4 5 6 7 8 9 ;显示内容
RET
END