;目的:掌握蜂鳴器的控制程序
;程序名字:蜂鳴器
;這是一個非常好的一個控制蜂鳴器的程序,用到了定時器中斷方式來定時,且弄能夠用程序狀態(tài)字中的CY標志位來進行運算,
;并且用到了CJNE中的比的不夠CY為1,比大的話,為0來進行運算,使程序更加豐富
INTR_CNT EQU 30H ;作為定時器中斷的計數(shù)值使用 MS10 EQU 9217 ; 對于11.0592的晶振來說,相當于10ms的計數(shù)
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 ;
;定時器中斷處理函數(shù)
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,即不執(zhí)行這條跳轉程序
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
|