;程序名字:蜂鸣器
;这是一个非常好的一个控制蜂鸣器的程序,用到了定时器中断方式来定时,且弄能够用程序状态字中的CY标志位来进行运算,
;并且用到了CJNE中的比的不够CY为1,比大的话,为0来进行运算,使程序更加丰富
INTR_CNT EQU 30H ;作为定时器中断的计数值使用
MS10 EQU 9217 ; 对于11.0592的晶振来说,相当于10ms的计数
BUZZER EQU P1.0
;
ORG 0000H
JMP START
ORG 0003H
RETI
ORG 000BH
JMP T0_ISR ;只设置了定时器timer0方式一中断
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
;
ORG 0030H
START: MOV R0,#00H ;初始化程序
DJNZ R0,$
MOV SP,#60H
MOV P1,#0FFH
MOV INTR_CNT,#00H
CLR BUZZER
ACALL SET_TMR0
LOOP: SJMP LOOP
;
;定时器中断处理函数
T0_ISR: MOV TH0,#HIGH(65536-MS10)
MOV TL0,#LOW(65536-MS10)
PUSH PSW
PUSH ACC
MOV A,INTR_CNT
CJNE A,#10,L1
L1: NC L2 ;标志位CY为0则转移指令 ,如果上面A的值没10大的话,cy为1,即不执行这条跳转程序
SETB BUZZER ;意思是如果没到10ms的时候,蜂鸣器不响
SJMP L3
L2: CLR BUZZER ;到100ms(10*10ms)了,蜂鸣器响,可是响的有时间限制
L3: MOV A,INTR_CNT
INC A
MOV INTR_CNT,A
CJNE A,#100,T0_END ;从100ms响到100*10ms,也就是1s,从这看出1s中响了0.9s,不响0.1s
MOV INTR_CNT,#00H
T0_END: POP ACC
POP PSW
RETI
;启动定时器中断
SET_TMR0:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-MS10)
MOV TL0,#LOW(65536-MS10)
CLR TF0
SETB TR0
SETB ET0
SETB EA
RET
END
关键字:蜂鸣器控制 定时器中断『本文转载自网络,版权归原作者所有,如有侵权请联系删除』