搜索
bottom↓
回复: 5

我做的第一个机器人,程序和大家分享一下!【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-26 13:01:14 | 显示全部楼层 |阅读模式
    参加了学校里的机器人比赛,虽然得到的名次是倒数,但还是很高兴,重在参与嘛,而且我现在对这方面又不是很熟。当时就是临时和我们说了一下,时间又很紧,结果三个晚上搞定,尤其舵机和直流电机被我轻松搞定,这点上我还是很佩服我自己的,但也还是有很多地方没有注意以致最后的失败。在这里和大家总结一下,希望大家引以为鉴:

    第一、舵机的电路没有连接正确,我说怎么一下就烧一个芯片呢,调试了三天结果烧了四个芯片。



    第二、电源质量太差,用几下没电了,尤其那比赛场地又摩擦很大,结果到最后它跑不动了。。。



    还有另外很多经验教训就不一一和各位说了。

    



 (原文件名:IMG0218A.jpg) 





 (原文件名:IMG0219A.jpg) 



点击此处下载 ourdev_559865.rar(文件大小:6.31M) (原文件名:MOV0010A.rar) 





    以下是程序:

# include<REG51.h>

# define uchar unsigned char

# define uint unsigned int



#include<math.h>

#define uchar unsigned char

#define uint unsigned int

sbit en1=P1^5;

sbit en2=P1^1;

sbit s1=P1^4;

sbit s2=P1^3;

sbit s3=P1^2;

sbit s4=P1^0;



sbit dl=P2^0;

sbit d2=P2^1;

sbit d3=P2^2;

sbit d4=P2^3;

sbit d5=P2^4;

sbit d6=P2^5;

sbit d7=P2^6;

sbit d8=P2^7;



uint order1;

uint t1,t2,t3,t4,t5,t6,t7,t8;



uchar t=0;          /* 中断计数器     */

uchar m1=0;         /* 电机1速度值    */

uchar m2=0;         /* 电机2速度值    */

uchar tmp1,tmp2;    /* 电机当前速度值 */



 /* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */

void motor(uchar index, char speed)

{

 if(speed>=-100 && speed<=100)

   {

     if(index==1)       /* 电机1的处理    */

       {

        m1=abs(speed);  /* 取速度的绝对值 */

        if(speed<0)     /* 速度值为负则反转 */

           {

            s1=0;

            s2=1;

           }

          else          /* 不为负数则正转 */

           {

            s1=1;

            s2=0;

           }

       }

     if(index==2)       /* 电机2的处理    */

       {

        m2=abs(speed);  /* 电机2的速度控制 */

        if(speed<0)     /* 电机2的方向控制 */

           {

            s3=0;

            s4=1;

           }

          else

           {

            s3=1;

            s4=0;

           }

       }

   }

}



void timer0(void) interrupt 1        /* T0中断服务程序 */

{

switch(order1)

{

case 1: dl=1;

         TH0=-t1/256;

         TL0=-t1%256;

         break;

case 2: dl=0;

                 TH0=-(2700-t1)/256;

         TL0=-(2700-t1)%256;

         break;

case 3: d2=1;

          TH0=-t2/256;

         TL0=-t2%256;

         break;

case 4: d2=0;

        TH0=-(2700-t2)/256;

         TL0=-(2700-t2)%256;

         break;

case 5: d3=1;

         TH0=-t3/256;

         TL0=-t3%256;

         break;

case 6: d3=0 ;

         TH0=-(2700-t3)/256;

         TL0=-(2700-t3)%256;

         break;

case 7: d4=1;

         TH0=-t4/256;

         TL0=-t4%256;

         break;

case 8: d4=0;

         TH0=-(2700-t4)/256;

         TL0=-(2700-t4)%256;

         break;

case 9:  d5=1;

         TH0=-t5/256;

         TL0=-t5%256;

         break;

case 10: d5=0;

          TH0=-(2700-t5)/256;

         TL0=-(2700-t5)%256;

          break;

case 11: d6=1;

          TH0=-t6/256;

          TL0=-t6%256;

          break;

case 12: d6=0;

          TH0=-(2700-t6)/256;

         TL0=-(2700-t6)%256;

          break;

case 13: d7=1;

          TH0=-t7/256;

          TL0=-t7%256;

          break;

case 14:d7=0;

         TH0=-(2700-t7)/256;

         TL0=-(2700-t7)%256;

           break;

case 15: d8=1;

     TH0=-t8/256;

       TL0=-t8%256;

          break;

case 16:d8=0;

order1=0;

    TH0=-(2700-t8)/256;

    TL0=-(2700-t8)%256;

  order1=0;

   break;

default : order1=0;

}

order1++;

}



