Скласти програму керування кроковим двигуном. Режим роботи двигуна визначається натисканням кнопок першого рядка клавіатури (наприклад, перша кнопка – пуск/стоп, друга – реверс, третя – збільшення швидкості обертання, четверта – зменшення).
Алгоритм роботи драйвера:
Рисунок 7.2 – Алгоритм основного циклу програми керування кроковим двигуном (обробка переривання таймера 0)
sbit F1 = 0xD1 //Declare flag F1
DAT equ R0 //Data transfer register
ADDR equ R1 //Address transfer register
ST_CNT equ R2 //Steps counter
PS_CNT equ R3 //step to step pause
V_cnt equ R4
Flags_a equ 0x004
C_TL0 EQU 0FFh
C_TH0 EQU 00Ah //07FFh - max stab. vel. of rotation
SM_addr EQU 009h //Step motor address
Step_11 EQU 000000001b
Step_12 EQU 000000100b
Step_13 EQU 000000010b
Step_14 EQU 000001000b
Step_21 EQU 000000101b
Step_22 EQU 000000110b
Step_23 EQU 000001010b
Step_24 EQU 000001001b
Pause EQU 003h
ORG 0x0000
JMP RESET
ORG 0x000B
JMP Tim0_ovf
ORG 0x0030
RESET:
MOV ST_CNT, #001h //Step 1
MOV PS_CNT, #Pause //pause...
MOV V_cnt, #Pause //program flags
MOV DAT, #0FFh
MOV ADDR,#007h
CALL write
MOV DAT, #000h
MOV ADDR,#SM_addr
CALL write
CALL Timer0_init
wait:
JMP wait
Timer0_init:
MOV TH0, #C_TH0 //1,0XX ms
MOV TL0, #C_TL0
MOV TMOD,#001h
MOV TCON, #010h //Run timer
MOV IE, #010000010b
//Enable global interrupt and Timer0 interrupt
MOV IP, #000000000b
//interrupt priority
RET
;**********************************
; Step subroutine
Tim0_ovf:
MOV TH0, #C_TH0 //1,0XX ms
MOV TL0, #C_TL0 //Reload timer 0
CALL Read_row1
MOV A, DAT
JB ACC.4, RUN
JB ACC.5, Revers
JB ACC.6, V_inc
JB ACC.7, V_dec
JMP M_CNTRL
RUN: //starting and feet by turns
CPL F0
JMP M_CNTRL
Revers:
JMP M_CNTRL
V_inc:
INC V_cnt
CJNE V_cnt, #000h, M_CNTRL
DEC V_cnt
JMP M_CNTRL
V_dec:
DEC V_cnt
MOV A, V_cnt
SUBB A, #003h
JNC M_CNTRL
MOV V_cnt, #003h
JMP M_CNTRL
M_CNTRL:
DEC PS_CNT //decrement step to step pause counter
CJNE PS_CNT, #000h, E_T0_ovf
// exit from interrupt
// if pause is full
MOV A, V_cnt
MOV PS_CNT, A //reload step to step pause counter
JNB F0, E_T0_ovf
step1:
CJNE ST_CNT, #001h, step2
MOV DAT, #Step_11
MOV ADDR,#SM_addr
CALL Write
MOV ST_CNT, #002h
RETI
step2:
CJNE ST_CNT, #002h, step3
MOV DAT, #Step_12
MOV ADDR,#SM_addr
CALL Write
MOV ST_CNT, #003h
RETI
step3:
CJNE ST_CNT, #003h, step4
MOV DAT, #Step_13
MOV ADDR,#SM_addr
CALL Write
MOV ST_CNT, #004h
RETI
step4:
CJNE ST_CNT, #004h, step1
MOV DAT, #Step_14
MOV ADDR,#SM_addr
CALL Write
MOV ST_CNT, #001h
RETI
E_T0_ovf:
// mov zero to step motor latch
MOV DAT, #000h
MOV ADDR, #SM_addr
CALL write
RETI
;*********************************
Read_row1:
MOV P1, #000h
MOV P2, #000010000b
NOP
NOP
MOV A, P1
ANL A, #0F0h
MOV Dat, A
//Check old-push button
JB F1, RR1
CJNE DAT, #000h, RR2
JMP RRend
RR1:
CJNE DAT, #000h, RR3
CLR F1
JMP RRend
RR2:
SETB F1
JMP RRend
RR3:
MOV DAT, #000h
JMP RRend
RRend:
RET
write: setb P3.6
mov P0, DAT //moving data to bus buffer
mov P2, ADDR //set periferals address
nop
nop
mov P2,#000h //clock
Ret
END