加入分行以后就能很容易看懂,不懂之处再交流
T5HZ EQU 30H :定义T5HZ变量,地址为30H
T7HZ EQU 31H ;定义T7HZ变量,地址为31H
T05SA EQU 32H ;定义T05SA变量,地址为32H
T05SB EQU 33H ;定义T05SB变量,地址为33H
FLAG BIT 00H ;定义FLAG为位变量,地址00H
STOP BIT 01H ;定义STOP为位变量,地址01H
SP1 BIT P1.2 ;定义SP1为位变量,地址P1.2
ORG 00H ;定义主函数运行地址00
LJMP START
ORG 0BH ;;定义中断函数T0运行地址0BH
LJMP INT_T0
START: MOV TMOD,#02H ;T0定时器工作于方式2,8位自动重装计数器。仅TL0作为计数器,TH0的值不变。TL0溢出, TH0中的值自动装入TL0中.
MOV TH0,#06H ;定时器说明:时钟频率fosc= 12MHz,分频频率 Fo =12/12 = 1MHz,T = 1/F0 = 1us
MOV TL0,#06H ;255 - 6 +1 = 250 us
SETB ET0 ;使能T0中断
SETB EA ;使能总中断
;按键检测以及防抖
NSP:
JB SP1,NSP ;如果SP1(P1.2)为1,那么一直在这里等待 ,否则执行向下执行。即按键按下后,执行后面程序。
LCALL DELY10MS ;调用延迟10ms函数
JB SP1,NSP ;如果SP1(P1.2)为1,跳转到NSP行
SETB TR0 ;启动定时器0
MOV T5HZ,#00H
MOV T7HZ,#00H
MOV T05SA,#00H
MOV T05SB,#00H
CLR FLAG
CLR STOP
JNB STOP,$ ;当stop为0时候,一直在这里等待;如果为1的话,执行下一行
LJMP NSP ;跳转到NSP行
;/////////////////////////////////////////////////////////////////////////////////////////////////////////////
;延迟10ms函数
DELY10MS: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
;////////////////////////////////////////////////////////////////////////////////////////////////////////////
;中断T0函数
INT_T0:
INC T05SA
MOV A,T05SA
CJNE A,#110,NEXT ;如果A不等于110,等待,否则跳到NEXT行
MOV T05SA,#00H
INC T05SB
MOV A,T05SB
CJNE A,#06,NEXT ;如果A不等于6,等待,否则跳到NEXT行
MOV T05SB,#00H
JB FLAG,STP ;如果FLAG = 1,那么跳到STP行
CPL FLAG ;CPL = ~CPL
LJMP NEXT
STP:
SETB STOP ;STOP = 1
CLR TR0 ;关闭T0定时器
LJMP DONE ;跳到DONE行
NEXT:
JB FLAG,S5HZ ;如果FLAG= 1,跳到S5HZ行
INC T7HZ ;T7HZ++
MOV A,T7HZ ;A = T7HZ
CJNE A,#03H,DONE ;如果A != #03H,跳到DONE
MOV T7HZ,#00H
CPL P0.0 ;P0.0求反
LJMP DONE ;跳到DONE
S5HZ:
INC T5HZ ;T5HZ = T5HZ + 1
MOV A,T5HZ ;A = T5HZ
CJNE A,#04H,DONE ;如果A != #04H,跳到DONE
MOV T5HZ,#00H
CPL P0.0 ;P0.0求反
LJMP DONE
DONE: RETI ;中断返回
END
有什么重谢