小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 6663|回复: 7

我的蓝牙机器人出炉了,欢迎围观

[复制链接]
发表于 2012-7-9 10:27:17 | 显示全部楼层 |阅读模式


这是我用单片机做的第二个东西,所以设计上有蛮多错误的地方,比如发光二极管直接接到了12V电源上,上电后就直接烧了,比如功能按键上竟然没有接指示灯,搞的我每次试几次才能转成不同的功能,比如我电池竟然用了两组,而当时没想到可以将12V电源压降到5V给单片机供电,并且5V电池内阻过大,导致机械手臂基本残废,比如我的散热片竟然没跟L298放到一起,致使散热片成为一个摆设,比如L298我用了两个,比如。。。但是幸运的是虽然错误很多,但是基本功能都可以实现,我知道这里大神多,请勿喷

以下是下位机的源程序,由于本人非常讨厌英文,所以程序中参数基本都是拼音设置的,通俗易懂,哈哈,程序只是实现了我的基本功能,基本上谈不上优化,漏洞估计不少,仅供参考哈。。。


#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#include<math.h>

#define uint unsigned int
#define uchar unsigned char

sbit Trig=P2^7;                                  //超声波输入输出
sbit Echo=P3^2;

sbit duoji=P2^6;

sbit zuohong=P1^1;                          //红外循迹定义
sbit youhong=P1^2;

sbit key1=P1^3;
sbit key2=P1^4;
sbit key3=P1^5;

sbit youlun=P2^3;                         //电动机位定义
sbit zuolun=P2^1;                         //前轮,后轮等于一正转等于零反转
sbit enyou=P2^2;                         //轮胎使能低电平有效
sbit enzuo=P2^0;

uchar a[5]={0};
uchar flag,pcflag,receivecontrol=0,numpc=0,ashouji;
uchar num,shujupc;

uint th0,tl0,distance,time,n[3],i=0,xuanze;                                //超声波定时器0计时
uchar chaoshengboflag;  //超声波


/****************延时函数*********************/

void delayms(uint x)                        //延时x毫秒
{
        uint i,j;
        for(j=0;j<x;j++)
                for(i=0;i<110;i++);
}

void delay20us()                               //延时20us
{
        uchar a;
        for(a=0;a<100;a++);

}                                 

void delayus(uint xms)                   //延时0.xms
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=11;j>0;j--);
}




void init()
{
        TMOD=0x20;
        TL1=0xfd;
        TH1=0xfd;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;

}

/****************舵机*********************/


void degree45()                                                                         //舵机正45度
{
        uchar i;
        for(i=0;i<15;i++)
        {
                duoji=1;
                delayus(9);                                                        //延时1ms
                duoji=0;
                delayus(191);                                                        //延时19ms
        }       
}
         
void degree_45()                                                                //舵机负45度
{
       
        uchar i;
        for(i=0;i<15;i++)
        {
                duoji=1;
                delayus(20);                                                        //延时1ms
                duoji=0;
                delayus(180);                                                        //延时19ms
        }
}

                                                                
void degree0()                                                                         //舵机0度
{
        uchar i;
        for(i=0;i<15;i++)
        {
                duoji=1;
                delayus(15);                                                        //延时1ms
                duoji=0;
                delayus(185);                                                        //延时19ms
        }       
}



/*-----------------电机运动程序------------------------*/


void initmada()                                                        //驱动初始化
{
        enzuo=0;
        enyou=0;
        zuolun=1;
        youlun=1;
}

void qianjin()                                                         //前进
{
        uint t;

        zuolun=1;
        youlun=1;

        delayms(5);
            for        (t=0;t<10;t++)
                {
                enzuo=1;
                enyou=1;
                delayms(20);
               
                enzuo=0;
                enyou=0;
                delayms(20);
                }
                       
}


   void houtui()                                                         //后退
{
        uint t;

        zuolun=0;
        youlun=0;

        delayms(5);
            for        (t=0;t<13;t++)
                {
                enzuo=1;
                enyou=1;
                delayms(20);
               
                enzuo=0;
                enyou=0;
                delayms(20);
                }                       
}


void zuozhuan()                                                                //左转
{
        uint t;
       
        zuolun=0;
        youlun=1;

        for(t=0;t<10;t++)
        {
                enzuo=1;
                enyou=1;
                delayms(20);
               
                enzuo=0;
                enyou=0;
                delayms(20);       
        }       

}

void youzhuan()                                                                        //右转
{
        uint t;
        zuolun=1;
        youlun=0;

        for(t=0;t<10;t++)
        {
                enzuo=1;
                enyou=1;
                delayms(20);

                enzuo=0;
                enyou=0;
                delayms(20);               
        }

}                               

void stop()                                                                //停止
{
        enzuo=0;
        enyou=0;
}



/*-----------------红外电机运动程序------------------------*/