void timer3() interrupt 3          /* T1中断服务程序 */

{

 if(t==0)           /* 1个PWM周期完成后才会接受新数值 */

   {

     tmp1=m1;

     tmp2=m2;

   }

 if(t<tmp1) en1=1; else en1=0;   /* 产生电机1的PWM信号 */

 if(t<tmp2) en2=1; else en2=0;   /* 产生电机2的PWM信号 */

 t++;

 if(t>=100) t=0;          /* 1个PWM信号由100次中断产生 */

}





void delay(uint j)      /* 简易延时函数 */

{

 for(j;j>0;j--);

}



void delay_m(uint n)  //大延时

{

 for(n;n>0;n--)

 {delay(200000);}

}





void zhuantou()//将头转一下

{

        uint i;

        for (i=2700;i>300;i-=300)

        {t2=i;

        delay(200000);}

        for (i=300;i<2700;i+=300)

        {t2=i;

        delay(200000);}

        for        (i=2700;i>1500;i-=300)

        {t2=i;

        delay(200000);}

}



void updowntou(uchar n)//臂的运动

{

        if (n==1)

        {t1+=100;delay_m(3);t1+=100;delay_m(3);}

        if (n==2)

        {t1-=100;delay_m(3);t1-=100;delay_m(3);}

}



void xiaoquan()//转圈

{

        uint i;

        motor(2,-40);//右

        motor(1,-15);//左

        for (i=0;i<3;i++)

        {

                updowntou(2);

                updowntou(1);

        }

        delay_m(12);

        //delay(10000);

        motor(1,0);

        motor(2,0);

}



void xiaoquan1()//顺时转圈

{

        uint i;

        motor(1,-40);//左

        motor(2,-15);//右

        for (i=0;i<3;i++)

        {

                updowntou(2);

                updowntou(1);

        }

        delay_m(12);

        //delay(10000);

        motor(1,0);

        motor(2,0);

}



void main(void)

