;以下 ZDT0 為定時器中斷程序
ZDT0: PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#0D8H
MOV TL0,#0F0H
DJNZ COUNT,EXIT
JB P3.5,NIZHUAN ;查詢方向標志,P3.5 接換向開關 K2
MOV FX,#11H
NIZHUAN:MOV A,FX
CJNE A,#11H,FZ ;若A不等于11,即正轉,則轉移到 FZ
MOV A,R1 ;R1 記錄上一次電機脈沖狀態
MOV P1,A
RR A ;循環右一位
MOV R1,A
MOV P1,A
AJMP RE
FZ: MOV A,R1
MOV P1,A
RL A ;循環左移一位
MOV P1,A
MOV R1,A
RE: MOV A,SPEED
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV COUNT,A ;把轉速級別賦給 COUNT
JB P3.5 ,FFX ;P3.5 接換向開關K2, 即換向位,若P3.5=1,則跳到 FFX
MOV FX,#11H
AJMP EXIT
FFX: MOV FX,#0FEH;只要FX不等于11H,就可以通過循環左移或右移進行換向
EXIT: POP DPL
POP DPH
POP ACC
RETI
;以下 UP 為加速中斷程序
UP: PUSH ACC
ACALL DELAY ;延時防抖
JB P3.2,UPEX ;P3.2 為外部中斷0位,接增速開關S2,低電平有效,若P3.2=1,則退出
MOV A,SPEED
CJNE A,#7,SZ ;最大等級為 7,若 A 不等于 7,則轉移到 SZ
AJMP UPEX ;若 A=7,則退出
SZ: INC SPEED ;SPEED= SPEED+1
UPEX: POP ACC
HERE2: JNB P3.2,HERE2 ;本條指令為防止開關 S2 按下去后彈不起,導致一直產生中斷
RETI
;以下 DOWN 為減速中斷程序
DOWN: PUSH ACC
ACALL DELAY
JB P3.3,DEX ;P3.3 為外部中斷1位,接減速開關S3,低電平有效,P3.3=1則退出
MOV A,SPEED
CJNE A,#0,SJ
AJMP DEX
SJ: DEC SPEED ;SPEED= SPEED-1
DEX: POP ACC
HERE3: JNB P3.3,HERE3
RETI
TAB: DB 0,60,40,35,30,28,25,21 ;經仿真,小于21時,由于脈沖太快,會出現失步 ;
LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
END
評論