久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1841|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

四腳蜘蛛機(jī)器人代碼

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

sbit SERVO0=P2^0;                        //控制舵機(jī)的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)     //延時(shí)ms毫秒
{
        uint16 i,j;
        for(i=0;i<85;i++)                //89單片機(jī)用85,12系列單片機(jī)用800
                for(j=0;j<ms;j++);
}


void InitTimer0(void)   //時(shí)鐘0初始化
{
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x00;                        //設(shè)置定時(shí)初值
        TH0 = 0x00;                        //設(shè)置定時(shí)初值
        TF0 = 0;                        //清除TF0標(biāo)志
        TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
        ET0 = 1;                        //開定時(shí)器0中斷
}
/***********************************************************
* 名    稱:Timer0Value(uint16 pwm)  
* 功    能:給定時(shí)器0計(jì)數(shù)器賦值產(chǎn)生定時(shí)中斷
* 入口參數(shù):pwm                控制舵機(jī)的PWM脈沖寬度值(范圍:500~2500)
* 出口參數(shù):無
* 說    明:12M晶振,12分頻,所以計(jì)數(shù)器每遞增一個(gè)數(shù)就是1微秒,完全滿足舵機(jī)控制的精度要求
                        因?yàn)槎〞r(shí)器是TH0,TL0都要全部計(jì)數(shù)到0xFF后在計(jì)1個(gè)數(shù)就會(huì)產(chǎn)生中斷,所以要想產(chǎn)生
                        pwm毫秒的中斷,那么TH0,TL0就應(yīng)該賦值(0xFFFF-pwm)        從這個(gè)值開始計(jì)數(shù)產(chǎn)生定時(shí)中斷                                          
/**********************************************************/
void Timer0Value(uint16 pwm)
{
        uint16 value;
        value=0xffff-pwm;      
        TR0 = 0;
        TL0=value;                        //16位數(shù)據(jù)給8位數(shù)據(jù)賦值默認(rèn)將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);                        // 延時(shí)0.5秒


                Servo1PwmDuty = 1500;
                DelayMs(300);


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


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


                Servo5PwmDuty = 1500;
                DelayMs(300);


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


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


                Servo3PwmDuty = 1500;
                DelayMs(300);


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


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


                Servo7PwmDuty = 1500;
                DelayMs(300);


                Servo6PwmDuty = 1700;        //脈沖寬度在1000微秒,對(duì)應(yīng)-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);                //延時(shí)0.5秒


                Servo1PwmDuty = 1500;
                DelayMs(200);


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


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


                Servo7PwmDuty = 1500;
                DelayMs(200);


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


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


                Servo3PwmDuty = 1000;
                DelayMs(200);


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


            DelayMs(200);


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


                Servo5PwmDuty = 1000;
                DelayMs(200);


                Servo4PwmDuty = 1500;            // 脈沖寬度在1000微秒,對(duì)應(yīng)-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();        //定時(shí)器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)        //轉(zhuǎn)彎
//        {
//            turnright();
//            g++;
//        }
//
//        if(h!=0)        //恢復(fù)初態(tài)
//        {
//            up();
//            h++;
//        }
    }
}


void Timer0_isr(void) interrupt 1 using 1     //時(shí)鐘0中斷處理
{
        static uint16 i = 1;        //靜態(tài)變量:每次調(diào)用函數(shù)時(shí)  $$保持上一次所賦的值$$
                                                        //跟全局變量類似,不同是它只能用于此函數(shù)內(nèi)部
        switch(i)
        {
                case 1:
                        SERVO0 = 1;        //PWM控制腳高電平
//給定時(shí)器0賦值,計(jì)數(shù)Pwm0Duty個(gè)脈沖后產(chǎn)生中斷,下次中斷會(huì)進(jìn)入下一個(gè)case語句
                        Timer0Value(Servo0PwmDuty);      
                        break;
                case 2:
                        SERVO0 = 0; //PWM控制腳低電平
//高脈沖結(jié)束后剩下的時(shí)間(20000-Pwm0Duty)全是低電平了,Pwm0Duty + (20000-Pwm0Duty) = 20000個(gè)脈沖正好為一個(gè)周期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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲1区| 成人在线免费视频 | 国产亚洲网站 | 天堂网avav | 成人不卡在线 | 国产aaaaav久久久一区二区 | 亚洲综合视频 | 人人九九精 | 在线观看黄色电影 | 国产日韩精品一区二区 | 亚洲成人一区 | 精品精品视频 | 欧美一区二区三区在线观看 | 欧美日韩亚洲国产综合 | 精精国产xxxx视频在线播放 | 免费精品久久久久久中文字幕 | 精品日本中文字幕 | 911网站大全在线观看 | 最新超碰 | 一二三区av | 日韩在线精品视频 | 999精彩视频 | 成人精品免费视频 | 成人在线免费观看 | 国产婷婷 | 蜜臀久久99精品久久久久久宅男 | 中文字幕在线一区二区三区 | 98久久 | 日韩三级在线 | 国产a一区二区 | 国产精品99久久久久久宅男 | 欧美二三区 | 国产99久久精品一区二区永久免费 | 久久久久黄色 | 国产免费色 | 亚洲电影在线播放 | 偷派自拍 | 亚洲高清一区二区三区 | 精品日韩 | 中文字幕视频在线免费 | 99re热精品视频 |