void qianjinhong()                                                         //前进
{
        uint t;

        zuolun=1;
        youlun=1;

        delayms(5);
            for        (t=0;t<10;t++)
                {
                enzuo=1;
                enyou=1;
                delayms(10);
               
                enzuo=0;
                enyou=0;
                delayms(30);
                }
                       
}


void zuozhuanhong()                                                                //左转
{
        uint t;
       
        zuolun=0;
        youlun=1;

        for(t=0;t<5;t++)
        {
                enzuo=1;
                enyou=1;
                delayms(10);
               
                enzuo=0;
                enyou=0;
                delayms(30);       
        }       

}

void youzhuanhong()                                                                        //右转
{
        uint t;
        zuolun=1;
        youlun=0;

        for(t=0;t<5;t++)
        {
                enzuo=1;
                enyou=1;
                delayms(10);

                enzuo=0;
                enyou=0;
                delayms(30);               
        }

}                       


/****************舵机超声波避障*********************/

void bijiao()
                {
                               
                                 degree45();                                  //右边
                                                 
                                 delayms(400);
                                 delayms(400);

                                 EA=0;
                                 chaoshengboflag=0;
                                 TL0=0;
                                 TH0=0;

                                 Trig=1;
                                 delay20us();
                                 Trig=0;
                               
                                 while(Echo==0);
                                 
                                 EA=1;
                                 TR0=1;
                                 EX0=1;
                                 
                                 delayms(60);
                                 EX0=0;
                                 TR0=0;

                                 if(chaoshengboflag==1)
                                         {
                                        time=th0*256+tl0;
                                        distance=time*0.172;       //毫米

                                                 if(distance>400)
                                                                 n[1]=1;
                                                 else
                                                            n[1]=0;
                                                          
                                        }
                       
                                                else
                                                {
                                                n[1]=1;       
                                                }
                                  /******************/
                                 degree_45();                                  //左边
                                                 
                                 delayms(400);
                                 delayms(400);

                                 EA=0;
                                 chaoshengboflag=0;
                                 TL0=0;
                                 TH0=0;

                                 Trig=1;
                                 delay20us();
                                 Trig=0;
                               
                                 while(Echo==0);
                                 
                                 EA=1;
                                 TR0=1;
                                 EX0=1;
                                 
                                 delayms(60);
                                 EX0=0;
                                 TR0=0;

                                 if(chaoshengboflag==1)
                                         {
                                        time=th0*256+tl0;
                                        distance=time*0.172;       //毫米

                                                 if(distance>400)
                                                                
                                                                n[2]=1;
                                                 else
                                                       
                                                           n[2]=0;
                                                          
                                        }
                       
                                                else
                                                {
                                                n[2]=1;
                                                }

                                        if((n[0]||n[1]||n[2])==0)
                                                {
                                                houtui();
                                                youzhuan();
                                       
                                                degree0();
                                                delayms(400);
                                                delayms(400);
                                                }
                                         if((n[2]==1)&&(n[1]==0))
                                                 {
                                                zuozhuan();
                                                degree0();
                                                delayms(400);
                                                delayms(400);
                                                }
                                         if((n[1]==1)&&(n[2]==0))
                                                 {
                                                 youzhuan();
                                                 degree0();
                                                 delayms(400);
                                                 delayms(400);
                                                }
                                          if(n[0]==1)
                                          {
                                                  qianjin();
                                                degree0();
                                                delayms(400);
                                                delayms(400);
                                          }

                                          if((n[0]==0)&&(n[1]==1)&&(n[2]==1))
                                          {
                                                   youzhuan();
                                                 degree0();
                                                 delayms(400);
                                                 delayms(400);
                                          }
                       
                               
}

/*****************超声波*****************************/
void bizhang()

{
                                 EA=0;
                                 chaoshengboflag=0;
                                 TL0=0;
                                 TH0=0;

                                 Trig=1;
                                 delay20us();
                                 Trig=0;
                               
                                 while(Echo==0);
                                 
                                 EA=1;
                                 TR0=1;
                                 EX0=1;
                                 
                                 delayms(60);
                                 EX0=0;
                                 TR0=0;

                                 if(chaoshengboflag==1)
                                         {
                                        time=th0*256+tl0;
                                        distance=time*0.172;       //毫米
                                               
                                                if(distance>400)
                                                        {
                                                                qianjin();
                                                        }

                                                else
                                                        {                                                       
                                                        n[0]=0;
                                                        bijiao();

                                                        }
                                        }

                                 if(chaoshengboflag==0)
                                         {                                                                                             
                                                 qianjin();                                  // 2
                                        }
       

}
/*************红外循迹*******************/       
void xunji()
{
        uchar zuo,you;
        zuo=zuohong;
        you=youhong;

        if((zuo==1)&&(you==0))
        {
         zuozhuanhong();
        }
        else if((zuo==0)&&(you==1))
        {
         youzhuanhong();
        }
        else {
                  qianjinhong();       
                 }
       
}               




