找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2423|回复: 1
打印 上一主题 下一主题
收起左侧

蓝牙无线遥控避障

[复制链接]
跳转到指定楼层
楼主
ID:79748 发表于 2015-5-12 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /******************************************
  2. *******************************************
  3.                 程序名称:蓝牙无线遥控避障
  4. ******************************************
  5. *******************************************/
  6. #include <at89x51.h>
  7. #include <stdio.h>
  8. #include <PWM.h>  //包含前面讲到的PWM头文件,此头文件导入后能产生1KHZ的PWM信号
  9. #include <intrins.h>

  10. #define Forward_L_DATA  200
  11. #define Forward_R_DATA  200      
  12. #define Back_L_DATA  190
  13. #define Back_R_DATA  190      
  14. #define Turn_Left_L_DATA  230
  15. #define Turn_Left_R_DATA  230
  16. #define Turn_Right_L_DATA  230
  17. #define Turn_Right_R_DATA  230
  18. /***自定义一些数据,这些数据对应软件上的数据设置**/      
  19. #define leftdata    0x11
  20. #define rightdata   0x22
  21. #define forwarddata 0x33
  22. #define backdata    0x44
  23. /*******L293D逻辑电平口定义******/
  24. sbit L293D_IN1=P1^5;
  25. sbit L293D_IN2=P1^6;
  26. sbit L293D_IN3=P1^1;
  27. sbit L293D_IN4=P1^0;
  28. sbit L293D_EN1=P1^3;
  29. sbit L293D_EN2=P1^4;
  30. /*****左传感器和右传感器接线定义***/
  31. sbit Left_InSen=P2^3;      
  32. sbit Right_InSen=P2^0;
  33. /******寄存器地址赋值******/
  34. sfr AUXR=0x8e;
  35. sfr BRT=0x9c;
  36. /******全局变量定义******/
  37. unsigned char SBUF_DATA,flag1,flag2,flag3,flag4,Last_SBUF_DATA;
  38. unsigned int count1=0;
  39. unsigned int speed;
  40. char s[10];                 //存放速度值的缓冲区
  41. /*******函数声明*******/
  42. void SendString(unsigned char *pt);
  43. void Send_Char(unsigned char DATA);

  44. //—————————————延时1ms函数————————————
  45. void Delay1ms(unsigned int i)
  46. {
  47.         unsigned char j,k;
  48.         do{
  49.                 j = 44;
  50.                 do{
  51.                         k = 100;
  52.                         do{ _nop_(); }while(--k);                              
  53.                 }while(--j);
  54.         }while(--i);
  55. }
  56. /*************************电机控制函数******************/
  57. void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//前进
  58. {
  59.          L293D_IN1=1;
  60.          L293D_IN2=0;
  61.          L293D_IN3=1;
  62.          L293D_IN4=0;
  63.      PWM_Set(255-Speed_Right,255-Speed_Left);
  64. }
  65. void Back(unsigned char Speed_Right,unsigned char Speed_Left)//后退
  66. {
  67.          L293D_IN1=0;
  68.          L293D_IN2=1;               
  69.          L293D_IN3=0;
  70.          L293D_IN4=1;
  71.      PWM_Set(255-Speed_Right,255-Speed_Left);
  72. }
  73. void Turn_Left(unsigned char Speed_Right,unsigned char Speed_Left)//左转
  74. {
  75.     L293D_IN1=1;
  76.         L293D_IN2=0;
  77.         L293D_IN3=0;
  78.         L293D_IN4=1;
  79.         PWM_Set(255-Speed_Right,255-Speed_Left);

  80. }
  81. void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)//右转
  82. {
  83.     L293D_IN1=0;
  84.         L293D_IN2=1;
  85.         L293D_IN3=1;
  86.         L293D_IN4=0;
  87.         PWM_Set(255-Speed_Right,255-Speed_Left);
  88. }
  89. void Stop(void)        //停止
  90. {
  91.      L293D_IN1=0;
  92.          L293D_IN2=0;
  93.          L293D_IN3=0;
  94.          L293D_IN4=0;
  95.          PWM_Set(0,0);
  96. }

  97. /****************发送字符串函数****************/
  98. void SendString(unsigned char *pt)
  99. {
  100.     while(*pt)
  101.                 Send_Char(*(pt++));
  102. }
  103. /****************发送字符函数****************/
  104. void Send_Char(unsigned char DATA)
  105. {
  106.      ES=0;//关闭串口中断
  107.          flag1=0;
  108.      SBUF=DATA; //将数据发送出去,可以在电脑串口工具的接收区观察
  109.      while(!TI);//数据发送完毕之后,T1会置1
  110.      TI=0;
  111.      ES=1;//重新允许串口中断      
  112. }
  113. /****************************串口中断函数****************************/
  114. void serial() interrupt 4
  115. {
  116.         flag1=1;//如果产生了中断,说明单片机串口接收到数据,串口中断标志置1      
  117.         SBUF_DATA=SBUF;        //存放接收到的数据
  118.         RI=0;//中断标志
  119. }
  120. /****************************障碍检测函数**************************/
  121. void jiance(void)
  122. {
  123.         if(Left_InSen==0&& Right_InSen==1) //如果左边传感器检测到物体,提示左边有障碍物
  124.           {
  125.                  if(flag2!=1)
  126.                    {
  127.                           Delay1ms(500);
  128.                           flag2=1;
  129.                           SendString("\r\n左方有障碍物...\r\n\r\n");      
  130.                    }
  131.           }
  132.         else
  133.           {
  134.                  flag2=0;
  135.           }
  136.         if(Left_InSen==1&& Right_InSen==0) //如果右边传感器检测到物体,提示右边有障碍物
  137.           {
  138.                  if(flag3!=1)
  139.                    {
  140.                           Delay1ms(500);
  141.                           flag3=1;
  142.                       SendString("\r\n右方有障碍物...\r\n\r\n");      
  143.                    }
  144.           }
  145.         else
  146.           {
  147.                  flag3=0;
  148.           }
  149.         if(Left_InSen==0&& Right_InSen==0) //如果前方传感器检测到物体,提示前方有障碍物
  150.           {
  151.                  if(flag4!=1)
  152.                    {
  153.                           Delay1ms(500);
  154.                           flag4=1;
  155.                           SendString("\r\n前方有障碍物...\r\n\r\n");      
  156.                    }
  157.           }
  158.         else
  159.           {
  160.                  flag4=0;
  161.           }
  162. }
