找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1879|回復: 0
打印 上一主題 下一主題
收起左側

四腳蜘蛛機器人代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:891812 發(fā)表于 2021-4-11 17:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "reg51.h"
#define uint8        unsigned char   
#define uint16        unsigned short int
#define uint32        unsigned long

sbit SERVO0=P2^0;                        //控制舵機的PWM輸出口
sbit SERVO1=P2^1;
sbit SERVO2=P2^2;
sbit SERVO3=P2^3;
sbit SERVO4=P2^4;
sbit SERVO5=P2^5;
sbit SERVO6=P2^6;
sbit SERVO7=P2^7;

uint16 Servo0PwmDuty=1500;        //PWM脈沖寬度
uint16 Servo1PwmDuty=1500;
uint16 Servo2PwmDuty=1500;
uint16 Servo3PwmDuty=1500;
uint16 Servo4PwmDuty=1500;
uint16 Servo5PwmDuty=1500;
uint16 Servo6PwmDuty=1500;
uint16 Servo7PwmDuty=1500;
uint16 k=0;
uint16 g=0;
uint16 h=0;
uint16 t=0;


void DelayMs(uint16 ms)     //延時ms毫秒
{
        uint16 i,j;
        for(i=0;i<85;i++)                //89單片機用85,12系列單片機用800
                for(j=0;j<ms;j++);
}


void InitTimer0(void)   //時鐘0初始化
{
        TMOD &= 0xF0;                //設置定時器模式
        TMOD |= 0x01;                //設置定時器模式
        TL0 = 0x00;                        //設置定時初值
        TH0 = 0x00;                        //設置定時初值
        TF0 = 0;                        //清除TF0標志
        TR0 = 1;                        //定時器0開始計時
        ET0 = 1;                        //開定時器0中斷
}
/***********************************************************
* 名    稱:Timer0Value(uint16 pwm)  
* 功    能:給定時器0計數(shù)器賦值產生定時中斷
* 入口參數(shù):pwm                控制舵機的PWM脈沖寬度值(范圍:500~2500)
* 出口參數(shù):無
* 說    明:12M晶振,12分頻,所以計數(shù)器每遞增一個數(shù)就是1微秒,完全滿足舵機控制的精度要求
                        因為定時器是TH0,TL0都要全部計數(shù)到0xFF后在計1個數(shù)就會產生中斷,所以要想產生
                        pwm毫秒的中斷,那么TH0,TL0就應該賦值(0xFFFF-pwm)        從這個值開始計數(shù)產生定時中斷                                          
/**********************************************************/
void Timer0Value(uint16 pwm)
{
        uint16 value;
        value=0xffff-pwm;      
        TR0 = 0;
        TL0=value;                        //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認將16位數(shù)據(jù)的低八位直接賦給八位數(shù)據(jù)
    TH0=value>>8;                //將16位數(shù)據(jù)右移8位,也就是將高8位移到低八位,再賦值給8位數(shù)據(jù)      
        TR0 = 1;
}




void up()
{
    if(h==0)
    {
        Servo0PwmDuty=1500;        //0
        Servo1PwmDuty=1500;
        Servo2PwmDuty=1500;
        Servo3PwmDuty=1500;
        Servo4PwmDuty=1500;
        Servo5PwmDuty=1500;
        Servo6PwmDuty=1500;
        Servo7PwmDuty=1500;   
        DelayMs(1000);
        h++;
//        Servo0PwmDuty = 1750;      
//        Servo1PwmDuty = 1750;      
//        Servo2PwmDuty = 1750;   
//        Servo3PwmDuty = 1750;     
//        DelayMs(1000);
   
//        Servo0PwmDuty = 2000;       //45
//        Servo1PwmDuty = 2000;      
//        Servo2PwmDuty = 2000;   
//        Servo3PwmDuty = 2000;     
//        DelayMs(1000);


//        Servo0PwmDuty = 2250;      
//        Servo1PwmDuty = 2250;      
//        Servo2PwmDuty = 2250;   
//        Servo3PwmDuty = 2250;     
//        DelayMs(1000);
   
//        Servo0PwmDuty = 2500;       //90
//        Servo1PwmDuty = 2500;      
//        Servo2PwmDuty = 2500;   
//        Servo3PwmDuty = 2500;     
//        DelayMs(1000);
    }
}


