我現在要利用8051控制步進馬達(1.8度)做實驗
我希望步進馬達可以每走10步停5秒在走10步停5秒
直到50步(90度)停止再反轉
現在我只能讓步進馬達從0步直接走到50步在反轉直接到0度
;============================
;程式檔名: P12-1.asm
;============================
;== 主程式 ==
;============================
MotorBuffer equ 30h
org 0
jmp Reset
Reset: mov sp,#6fh
mov MotorBuffer,#11101110b; 1 相激磁方式
Start:
mov r3,#50 ;50步 (1.8度*50=90度)
;============================
;== 步進馬達正轉副程式 ==
;============================
Forward:
mov a,MotorBuffer ;
rl a ;產生正轉的激磁時相脈衝
mov MotorBuffer,a ;並由p1輸出
mov p1,a ;
mov r7,#100 ;每走一步,停100ms
call Delay_10ms ;
djnz r3,Forward ;繼續走完50步
mov r7,#200 ;休息2秒鐘
call Delay_10ms
mov r3,#50 ;設定反轉50步(1/4圈)
;============================
;== 步進馬達反轉副程式 ==
;============================
Reverse:
mov a,MotorBuffer ;
rr a ;產生反轉時序脈衝
mov MotorBuffer,a ;並由p1輸出
mov p1,a ;
mov r7,#100 ;每走一步,停100ms
call Delay_10ms ;
djnz r3,Reverse ;繼續走完50步
mov r7,#200 ;休息2秒鐘
call Delay_10ms
jmp Start ;重頭重複執行程式
;=============================
;== 延時副程式 ==
;=============================
;每呼叫本副程式一次,可延時(r7)*10ms
;採用計時器0(Timer0)的 Mode1
Delay_10ms:
mov tmod,#00000001b ;
mov tl0,#<(2^16-10000).mod.32;
mov th0,#>(2^16-10000)/32 ;
setb tr0 ;啟動計時器,開始計時
Timer_Wait:
jbc tf0,Timer_Ok ;
jmp Timer_Wait ;若未計時完(tf0=0)則跳回Timer_Wait,繼續檢查
Timer_Ok:
djnz r7,Delay_10ms ;讓Timer0執行計時10ms工作(r7)次
clr tr0 ;停止計時工作.
ret ;
.end ;程式結束
要怎樣改程式碼才能達到我要的動作
本話題由
藍威政
於2012-04-10 07:55:32 發表
目前尚未有會員回覆...
|