Robofun 機器人論壇

標題: 機器蟲程式出問題 麻煩各位了 謝謝 [打印本頁]

作者: DONNIE    時間: 2008-8-19 17:32
標題: 機器蟲程式出問題 麻煩各位了 謝謝
趁著暑假想做一台機器蟲,便開始買書研究研究
想說等完成後把所有的成品細節一一報上
讓和我一樣剛玩又碰壁的人一個很好的參考資料
但現在我的程式跑不出來.希望各位大大多幫我這個入門者      

以下程式是:<機器人單晶片為電腦控制> 這本書.      範例程式  SERVO3   (書上 P 5-16頁)
我嘗試增加功能.功能如下:
80S51接腳定義:
                            P0.0        ;伺服馬達狀態1的遙控鈕
                            P0.1        ;伺服馬達狀態2的遙控鈕
                            P0.2        ;伺服馬達狀態3的遙控鈕
                            P0.3        ;伺服馬達狀態4的遙控鈕
                            P2.0        ;伺服馬達控制PWM輸出
分別4個開關.當按下不同開關會如程式內所定義的狀態輸出
燒入晶片後無法如預期方式工作.伺服馬達會出現一下左一下右的狀況


完整程式如下:


       ORG   0000H
        JMP     START   
;=============================
;計時/計數器0中斷副程式
;=============================
        ORG     000BH
TIMER0:
        PUSH    ACC                  ;將ACC暫存器之資料放置於堆疊區
        CLR     TF0                    ;將TF0中斷要求先清除
        MOV     TH0,#0FFH       ;手動載入TH0及TL0的值
        MOV     TL0,#64H          ;
        INC        R0                     ;中斷一次就把R0加1
CYCLE:      
        CJNE    R0,#200,SERVO1  ;判斷R0是否為200,不是,則跳至SERVO1執行
        MOV     R0,#0
        SETB    P2.0
        JMP      GOBACK
SERVO1:
        MOV     A,R0              
        XRL     A,R1                  ;判斷R0是否等於R1
        JNZ     GOBACK           ;若R0不等於R1,
        CLR     P2.0
GOBACK:
        POP     ACC                  ;將ACC暫存器之資料從堆疊區取回
        RETI
;===============================
;           主程式
;===============================
START:  
        MOV     R1,#15
        MOV     TMOD,#00000001B ;設定計時計數器0工作於計時模式1,如圖  所示.
        MOV     TH0,#0FFH              ;設定0.1ms中斷一次
        MOV     TL0,#64H
        SETB    EA                            ;中斷致能(打開中斷總開關)
        SETB    ET0             ;計時/計數器0的中斷致能
        SETB    TR0             ;計時/計數器0開始工作

LOOP:
        JNB     P0.0,B1         ;伺服馬達狀態1的遙控鈕
        JNB     P0.1,B2         ;伺服馬達狀態2的遙控鈕
        JNB     P0.2,B3         ;伺服馬達狀態3的遙控鈕
        JNB     P0.3,B4         ;伺服馬達狀態4的遙控鈕
        JMP     LOOP           ;再重覆回頭感測

B1:                                 ;伺服馬達狀態1
        MOV R1,#12
        CALL DELAY
        JMP     LOOP
B2:                                 ;伺服馬達狀態2
        MOV R1,#14
        CALL DELAY
        JMP     LOOP
B3:                                 ;伺服馬達狀態3
        MOV R1,#16
        CALL DELAY
        JMP     LOOP
B4:                                 ;伺服馬達狀態4
        MOV R1,#18
        CALL    DELAY
        JMP     LOOP      
;=========================
;延時副程式(延時1秒)
;=========================
DELAY:MOV     R5,#10       ;重複15次
DL1:    MOV     R6,#250         ;
DL2:    MOV     R7,#200
DL3:    DJNZ    R7,DL3
           DJNZ    R6,DL2
           DJNZ    R5,DL1
           RET
           END


麻煩各位了  謝謝

33.txt

1.98 KB, 下載次數: 808

主程式


作者: DONNIE    時間: 2008-8-20 11:31
今天一早起來不死心  突然想到   便試試   結果成功
START:  
        MOV     R1,#15


改成
START:  
        MOV     P0,#0      
        MOV     R1,#15

給和我一樣的新手參考

完整程式:
                 ORG 0000H
                 JMP     START   
