Robofun 機器人論壇
標題:
有人能幫我解答嗎??
[打印本頁]
作者:
batinsect
時間:
2009-5-29 21:40
標題:
有人能幫我解答嗎??
總算考完試囉,請問有哪位大大能為我詳細解說下列的程式碼嗎??(lungman大大寫的)
我只看的懂一些
#include <AT89X51.h>
int count=0;
int nopu=0;
int mo[8];
int a;
int outP2=0x01;
//計時中斷 每隔0.1ms中斷一次 產生20ms脈波
void T0_int(void)interrupt 1
{
TL0=(8192-85)%32;
TH0=(8192-85)/32;
if (count==0) { nopu=0; a=mo[0]; outP2=0x01; }
if (nopu < 4)
{
if (a > 0)
{
P2=outP2;
a--;
}
else
{
nopu++;
outP2<<=1;
a=mo[nopu];
}
}
else
P2=0;
count++;
if ( count==200 ) count=0;
}
//延時副程式
void delay(int g)
{
int i,j;
for (i=0; i<g; i++)
{
for (j=0; j<1000; j++);
}
}
void main()
{
int i;
P2=0x00;
delay(100);
TMOD=0x00;
TL0=(8192-85)%32;
TH0=(8192-85)/32;
IE=0x82;
TR0=1;
//控制伺服馬達
do
{ for (i=0; i < 3; i++) //前進2步半 3次
{
mo[0]=14; mo[1]=14; mo[2]=14; mo[3]=14;//腳位歸零
delay(100);
mo[0]=12; mo[1]=13; mo[2]=14; mo[3]=14;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=13; mo[3]=13;//前跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=13; mo[3]=13;//放左腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=13; mo[3]=13;//抬右腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=15; mo[3]=15;//前跨左腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=15; mo[3]=15;//放右腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=15; mo[3]=15;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=13; mo[3]=13;//前跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=13; mo[3]=13;//放左腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=13; mo[3]=13;//抬右腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=15; mo[3]=15;//前跨左腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=15; mo[3]=15;//放右腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=15; mo[3]=15;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=14; mo[3]=14;//跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=14; mo[3]=14;//放左腳
delay(100);
}
for (i=0; i < 2; i++) //後退2步半 2次
{
mo[0]=14; mo[1]=14; mo[2]=14; mo[3]=14;
delay(100);
mo[0]=12; mo[1]=13; mo[2]=14; mo[3]=14;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=15; mo[3]=15;//後跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=15; mo[3]=15;//放左腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=15; mo[3]=15;//抬右腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=13; mo[3]=13;//後跨左腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=13; mo[3]=13;//放右腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=13; mo[3]=13;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=15; mo[3]=15;//後跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=15; mo[3]=15;//放左腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=15; mo[3]=15;//抬右腳
delay(100);
mo[0]=15; mo[1]=16; mo[2]=13; mo[3]=13;//後跨左腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=13; mo[3]=13;//放右腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=13; mo[3]=13;//抬左腳
delay(100);
mo[0]=12; mo[1]=13; mo[2]=14; mo[3]=14;//後跨右腳
delay(100);
mo[0]=14; mo[1]=14; mo[2]=14; mo[3]=14;//放左腳
delay(100);
}
}
while(1);
}
作者:
lungman
時間:
2009-6-4 01:10
本帖最後由 lungman 於 2009-6-4 01:20 編輯
中斷程式的說明,希望有幫助
void T0_int(void)interrupt 1//計時0中斷
{
if (count==0) { nopu=0; a=mo[0]; outP2=0x01; }//週期起始,所有參數歸零
if (nopu < 4) //判斷所有伺服馬達輸出脈波是否結束,只有4個馬達(未結束)
{
if (a > 0) //判斷單一伺服馬達輸出脈波是否結束(未結束)
{
P2=outP2; //輸出脈波
a--; //單一伺服馬達輸出脈波寬度數值減1
}
else //判斷單一伺服馬達輸出脈波是否結束(已結束)
{
nopu++; //換下一個伺服馬達輸出脈波
outP2<<=1; //P2左移1個Bit
a=mo[nopu];//存入下一個伺服馬達的脈波資料
}
}
else //判斷所有伺服馬達輸出脈波是否結束(已結束)
P2=0; //輸出歸零
count++; //週期加1
if ( count==200 ) count=0; //判斷週期是否結束(已達20ms),若結束則週期歸零
}
輸出末波參考圖如下
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2