{

uint i,j;

t1=1400;

t2=1800;

t3=1500;

t4=1000;

t5=1750;

t6=2000;

t7=2500;

t8=2000;



TMOD=0x21;                /* 设定T0的工作模式为2 */

TH1=0x9B;                    /* 装入定时器的初值    */

TL1=0x9B;

order1=1;

TH0=-1500/256;

TL0=-1500%256;

EA=1;

ET0=1;ET1=1;; TR0=1;TR1=1;PT0=1;PT1=1;



        motor(1,0);

        motor(2,0);

        delay_m(20);





        //*************************************转一圈,行鞠躬礼

        for (i=0;i<4;i++)

        {

                updowntou(2);//上

                updowntou(1);//下

                updowntou(1);

                updowntou(2);

                motor(1,-20);

                motor(2,20);

                delay_m(5);

                delay(11000);

                motor(1,0);

                motor(2,0);

                delay_m(5);

        }

        //***************************************

        delay_m(5);

        //**************************************前进和后退

        for (i=0;i<2;i++)

        {

                motor(1,-20);

                motor(2,-20);

                delay_m(20);

                motor(1,0);

                motor(2,0);

                delay_m(2);

                //----------

                zhuantou();

                //----------

                motor(1,20);

                motor(2,20);

                delay_m(20);

                motor(1,0);

                motor(2,0);

                delay_m(2);

                zhuantou();

        }

        //*******************************************小圆圈

        for (i=0;i<1;i++)

        {

                xiaoquan();

                xiaoquan();

                xiaoquan();

                xiaoquan1();

                xiaoquan1();

                xiaoquan1();

        }

        motor(1,0);

        motor(2,0);

        delay_m(2);

        zhuantou();

/*        //********************************************回转转头

        motor(1,20);

        motor(2,-20);

        delay_m(10);

        motor(1,-20);

        motor(2,20);

        delay_m(10);

        motor(1,0);

        motor(2,0);

        delay_m(3);

        zhuantou();

        //--------

        motor(1,-20);

        motor(2,20);

        delay_m(10);

        motor(1,20);

        motor(2,-20);

        delay_m(10);

        motor(1,0);

        motor(2,0);

        delay(3);

        zhuantou();                         */

        //***************************************转向向前

        motor(1,-20);

        delay_m(4);

        motor(1,0);

        delay_m(2);        

        updowntou(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        updowntou(2);

        zhuantou();

        //--------

        motor(2,-20);

        delay_m(10);

        motor(2,0);

        delay_m(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        updowntou(2);

        zhuantou();

        //--------

        motor(1,-20);

        delay_m(10);

        motor(1,0);

        delay_m(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        updowntou(2);

        zhuantou();

        //-----------

        //*****************************************向后花样

        //--------

        motor(1,20);

        delay_m(10);

        motor(1,0);

        delay_m(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        updowntou(2);

        zhuantou();

        //-------

        motor(2,20);

        delay_m(10);

        motor(2,0);

        delay_m(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        updowntou(2);

        zhuantou();

        //--------

        motor(2,0);

        motor(1,20);

        delay_m(4);

        motor(1,0);

        delay_m(2);        

        updowntou(2);

        zhuantou();

        updowntou(1);

        updowntou(1);

        zhuantou();

        updowntou(2);

        //***********

        motor(1,0);

        motor(2,0);

        updowntou(1);

        delay_m(2);

        //***********************************************翻斗

        zhuantou();

        delay_m(1);

        for(i=0;i<3;i++)

        {

                motor(1,20);

                motor(2,-20);

                delay_m(2);

                updowntou(2);

                updowntou(1);

                updowntou(1);

                updowntou(2);

                motor(1,0);

                motor(2,0);

                zhuantou();

                //-----

                motor(2,20);                 

                motor(1,-20);

                delay_m(2);

                updowntou(2);

                updowntou(1);

                updowntou(1);

                updowntou(2);

                motor(1,0);

                motor(2,0);

                zhuantou();

        }

        //*********************************************小旋风

        for (j=0;j<2;j++)

        {

                motor(1,0);

                motor(2,-20);

                delay_m(2);

                for (i=0;i<3;i++)

                {updowntou(2);updowntou(1);updowntou(1);updowntou(2);}

                motor(1,20);

                motor(2,0);

                delay_m(2);

                for (i=0;i<3;i++)

                {updowntou(2);updowntou(1);updowntou(1);updowntou(2);}

        }

        //**************************

        motor(1,0);

        motor(2,0);

        delay_m(2);

        //**********************************************双旋风

        delay_m(2);

        for (i=0;i<6;i++)

        {

                motor(1,-i*20);

                motor(2,i*20);

                zhuantou();

        }

        delay_m(3);

        motor(1,0);

        motor(2,0);

        delay_m(2);

        for (i=0;i<6;i++)

        {

                motor(1,i*20);

                motor(2,-i*20);

                zhuantou();

        }

        delay_m(30);

        //--------------

        while(1){ 

        motor(1,0);

        motor(2,0);}

        //--------------

}











    

出0入0汤圆

发表于 2009-1-18 21:13:17 | 显示全部楼层
支持校友

出0入0汤圆

发表于 2008-12-29 12:40:32 | 显示全部楼层
确实有点长

出0入0汤圆

发表于 2008-12-27 23:49:13 | 显示全部楼层
呵呵,赞一个~~~

出0入0汤圆

 楼主| 发表于 2008-12-27 21:51:50 | 显示全部楼层
看来没人感兴趣呀,自己顶一下,呵呵。。。



以后要多努力,做出大家感兴趣的东东来。。。

本贴被 xiao123 编辑过,最后修改时间:2008-12-27,21:52:10.
头像被屏蔽

出0入0汤圆

发表于 2010-1-24 11:20:53 | 显示全部楼层
以下蓝色文字由坛主:armok 于:2010-01-24,11:20:53 加入。
<font color=black>请发贴人注意:
本贴放在这分区不合适,即将移走
原来分区:[3035]中国矿业大学理学院单片机实验室
即将移去的分区:[1027]开源雕刻机DIY活动(及机械分论坛)
移动执行时间:自本贴发表0小时后

任何的疑问或咨询,请可随时联系站长。谢谢你的支持!
</font>
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 14:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表