;=============================
;計時/計數器0中斷副程式
;=============================
                 ORG     000BH
TIMER0:
                 PUSH    ACC             ;將ACC暫存器之資料放置於堆疊區
                 CLR     TF0             ;將TF0中斷要求先清除
                 MOV     TH0,#0FFH       ;手動載入TH0及TL0的值
                 MOV     TL0,#64H        ;
                 INC     R0              ;中斷一次就把R0加1
CYCLE:    CJNE    R0,#200,SERVO1  ;判斷R0是否為200,不是,則跳至SERVO1執行
                 MOV     R0,#0
                 SETB    P2.0
                 JMP     GOBACK
SERVO1:  MOV     A,R0              
                 XRL     A,R1            ;判斷R0是否等於R1
                 JNZ     GOBACK          ;若R0不等於R1,
                 CLR     P2.0
GOBACK: POP     ACC             ;將ACC暫存器之資料從堆疊區取回
                 RETI
;===============================
;           主程式
;===============================
            
START:
        MOV     P0,#0
        MOV     R1,#15  
        MOV     TMOD,#00000001B ;設定計時計數器0工作於計時模式1,如圖  所示.
        MOV     TH0,#0FFH       ;設定0.1ms中斷一次
        MOV     TL0,#64H
        SETB    EA              ;中斷致能(打開中斷總開關)
        SETB    ET0             ;計時/計數器0的中斷致能
        SETB    TR0             ;計時/計數器0開始工作
LOOP:   
        JB        P0.0,B1         ;第1種狀態的遙控鈕
        JB        P0.1,B2         ;第2種狀態的遙控鈕
        JB        P0.2,B3         ;第3種狀態的遙控鈕
        JB        P0.3,B4         ;第4種狀態的遙控鈕
        JMP     LOOP            ;再重覆回頭感測

B1:                             
;-------第1種狀態-----------------------------------------
        MOV R1,#15   
        CALL DELAY


        MOV R1,#18
        CALL DELAY
   
        MOV R1,#15
        CALL DELAY
;---------------------------------------------------------
     
        JB        P0.1,B2         ;第2種狀態的遙控鈕
        JB        P0.2,B3         ;第3種狀態的遙控鈕
        JB        P0.3,B4         ;第4種狀態的遙控鈕
        JMP     LOOP
B2:     
;-------第2種狀態-----------------------------------------
        MOV R1,#15   ;更改此數字    即可改變伺服馬達角度  15為正中央
        CALL DELAY
   
        MOV R1,#12
        CALL DELAY
     
        MOV R1,#15
        CALL DELAY
;---------------------------------------------------------

        JB        P0.0,B1         ;第1種狀態的遙控鈕
        JB        P0.2,B3         ;第3種狀態的遙控鈕
        JB        P0.3,B4         ;第4種狀態的遙控鈕
        JMP     LOOP
B3:   
;-------第3種狀態-----------------------------------------
        MOV R1,#15
        CALL DELAY

        MOV R1,#16
        CALL DELAY
   
        MOV R1,#17
        CALL DELAY
;---------------------------------------------------------

        JB        P0.0,B1         ;第1種狀態的遙控鈕
        JB        P0.1,B2         ;第2種狀態的遙控鈕
        JB        P0.3,B4         ;第4種狀態的遙控鈕
        JMP     LOOP
B4:   
;-------第4種狀態-----------------------------------------
        MOV R1,#15
        CALL DELAY
     
        MOV R1,#14
        CALL DELAY

        MOV R1,#13
        CALL DELAY
;---------------------------------------------------------

        JB        P0.0,B1         ;第1種狀態的遙控鈕
        JB        P0.1,B2         ;第2種狀態的遙控鈕
        JB        P0.2,B3         ;第3種狀態的遙控鈕
        JMP     LOOP  
;=========================
;延時副程式(延時1秒)
;=========================
DELAY:  MOV     R5,#02          ;重複次數  (數字越小  伺服馬達動作越快)原程式為15(時間為一秒)
              DL1:     MOV     R6,#250         ;
              DL2:     MOV     R7,#200
              DL3:     DJNZ    R7,DL3
              DJNZ    R6,DL2
              DJNZ    R5,DL1
              RET
              END

33.txt

3.47 KB, 下載次數: 773

主程式


作者: uucww    時間: 2008-8-20 13:17
DONNIE大大.....謝謝您給我機會學習組合語言!!感恩 !!




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2