void go()
{      
         {  
        Servo0PwmDuty = 1500;                // 右前腳 1700——1200 ;右前腿 1200——1700              自己改參數(shù)
                DelayMs(300);                        // 延時0.5秒


                Servo1PwmDuty = 1500;
                DelayMs(300);


                Servo0PwmDuty = 1400;            // 脈沖寬度在1000微秒
                DelayMs(300);
      
                Servo1PwmDuty = 2000;
                DelayMs(300);                        
     }


         {  
        Servo4PwmDuty = 1500;                // 左后腳 1700——1200 ;左后腿 1200——1700              自己改參數(shù)
                DelayMs(300);                        // 延時0.5秒


                Servo5PwmDuty = 1500;
                DelayMs(300);


                Servo4PwmDuty = 1700;            // 脈沖寬度在1000微秒,對應-45°
                DelayMs(300);
      
                Servo5PwmDuty = 2000;
                DelayMs(300);                        
     }


         {      
        Servo2PwmDuty = 1500;                // 左前腳 1700——1200 ;右前腿 1200——1700
                DelayMs(300);                //延時0.5秒


                Servo3PwmDuty = 1500;
                DelayMs(300);


                Servo2PwmDuty = 1300;        //脈沖寬度在1000微秒,對應-45°
                DelayMs(300);
      
                Servo3PwmDuty = 1000;
                DelayMs(300);                  
     }


         {      
        Servo6PwmDuty = 1500;                // 右后腳 1700——1200 ;左后腿 1200——1700
                DelayMs(300);                //延時0.5秒


                Servo7PwmDuty = 1500;
                DelayMs(300);


                Servo6PwmDuty = 1700;        //脈沖寬度在1000微秒,對應-45°
                DelayMs(300);
      
                Servo7PwmDuty = 2000;
                DelayMs(300);                  
     }
            
        Servo0PwmDuty=1500;
        Servo1PwmDuty=1500;
        Servo2PwmDuty=1500;
        Servo3PwmDuty=1500;
        Servo4PwmDuty=1500;
        Servo5PwmDuty=1500;
        Servo6PwmDuty=1500;
        Servo7PwmDuty=1500;
        
}


void right()
{
{      Servo0PwmDuty = 1000;                // 左前腳 1700——1200 ;左前腿 1200——1700              自己改參數(shù)
                DelayMs(200);                //延時0.5秒


                Servo1PwmDuty = 1500;
                DelayMs(200);


                Servo0PwmDuty = 1500;        //脈沖寬度在1000微秒,對應-45°
                DelayMs(200);
      
                Servo1PwmDuty = 1000;
                DelayMs(200);                         }
               
                DelayMs(200);


          {        Servo6PwmDuty = 1500;                // 左后腳 1700——1200 ;左后腿 1200——1700
                DelayMs(200);                //延時0.5秒


                Servo7PwmDuty = 1500;
                DelayMs(200);


                Servo6PwmDuty = 1000;        //脈沖寬度在1000微秒,對應-45°
                DelayMs(200);
      
                Servo7PwmDuty = 1000;
                DelayMs(200);                  }
      
            DelayMs(200);
}


void left()
{
    {        Servo2PwmDuty = 1500;                // 右前腳 1700——1200 ;右前腿 1200——1700
                DelayMs(200);                        // 延時0.5秒


                Servo3PwmDuty = 1000;
                DelayMs(200);


                Servo2PwmDuty = 1000;            // 脈沖寬度在1000微秒,對應-45°
                DelayMs(200);
      
                Servo3PwmDuty = 1500;
                DelayMs(200);                  }


            DelayMs(200);


     {  Servo4PwmDuty = 1000;                // 右后腳 1700——1200 ;右后腿 1200——1700              自己改參數(shù)
                DelayMs(200);                        // 延時0.5秒


                Servo5PwmDuty = 1000;
                DelayMs(200);


                Servo4PwmDuty = 1500;            // 脈沖寬度在1000微秒,對應-45°
                DelayMs(200);
      
                Servo5PwmDuty = 1500;
                DelayMs(200);                         }


                DelayMs(200);
}


