發問時間: 電腦與網際網路程式設計 · 1 0 年前

Keil Cx51步進馬達控制程式問題??

我希望用89s51搭配矩陣鍵盤控制步進馬達可程式不如預期的作動

請各位大大幫我看看程式有什麼問題?

電路說明

89s51 P1 接步進馬達

P3 接矩陣鍵盤

動作需求

在矩陣鍵盤上輸入任意3位數字 步進馬達旋轉該數字之角度

Keil程式

#include<AT89X51.H>

#include<INTRINS.H>

void forward(void);

void reverse(void);

void delayms(int time);

int keypad(void);

int stag(void);

int keys[3];

int ls

int b

int drive;

//主程式

main()

{

int x;

for(x=0;x<3;x++)

{

keys[x]=keypad( );

}

ls=stag();//角度轉換步數

drive=0xcc//馬達機磁碼(二相機磁)

if(P3==0xeb) //正反轉判定

{

reverse();

}

forward();

}

//副(鍵盤掃描)

int keypad(void)

{

int key=0xff;

P3=0x7f;

If(P3_3==0) key=7;

If(P3_2==0) key=8;

If(P3_1==0) key=9;

P3=0xbf;

If(P3_3==0) key=4;

If(P3_2==0) key=5;

If(P3_1==0) key=6;

P3=0xdf;

If(P3_3==0) key=1;

If(P3_2==0) key=2;

If(P3_1==0) key=3;

P3=0xef;

If(P3_3==0) key=0;

return(key)

}

//副(角度轉步數)

int stag(void)

{

int la;

la=keys[1]*100+keys[2]*10+keys[3];

return(la/1.8)

}

//副(正轉)

int forward(void)

{

int m;

for(m=0;m<ls;m++)

{

drive=_crol_(drive,1);

P1=dvive;

delayms(10);

}

}

//副(反轉)

void reverse(void)

{

int m;

for(m=0;m<ls;m++)

{

drive=_cror_(drive,1);

P1=dvive;

delayms(10);

}

}

//副(delay)

void delayms(int time)

{

int n;

while(time>0)

{

n=120;

while(n>0) n--;

time--;

}

}

已更新項目:

預期是希望輸入+-號與角度後 馬達就旋轉該角度(以三位數為主)

目前我的程式 是完全不會做動

2 個解答

評分
  • 1 0 年前
    最佳解答

    #include<AT89X51.H>

    #include<INTRINS.H>

    void forward(void);

    void reverse(void);

    void delayms(int time);

    int keypad(void);

    int stag(void);

    int keys[3];

    int ls

    int b

    int drive;

    //主程式

    main()

    {

    int x;

    for(x=0;x<3;x++)

    {

    keys[x]=keypad( );

    }

    ls=stag();//角度轉換步數

    drive=0xcc//馬達機磁碼(二相機磁)

    if(P3==0xeb) //正反轉判定

    {

    reverse();

    }

    forward();

    }

    //副(鍵盤掃描)

    int keypad(void)

    {

    int key=0xff;

    P3=0x7f;

    If(P3_3==0) key=7;

    If(P3_2==0) key=8;

    If(P3_1==0) key=9;

    P3=0xbf;

    If(P3_3==0) key=4;

    If(P3_2==0) key=5;

    If(P3_1==0) key=6;

    P3=0xdf;

    If(P3_3==0) key=1;

    If(P3_2==0) key=2;

    If(P3_1==0) key=3;

    P3=0xef;

    If(P3_3==0) key=0;

    return(key)

    }

    //副(角度轉步數)

    int stag(void)

    {

    int la;

    la=keys[1]*100+keys[2]*10+keys[3];

    return(la/1.8)

    }

    //副(正轉)

    int forward(void)

    {

    int m;

    for(m=0;m<ls;m++)

    {

    drive=_crol_(drive,1);

    P1=dvive;

    delayms(10);

    }

    }

    //副(反轉)

    void reverse(void)

    {

    int m;

    for(m=0;m<ls;m++)

    {

    drive=_cror_(drive,1);45d

    P1=dvive;003

    delayms(10);

    }

    }

    //副(delay)02

    void delayms(int time)

    {

    int n;

    while(time>0)

    {

    n=120;

    while(n>0) n--;

    tim-e--;

    }

    } +

    okla!!

    參考資料: me
  • Lv 4
    1 0 年前

    不如預期 ?! 你預期是怎樣 ? 實際又跑出怎樣 ? 最好說明清楚 !

    2009-12-22 11:03:16 補充:

    * 程式中還有很多文法錯誤, 編譯應該是不會過

    * 角度輸入部份寫法仍有問題, 輸入值應該不會正確

    * 方向判定(P3==0xeb)這樣寫也有問題

    * 送出脈衝的方式似乎不正確, 但未看到線路, 無法建議

    * 送脈衝需做加減速, 未處理

    * 裡面用到 除1.8, 可以的話, 用整數, 少用浮點

    * 資料型態另有諸多可以改得更有效率, 有機會再說

還有問題?馬上發問,尋求解答。