找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙控制,红外循迹程序

[复制链接]
跳转到指定楼层
楼主
蓝牙控制,红外循迹

  1. //程序改为5个寻迹模式    程序采用worse来计算的     若两秒内寻迹对管全部亮  就会自动退出寻迹   程序仅供参考  没有测试  大家自行修改。
  2. #include<reg52.h>
  3. #define  LEFT  0
  4. #define  RIGHT   1
  5. #define   NON    2
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. sbit   IN1=P1^0;  //控制左电机转动,IN1=1,IN2=0时正转,反之,反转。   相应位置对应L298N的相应位置即可。
  9. sbit   IN2=P1^1;
  10. sbit   IN3=P1^2;  //控制右电机转动,IN3=1,IN4=0时正转,反之,反转。
  11. sbit   IN4=P1^3;

  12. sbit   ENA=P2^4;  //电机速度pwm控制,ENA控制左电机,ENB控制右电机。
  13. sbit   ENB=P2^5;

  14. sbit   XunJi1=P0^0;//寻迹模块从左到右依次定义为        1、2、3、4.         寻迹从左到右DO接p0^0  p0^1   p0^2   p0^3
  15. sbit   XunJi2=P0^1;
  16. sbit   XunJi3=P0^2;
  17. sbit   XunJi4=P0^3;
  18. sbit   XunJi5=P0^4;

  19. uchar count_flag,count_data=0,lanyabiaozhi=1,xunjibiaozhi=0;  //count_flag为计数标志,count_data位计数数据,蓝牙标志位和寻迹标志位。

  20. uchar black_lost_dir=NON;
  21. int error=0,re_error=0,re_re_error=0;
  22. int worse=0;

  23. uchar pwm_A,pwm_B,motor_A,motor_B,PWM=100;        //pwm_A为左电机pwm,pwm_B为右电机pwm,motor_A为左电机速度,motor_B为右电机速度。
  24. uchar  temp_data;
  25. uchar  flag;
  26. //---------------------------------初始化函数-------------------------------------------
  27. void chushihua()
  28. {
  29. P0=0xff;P1=0xff;
  30. P2=0xff;P3=0xff;
  31. TMOD=0x21;           //定时器0使用16位定时器   定时器2使用8位初值自动重装定时器
  32. TH0=(65536-200)/256;
  33. TL0=(65536-200)%256;
  34. TH1=0xFd;
  35. TL1=0xFd;
  36. SCON=0x50;
  37. PCON=0x00;

  38. TR0=1;
  39. TR1=1;
  40. ET0=1;
  41. ES=1;
  42. EA=1;

  43. }
  44. //----------------------------------------延迟函数---------------------------------
  45. /*void delay(uint z)
  46. {
  47. uint a,b;
  48. for(a=z;a>0;a--)
  49.    for(b=110;b>0;b--);

  50. } */
  51. /*********************寻迹检测***********************************/         //此段根据大家车模实际情况修改
  52. void xunji_1()        //第一个寻迹检测到黑线
  53. {
  54. IN1=1;IN2=0;
  55. IN3=1;IN4=0;
  56. motor_A=0;motor_B=55;
  57. }

  58. /*void xunji_12()        //第一个第二个寻迹检测到黑线
  59. {
  60. IN1=1;IN2=0;
  61. IN3=1;IN4=0;
  62. motor_A=10;motor_B=45;
  63. }
  64.   */
  65. void xunji_2()        //第二个寻迹检测到黑线
  66. {
  67. IN1=1;IN2=0;
  68. IN3=1;IN4=0;
  69. motor_A=20;motor_B=35;
  70. }

  71. /*void xunji_23()        //第二三个寻迹检测到黑线
  72. {
  73. IN1=1;IN2=0;
  74. IN3=1;IN4=0;
  75. motor_A=25;motor_B=30;
  76. }
  77.           */
  78. void xunji_3()        //第三个寻迹检测到黑线
  79. {
  80. IN1=1;IN2=0;
  81. IN3=1;IN4=0;
  82. motor_A=28;motor_B=28;
  83. }

  84. /*void xunji_34()         //第三四个寻迹检测到黑线
  85. {
  86. IN1=1;IN2=0;
  87. IN3=1;IN4=0;
  88. motor_A=30;motor_B=25;
  89. }
  90. */
  91. void xunji_4()           //第四个寻迹检测到黑线
  92. {
  93. IN1=1;IN2=0;
  94. IN3=1;IN4=0;
  95. motor_A=35;motor_B=20;
  96. }
  97. /*void xunji_45()           //第四wu个寻迹检测到黑线
  98. {
  99. IN1=1;IN2=0;
  100. IN3=1;IN4=0;
  101. motor_A=45;motor_B=10;
  102. }  */
  103. void xunji_5()           //第wu个寻迹检测到黑线
  104. {
  105. IN1=1;IN2=0;
  106. IN3=1;IN4=0;
  107. motor_A=55;motor_B=0;
  108. }
  109. /**************************************蓝牙控制电机*******************************/
  110. void go()          //前进
  111. {
  112. motor_A=50;motor_B=50;
  113. IN1=1;IN2=0;
  114. IN3=1;IN4=0;
  115. }

  116. void back()           //后退
  117. {
  118. motor_A=50;motor_B=50;
  119. IN1=0;IN2=1;
  120. IN3=0;IN4=1;
  121. }

  122. void left()          //左转
  123. {
  124. motor_A=0;motor_B=50;
  125. IN1=1;IN2=0;
  126. IN3=1;IN4=0;
  127. }

  128. void right()        //右转
  129. {
  130. motor_A=50;motor_B=0;
  131. IN1=1;IN2=0;
  132. IN3=1;IN4=0;
  133. }

  134. void stop()                          //停止
  135. {
  136. motor_A=0;motor_B=0;
  137. IN1=0;IN2=0;
  138. IN3=0;IN4=0;
  139. }
  140. /****************************************************************/
  141. void xunji()   //循迹模块检测
  142. {
  143.      switch(P0)
  144.          {
  145.                       case 0xd1:    xunji_1();  worse/=2;  break;   //11100001                   检测到管子误差减半
  146.                 //         case 0xf3:    xunji_12();    break;
  147.                          case 0xd2:    xunji_2();   worse/=2;  break;  // 11100010
  148.                  //    case 0xf6:    xunji_23();  black_lost_dir=NON;           break;
  149.                          case 0xd4:    xunji_3();    worse/=2;  break;// 11100100
  150.                 //         case 0xfc:    xunji_34();    break;
  151.                          case 0xd8:    xunji_4();    worse/=2;   break; //11101000
  152.                          case 0xf0:    xunji_5();    worse/=2;   break; //11110000
  153.                
  154.                          case 0xff:    xunjibiaozhi=0; lanyabiaozhi=1; stop();  break; //寻迹管子全部熄灭
  155.                          case 0xd0:   worse++;  break;
  156.                                                   
  157.                          
  158.                                 
  159.                           default : break ;
  160.          }

  161.          if(worse>=100)                        //计算大概两秒的误差
  162.          { stop(); }                  
  163. }                                                                                    


  164. void lanya()        //蓝牙控制
  165. {         /*if(count_flag==1) */
  166.     { switch(temp_data)
  167.          {
  168.                  case '2':    go();           break;                        //                                                                         
  169.                          case '8':          back();         break;                   //                                                                                                                                        |         前进
  170.                          case '4':          left();                  break;                        //                                                                                                                                   7   8   9
  171.                          case '6':          right();        break;                        //                                                                                                          左转        <-         4   5   6         ->        右转
  172.                          case '5':           stop();                  break;                        //                                                                                                                                1   2   3
  173.                          case '1':    lanyabiaozhi=1;xunjibiaozhi=1;stop();   break;                        //        蓝牙控制开启  寻迹也开启   寻迹的时候能蓝牙控制小车                                     |         后退
  174.                          case '3':          xunjibiaozhi=1;lanyabiaozhi=0; break;        // 循迹控制开启,关闭蓝牙
  175.                          case '7':          xunjibiaozhi=0;lanyabiaozhi=1;  stop();   break;        //        寻迹标志结束 ,蓝牙开启
  176.                          default : break ;        }/*        count_flag=0;*/                                                                               
  177. }}
  178. //  主函数
  179. void main()
  180. {
  181.     chushihua();
  182.         while(1)
  183.         {
  184.                   if(lanyabiaozhi==1)
  185.                        {lanya();}
  186.                   if(xunjibiaozhi==1)
  187.                        {xunji();
  188.                           
  189.                            if (flag==1&&temp_data=='7')
  190.                            {   lanyabiaozhi=1;xunjibiaozhi=0;stop();
  191.                                                 flag=0;    }
  192.                            }
  193.         }
  194. }

  195. void serial() interrupt 4                //串口中断
  196. {
  197.       
  198.           
  199.           
  200.               RI=0;
  201.                   temp_data=SBUF;
  202.                   count_flag=1;
  203.                   flag=1;  
  204.                        
  205.           
  206. }

  207. void Timer_0() interrupt 1                          //定时器0中断
  208. {
  209.    TH0=(65536-200)/256;                         //每2ms计数一次
  210.    TL0=(65536-200)%256;
  211.    
  212.         pwm_A++;                                                  //pwm_A计数累计
  213.         pwm_B++;                                                  //pwm_B计数累计
  214.        
  215.         if(pwm_A<motor_A)
  216.             {ENA=1;}  
  217.             else {ENA=0;}
  218.         if(pwm_A>PWM)  pwm_A=0;

  219.         if(pwm_B<motor_B)
  220.             {ENB=1;}
  221.                 else {ENB=0;}
  222.          if(pwm_B>PWM) pwm_B=0;

  223.         }
复制代码


蓝牙寻迹小车参考程序.zip

36.27 KB, 下载次数: 13, 下载积分: 黑币 -5

评分

参与人数 2黑币 +62 收起 理由
be1008611 + 12 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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