Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3422|回復: 1
打印 上一主題 下一主題

有人能幫我解答嗎??

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-5-29 21:40:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
總算考完試囉,請問有哪位大大能為我詳細解說下列的程式碼嗎??(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);
}
2#
發表於 2009-6-4 01:10:55 | 只看該作者
本帖最後由 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),若結束則週期歸零
}
輸出末波參考圖如下
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-23 23:54 , Processed in 0.128813 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表