/**********电脑远程遥控***************/
void xuanzelanya(uchar a)
{       
        uchar aa;
        aa=a;
        switch(a)
        {
                case 0x02: qianjin();break;
                case 0x01: houtui(); break;
                case 0x03: zuozhuan(); break;
                case 0x04: youzhuan(); break;
                case 0x05: degree45(); break;
                case 0x06: degree_45(); break;
                case 0x07: degree0(); break;
                default: stop(); break;
        }
}

/************手机蓝牙遥控*********************/
void shoujilanya(uchar b)
{
        uchar bb;
        bb=b;
        switch(bb)
        {
                case 15: qianjin();break;
                case 16: houtui(); break;
                case 17: zuozhuan(); break;
                case 18: youzhuan(); break;
                case 9: degree45(); break;
                case 7: degree_45(); break;
                case 8: degree0(); break;
                default: stop(); break;
        }
}



/****************主函数***************************/
void main()
{
        init();
        initmada();
        delayms(20);


        while(1)

        {
                                                                                                  //电脑远程遥控
                        if(key3==0)
                        {
                                delayms(10);
                                if(key3==0)
                                {
                                        while(1)
                                        {
                                                if(pcflag==1)
                                                {
                                                        xuanzelanya(shujupc);
                                                        pcflag=0;
                                                    
                                                }       
                                        }
                                }
                        }
               
                       

                        if(key2==0)
                        {
                                delayms(10);
                                if(key2==0)
                                {
                               
                                                        EA=0;                                                 //超声波避障
                                                        TMOD=0x01;
                                                        TR0=0;
                                                        EX0=0;
                                                        ET0=1;
                       
                                                        while(1)
                                                        {
                                                       
                                                         bizhang();
                                                                                        
                                                    }       
                                }       
                        }



                        if(key1==0)
                        {
                                delayms(10);
                                if(key1==0)                                                                //手机蓝牙遥控
                                {
                                        while(1)
                                        {
                                                if(flag==1)
                                                {
                                                        shoujilanya(ashouji);
                                                        flag=0;
                                                }
                                        }
                                }
                        }



                        if((key1==1)&&(key2==1)&&(key3==1))                          //红外循迹
                        {
                                delayms(10);
                                if((key1==1)&&(key2==1)&&(key3==1))
                                {
                                   while(1)
                                                {
                                                      xunji();
                                                }
                                }
                        }




  }
}

/******************中断函数******************/
void exter() interrupt 0                                //外部中断0
{
        th0=TH0;
        tl0=TL0;
        chaoshengboflag=1;       
        EX0=0;
}                                                                                                                            

void T0_time() interrupt 1                                 //定时器中断
{                                                                         
        TH0=0;
        TL0=0;
}



void  chuankou() interrupt 4                         //串口中断
{
        uchar a;
        ES=0;

        if(key3==0)
        {
        while(RI==0);
        RI=0;
        a=SBUF;         
        if((a==0xff)&&(receivecontrol<2))
        {
                receivecontrol++;
                numpc++;
        }
       
        else {
                 numpc++;
                 }
        if(numpc==3)
        {
                shujupc=a;       
        }
        if((receivecontrol==2)&&(a=0xff))
        {
                numpc=0;
                receivecontrol=0;
        }
       
        pcflag=1;
        if(numpc>5)
                {
                        numpc=0;
                }
        ES=1;


        }

        if(key1==0)
        {
        while(RI==0);
        a=SBUF;

        if(a<63)
        {
        ashouji=a-48;
        }

        if(a>63)
        {
        ashouji=a-50;       
        }

        RI=0;
        flag=1;
        ES=1;
        }


}




回复

使用道具 举报

发表于 2012-7-9 19:46:49 | 显示全部楼层
造型不错!像蝎子~
回复 支持 反对

使用道具 举报

发表于 2012-7-16 01:29:24 | 显示全部楼层
顶!!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2012-7-16 09:04:09 | 显示全部楼层
我觉得前轮用万向轮最好了
回复 支持 反对

使用道具 举报

发表于 2012-7-16 12:17:13 | 显示全部楼层
有不懂得地方请教,能给个联系方式不?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-18 13:14:17 | 显示全部楼层
dfdf11000 发表于 2012-7-16 09:04
我觉得前轮用万向轮最好了

呵呵,万向轮是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-18 13:15:13 | 显示全部楼层
JL12345630 发表于 2012-7-16 12:17
有不懂得地方请教,能给个联系方式不?

请教不敢,相互交流吧,我的QQ:806593449
这段时间实验室断网了,可能不会上网
回复 支持 反对

使用道具 举报

发表于 2014-9-19 23:16:20 | 显示全部楼层
L298N和l298引脚有区别么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-4-20 17:50 , Processed in 1.098981 second(s), 19 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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