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&lt;AT89X51.H&gt;
#include&lt;INTRINS.H&gt;
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&lt;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&lt;ls;m++)
{
drive=_crol_(drive,1);
P1=dvive;
delayms(10);
}
}
//副(反轉)
void reverse(void)
{
int m;
for(m=0;m&lt;ls;m++)
{
drive=_cror_(drive,1);45d
P1=dvive;003
delayms(10);
}
}
//副(delay)02
void delayms(int time)
{
int n;
while(time&gt;0)
{
n=120;
while(n&gt;0) n--;
tim-e--;
}
} +
okla!!
參考資料: me - 文Lv 41 0 年前
不如預期 ?! 你預期是怎樣 ? 實際又跑出怎樣 ? 最好說明清楚 !
2009-12-22 11:03:16 補充:
* 程式中還有很多文法錯誤, 編譯應該是不會過
* 角度輸入部份寫法仍有問題, 輸入值應該不會正確
* 方向判定(P3==0xeb)這樣寫也有問題
* 送出脈衝的方式似乎不正確, 但未看到線路, 無法建議
* 送脈衝需做加減速, 未處理
* 裡面用到 除1.8, 可以的話, 用整數, 少用浮點
* 資料型態另有諸多可以改得更有效率, 有機會再說