void turnright()
{      
            Servo0PwmDuty=1500;        //0
        Servo1PwmDuty=1500;
        Servo2PwmDuty=1500;
        Servo3PwmDuty=1500;
        Servo4PwmDuty=1500;
        Servo5PwmDuty=1500;
        Servo6PwmDuty=1500;
        Servo7PwmDuty=1500;
        DelayMs(100);


//        Servo0PwmDuty = 1750;
//        DelayMs(100);      
//        Servo1PwmDuty = 1750;
//        DelayMs(100);      
//        Servo2PwmDuty = 1750;
//        DelayMs(100);   
//        Servo3PwmDuty = 1750;     
//        DelayMs(100);


        Servo1PwmDuty = 2000;       //45
        DelayMs(200);  
        Servo5PwmDuty = 2000;       //45
        DelayMs(200);
        Servo3PwmDuty = 2000;       //45
        DelayMs(200);
        Servo7PwmDuty = 2000;       //45
        DelayMs(200);


//        Servo0PwmDuty = 1750;
//        DelayMs(100);      
//        Servo1PwmDuty = 1750;
//        DelayMs(100);      
//        Servo2PwmDuty = 1750;
//        DelayMs(100);   
//        Servo3PwmDuty = 1750;     
//        DelayMs(100);


        Servo1PwmDuty = 1500;       //0  
        Servo5PwmDuty = 1500;       //0  
        Servo3PwmDuty = 1500;       //0  
                Servo7PwmDuty = 1500;       //0  
        DelayMs(100);
        g++;
}
   
void main()
{
        InitTimer0();        //定時器0初始化
        EA = 1;                        //開總中斷
        while(1)                //大循環(huán)
        {
        if(h==0)        //起
        {
            up();
            h++;
        }




        for(g=0;g<10;g++)
        {
        go();
        up();
        }
//            left();
//            right();








//        if(g==0)        //轉彎
//        {
//            turnright();
//            g++;
//        }
//
//        if(h!=0)        //恢復初態(tài)
//        {
//            up();
//            h++;
//        }
    }
}


void Timer0_isr(void) interrupt 1 using 1     //時鐘0中斷處理
{
        static uint16 i = 1;        //靜態(tài)變量:每次調用函數(shù)時  $$保持上一次所賦的值$$
                                                        //跟全局變量類似,不同是它只能用于此函數(shù)內部
        switch(i)
        {
                case 1:
                        SERVO0 = 1;        //PWM控制腳高電平
//給定時器0賦值,計數(shù)Pwm0Duty個脈沖后產生中斷,下次中斷會進入下一個case語句
                        Timer0Value(Servo0PwmDuty);      
                        break;
                case 2:
                        SERVO0 = 0; //PWM控制腳低電平
//高脈沖結束后剩下的時間(20000-Pwm0Duty)全是低電平了,Pwm0Duty + (20000-Pwm0Duty) = 20000個脈沖正好為一個周期20毫秒
                        Timer0Value(20000-Servo0PwmDuty);
                        break;


        case 3:
                        SERVO1 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo1PwmDuty);      
                        break;
        case 4:
                        SERVO1 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo1PwmDuty);
                        break;         


        case 5:
                        SERVO2 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo2PwmDuty);      
                        break;
        case 6:
                        SERVO2 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo2PwmDuty);
                        break;
        
        case 7:
                        SERVO3 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo3PwmDuty);      
                        break;
        case 8:
                        SERVO3 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo3PwmDuty);
            
                        break;
                  
        case 9:
                        SERVO4 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo4PwmDuty);      
                        break;
        case 10:
                        SERVO4 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo4PwmDuty);
                        break;
        
        case 11:
                        SERVO5 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo1PwmDuty);      
                        break;
        case 12:
                        SERVO5 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo5PwmDuty);
                        break;
        
        case 13:
                        SERVO6 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo6PwmDuty);      
                        break;
        case 14:
                        SERVO6 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo6PwmDuty);
                        break;


        case 15:
                        SERVO7 = 1;        //PWM控制腳高電平
                        Timer0Value(Servo7PwmDuty);      
                        break;
        case 16:
                        SERVO7 = 0; //PWM控制腳低電平
            Timer0Value(20000-Servo7PwmDuty);
            i=0;
                        break;         
        }
        i++;
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

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