实现方法一:
;通过对0.5ms的若干次循环实现1KHz方波的10s输出
Count EQU 30H
SP1 BIT P3.7
T02SA EQU 31H
T02SB EQU 32H
FLAG BIT 00H ;伪指令
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START:
MOV SP,50H ;设定堆栈区
MOV Count,#00H ;显示部分初始化
NEXT1: ;显示程序
MOV A,Count
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR ;用查表法实现显示
MOV P0,A ;显示十位
MOV A,B
; MOVC A,@A+DPTR
MOV P2,A ;显示个位
WT:
; ;判断按键是否按下?
JNB SP1,WT
WAIT:
JB SP1,WAIT
LCALL DELY10MS ;调用DELY10MS延时10ms实现消抖
JB SP1,WAIT
INC Count
MOV A,Count
CJNE A,#100,NEXT1 ;判断计数是否达到100?
START1:
MOV T02SA,#00H
MOV T02SB,#00H
CLR FLAG ;发声部分初始化
MOV TMOD,#01H ;置T0为模式1
MOV TH0,#(65536-500) / 256
MOV TL0,#(65536-500) MOD 256 ;计数器置初值,实现0.5ms定时
SETB TR0 ;启动计数器
SETB ET0
SETB EA ;开中断
JNB FLAG,$ ;若FLAG为1,
则跳出10S定时,否则等待中断
CLR EA
CLR ET0 ;关中断
CLR P1.0 ;置P1.0为0,使之停止发声
LJMP START ;跳转到程序起始端实现总体程序循环
INT_T0: ;中断服务程序
MOV TH0,#(65536-500) / 256
MOV TL0,#(65536-500) MOD 256 ;自动载入初值,实现0.5ms循环定时
INC T02SA ;实现10s定时
MOV A,T02SA
CJNE A,#100,NEXT
INC T02SB
MOV A,T02SB
CJNE A,#76,NEXT
MOV T02SA,#00H ;定时达10s后,进行变量清空
MOV T02SB,#00H
SETB FLAG
sp; ;置FLAG为1,方便跳出10s定时
NEXT:
CPL P1.0 ;高低电平交替变换实现1KHz输出
DONE:
RETI
DELY10MS: ;延迟10ms子程序
MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END |