利用定时器控制产生占空比可变的 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
DJN Z R7,$
DJN Z R6,DELAY1
RET