K1 BIT P1.4 ;加速键
K2 BIT P1.5 ;减速键
K3 BIT P1.6 ;正反键
CLK BIT P0.0 ;速度控制信号
ZF BIT P0.1 ;正反控制信号
PWMH EQU 30H ;调宽值,定时器所赋值
PWML EQU 31H
ORG 0000H
LJMP MAIN
ORG 000BH ;中断1控制周期
LJMP TIMER1
ORG 001BH ;中断3控制脉宽
LJMP TIMER2
ORG 0030H
MAIN: MOV PWMH,#00H
MOV PWML,#0FH
MOV TMOD,#11H ;两个定时器都工作在方式1
MOV TH0,#00H ;65.536mm定时
MOV TL0,#00H
MOV TH1,PWMH ;脉宽
MOV TL1,PWML
SETB EA ;CPU允许中断
SETB ET0 ;允许定时器T0中断
SETB ET1 ;允许定时器T1中断
SETB TR0 ;定时器T0计数
CLR CLK
LOOP: JB K3,LOOPZF ;高电平逆时针转,低电平顺时针转
CLR ZF ;针转
LJMP LOOPK1
LOOPZF: SETB ZF
LOOPK1: JB K1,LOOPK2 ;K1按下加速
LCALL DELAY
MOV A,PWML
ADD A,#1 ;调宽值低4位加1
MOV PWML,A
MOV A,PWMH
ADDC A,#0 ;调宽值高4位加1
MOV PWMH,A
JNC LOOPK2 ;最大值时
MOV PWMH,#0FFH
LOOPK2: JB K2,OVER ;K2按下减速
LCALL DELAY
MOV A,PWML
CLR C
SUBB A,#1 ;调宽值低4位减1
MOV PWML,A
MOV A,PWMH
SUBB A,#0 ;调宽值高4位减1
MOV PWMH,A
JNC OVER
MOV PWMH,#00H ;最小值时
OVER: LJMP LOOP
TIMER1: CLR TR1
MOV TH0,#00H
MOV TL0,#00H
MOV TH1,PWMH ;赋调宽值
MOV TL1,PWML
SETB TR1
CLR CLK
RETI
TIMER2: CLR TR1
SETB CLK
RETI
DELAY: MOV R4,#10H
D1: DJNZ R4,D1
RET
END
|