; 利用定时器控制产生占空比可变的 PWM 波 *
; 按K1,PWM值增加,则占空比减小,LED 灯渐暗。 *
; 按K2,PWM值减小,则占空比增加,LED 灯渐亮。 *
;当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警 *
;资源:p0口,8路指示灯。p1.0,p1.4亮度控制按键(端口按键)p3.3小喇叭报警 *
;********************************************************************************
;----------------------------
 PWM EQU 7FH ;PWM赋初始值PWM 定义为,7FH
 OUT EQU P0 ;1个LED灯的接口OUT 定义为,P0.1
 INCKEY EQU P1.0 ;K1,PWM值增加键。INCKEY 定义为,P1.4
 DECKEY EQU P1.4 ;K2,PWM值减小键。DECKEY 定义为,P1.5
 BEEP EQU P3.3 ;BEEP 定义为,接口3第3位
;;----------------------------
 ORG 0000H
 SJMP START
 ORG 000BH
 SJMP INTT0
 ORG 001BH
 SJMP INTT1
 ORG 0030H
;----------------------------
;主程序
;定时器0工作在模式1,定时器1工作在模式2。
;----------------------------
START:
 MOV SP,#30H
 MOV TMOD,#21H
 MOV TH1,PWM ;脉宽调节
 MOV TL1,#00H
 MOV TH0,#0FCH ;1ms延时常数
 MOV TL0,#066H ;频率调节
 SETB EA
 SETB ET0
 SETB ET1
 SETB TR0
LOOP: MOV A,PWM ;
 JB INCKEY,LOOP1 ;增加键是否按下?
 CALL DELAY ;延时去抖动
 JB INCKEY,LOOP1
 CJNE A,#0FFH,PWMINC ;是否到最大值?
 CALL BEEP_BL ;是,蜂鸣器报警。
 SJMP LOOP
PWMINC:
 INC PWM ;调节脉宽(脉宽减小)
 SJMP LOOP
LOOP1: JB DECKEY,LOOP2 ;减小键是否按下?
 CALL DELAY ;延时去抖动
 JB DECKEY,LOOP2
 CJNE A,#02H,PWMDEC ;是否到最小值?
 CALL BEEP_BL ;是,蜂鸣器报警。
 SJMP LOOP
PWMDEC:
 DEC PWM ;调节脉宽(脉宽增加)
LOOP2: SJMP LOOP
;------------------------------
;T0中断服务子程序 (频率)
;控制定时器1中断
;------------------------------
INTT0:
 CLR TR1
 MOV TH0,#0FCH ;1ms延时常数
 MOV TL0,#066H ;频率调节
 MOV TH1,PWM
 SETB TR1
 MOV OUT,#00H ;启动输出
 RETI
;------------------------------
;T1中断服务子程序 (脉宽)
;控制PWM脉冲宽度
;------------------------------
INTT1:
 CLR TR1 ;脉宽调节结束
 MOV OUT,#0FFH ;结束输出
 RETI
;------------------------------
;10ms延时子程序
;------------------------------
DELAY:
 MOV R6,#50
DELAY1:
 MOV R7,#100
 DJNZ R7,$
 DJNZ R6,DELAY1
 RET
;-----------------------------------------------
;蜂鸣器响一声子程序
;-----------------------------------------------
BEEP_BL:
 MOV R6,#100
 BL1: CALL BL2
 CPL BEEP
 DJNZ R6,BL1
 MOV R5,#25
 CALL DELAY2
 RET
 BL2: MOV R7,#180
 BL3: NOP
 DJNZ R7,BL3
 RET
DELAY2: ;延时R5×10MS
 MOV R6,#50
 BL4: MOV R7,#100
 BL5: DJNZ R7,BL5
 DJNZ R6,BL4
 DJNZ R5,DELAY2
 RET
;---------------------------------------------------
 END