复制代码




/****************************主函数***********************/
void main(void)
{
    PWM_ini();

        TMOD|=0x10;
        TMOD&=0x1F;
        TH1=(65536-36815)/256;
        TL1=(65536-36815)%256;          // 20ms
        TR1=1;
        ET1=1;

        EX0=1;
        IT0=1; //

        SCON=0x50;//设置串口工作在方式1,允许串口接收数据
        BRT=0xff;
        AUXR=0x11;
               
        ES=1;  //允许串行中断
        EA=1; //开总中断
        SendString("已经进入蓝牙无线控制模式,\r\n\r\n请按下对应的键盘按键,无线遥控小车。\r\n");

while(1)
{
jiance();
if(flag1==1)        //如果产生过中断,证明串口接收到了数据
{                        
        flag1=0;
        if(SBUF_DATA!=Last_SBUF_DATA)
        {
        switch(SBUF_DATA)
        {
                case leftdata: SendString("小车正在左转...\r\n\r\n");break;
                case rightdata: SendString("小车正在右转...\r\n\r\n");break;
                default: break;
                }
               
        }
         switch(SBUF_DATA)
        {
        case leftdata: Turn_Left(Turn_Left_R_DATA,Turn_Left_L_DATA);break;
        case rightdata: Turn_Right(Turn_Right_R_DATA,Turn_Right_L_DATA);break;
        case forwarddata: Forward(Forward_R_DATA,Forward_L_DATA);SendString("小车正在前进...\r\n\r\n");SendString(s); break;
case backdata: Back(Back_R_DATA,Back_L_DATA);SendString("小车正在后退...\r\n\r\n");SendString(s);break;
                                         default: break;
                }
                        
         Last_SBUF_DATA = SBUF_DATA;
        Delay1ms(30);
        }
                    else Stop();
}
}  

void int0() interrupt 0
{
        count1++;
}

void timer1() interrupt 3
{
        static unsigned char n=0;
        TH1=(65536-36815)/256;
        TL1=(65536-36815)%256;          // 20ms
        n++;
        if(n>=50)
        {               
                n=0;
                speed=(float)count1*1.0053096;        
                count1=0;
                sprintf(s,"speed:%3dcm/s\r\n\r\n",(unsigned short)speed);//将速度转化为字符串送到S数组中
        }
}

小车通讯部分原理图.pdf

19.71 KB, 下载次数: 7, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:79782 发表于 2015-5-12 19:30 | 只看该作者
可以实现吗
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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