下面程序完成的主要功能:實(shí)現(xiàn)步進(jìn)電機(jī)的正反轉(zhuǎn),加速、減速;顯示電機(jī)轉(zhuǎn)速(轉(zhuǎn)速級(jí)別)和工作狀態(tài)(正轉(zhuǎn)、反轉(zhuǎn)、不轉(zhuǎn))。
源程序
SPEED EQU 10H ;SPEED為轉(zhuǎn)速等級(jí)標(biāo)志,共7級(jí),即1~7
FX EQU 11H ;FX 為方向標(biāo)志
COUNT EQU 12H ;COUNT中斷次數(shù)標(biāo)志
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中斷0入口地址,加速子程序
AJMP UP
ORG 0013H ;外部中斷1入口地址,減速子程序
AJMP DOWN
ORG 000BH ;定時(shí)器0中斷入口地址,控制中斷次數(shù)來(lái)達(dá)到控制轉(zhuǎn)速 AJMP ZDT0
ORG 0030H
MAIN: MOV SP,#60H
MOV TMOD,#01H ;工作于定時(shí)、軟件置位啟動(dòng),模式1(16 位計(jì)時(shí)器)
MOV TH0,#0CFH
MOV TL0,#2CH
MOV COUNT,#01H
SETB ET0 ;定時(shí)/計(jì)數(shù)器允許中斷
CLR IT0 ;外部中斷為電平觸發(fā)方式,低電平有效
CLR IT1
SETB EX0 ;外部允許中斷
SETB EX1
SETB EA ;開(kāi)總中斷
MOV R1,#11H ;四相單四拍運(yùn)行,共陽(yáng)數(shù)碼管方向顯示8,速度值顯示0
MOV SPEED,#00H
MOV FX,#00H
XIANS: MOV A,SPEED
MOV DPTR,#LED
MOVC A,@A+DPTR ;查表獲取等級(jí)對(duì)應(yīng)數(shù)碼管代碼
MOV P2,A ;第二個(gè)數(shù)碼管顯示轉(zhuǎn)速等級(jí)
MOV A,F(xiàn)X ;準(zhǔn)備判斷轉(zhuǎn)向
CJNE A,#11H,ELS
MOV P0, #0F9H ;第一個(gè)數(shù)碼管顯示 1,表示正轉(zhuǎn)
AJMP QD
ELS: CJNE A,#00H,ZHENG
MOV P0,#0C0H ;第一個(gè)數(shù)碼管顯示 0,表示不轉(zhuǎn)
AJMP QD
ZHENG: MOV P0,#0BFH ;第一個(gè)數(shù)碼管顯示-,表示反轉(zhuǎn)
QD: JB P3.4,DD ;P3.4 接啟動(dòng)開(kāi)關(guān) K1,P3.4=1 時(shí)啟動(dòng)
CLR TR0 ;停止定時(shí)/計(jì)數(shù)器
MOV P0,#0C0H ;第一個(gè)數(shù)碼管顯示 0,表示不轉(zhuǎn)
MOV P2,#0C0H ;第二個(gè)數(shù)碼管顯示 0,表示轉(zhuǎn)速為 0
MOV SPEED,#00H ;重新賦初值
MOV FX,#00H
AJMP QD
DD: MOV A,SPEED
JNZ GO ;A 不等于 0,即初始速度不為零,則轉(zhuǎn)移到 GO
CLR TR0 ;停止定時(shí)/計(jì)數(shù)器
AJMP QD
GO: SETB TR0 ;開(kāi)啟定時(shí)/計(jì)數(shù)器
ACALL DELAY
AJMP XIANS
DELAY: MOV R6,#10 ;延時(shí)子程序
DEL1: MOV R7,#250
HERE1: DJNZ R7, HERE1
DJNZ R6,DEL1
RET
;以下 ZDT0 為定時(shí)器中斷程序
ZDT0: PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#0D8H
MOV TL0,#0F0H
DJNZ COUNT,EXIT
JB P3.5,NIZHUAN ;查詢方向標(biāo)志,P3.5 接換向開(kāi)關(guān) K2
MOV FX,#11H
NIZHUAN:MOV A,F(xiàn)X
CJNE A,#11H,F(xiàn)Z ;若A不等于11,即正轉(zhuǎn),則轉(zhuǎn)移到 FZ
MOV A,R1 ;R1 記錄上一次電機(jī)脈沖狀態(tài)
MOV P1,A
RR A ;循環(huán)右一位
MOV R1,A
MOV P1,A
AJMP RE
FZ: MOV A,R1
MOV P1,A
RL A ;循環(huán)左移一位
MOV P1,A
MOV R1,A
RE: MOV A,SPEED
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV COUNT,A ;把轉(zhuǎn)速級(jí)別賦給 COUNT
JB P3.5 ,F(xiàn)FX ;P3.5 接換向開(kāi)關(guān)K2, 即換向位,若P3.5=1,則跳到 FFX
MOV FX,#11H
AJMP EXIT
FFX: MOV FX,#0FEH;只要FX不等于11H,就可以通過(guò)循環(huán)左移或右移進(jìn)行換向
EXIT: POP DPL
POP DPH
POP ACC
RETI
;以下 UP 為加速中斷程序
UP: PUSH ACC
ACALL DELAY ;延時(shí)防抖
JB P3.2,UPEX ;P3.2 為外部中斷0位,接增速開(kāi)關(guān)S2,低電平有效,若P3.2=1,則退出
MOV A,SPEED
CJNE A,#7,SZ ;最大等級(jí)為 7,若 A 不等于 7,則轉(zhuǎn)移到 SZ
AJMP UPEX ;若 A=7,則退出
SZ: INC SPEED ;SPEED= SPEED+1
UPEX: POP ACC
HERE2: JNB P3.2,HERE2 ;本條指令為防止開(kāi)關(guān) S2 按下去后彈不起,導(dǎo)致一直產(chǎn)生中斷
RETI
;以下 DOWN 為減速中斷程序
DOWN: PUSH ACC
ACALL DELAY
JB P3.3,DEX ;P3.3 為外部中斷1位,接減速開(kāi)關(guān)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 ;經(jīng)仿真,小于21時(shí),由于脈沖太快,會(huì)出現(xiàn)失步 ;
LED: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,98H
END
評(píng)論