请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 5477|回复: 6

想做一个蓝牙避障小车,烧录进去小车切不能执行,请问各位大神要这么改才可以?

 关闭 [复制链接]

1

主题

4

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2018-4-18 13:29:02 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. typedef unsigned char u8;
  4. typedef unsigned int  u16;
  5. sbit PWM1 = P2^6;          //左电机高电平
  6. sbit PWM2 = P2^5;          //右电机高电平
  7. sbit IN1 = P2^4;
  8. sbit IN2 = P2^3;          //左电机
  9. sbit IN3 = P2^2;
  10. sbit IN4 = P2^1;          //右电机
  11. sbit S1 = P1^1;                  //左红外避障模块
  12. sbit S2 = P1^2;                  //右红外避障模块
  13. sbit S3 = P1^3;                  //左红外寻迹模块
  14. sbit S4 = P1^4;                  //右红外寻迹模块
  15. sbit K1 = P3^2;                  //功能转换按键
  16. u8 connt;                          //调速周期
  17. u8 PWM_NO;                          //高电平时间
  18. u8 COM = 0;                                  //功能控制位
  19. u8 i;

  20. void time(void)                                          //定时计时器初始化函数
  21. {
  22.     TMOD = 0x01;                                  //中断方式1
  23.     TH0 = 0xfe;
  24.     TL0 = 0x0c;                                          //0.5ms
  25.     EA = 1;                                                  //打开总中断
  26.     ET0 = 1;                                          //打开计时器中断
  27.     TR0 = 1;                                          //启动计时器
  28. }

  29. void InitUART(void)                 //串口中断初始化函数
  30. {
  31.     SCON=0x50;                        //设置为工作方式1
  32.         TMOD=0x20;                        //设置计数器工作方式2
  33.         PCON=0x00;                        //波特率加倍
  34.         TH1=0xfd;                                //计数器初始值设置,注意波特率是9600的
  35.         TL1=0xfd;
  36.         ES=1;                                                //打开接收中断
  37.         EA=1;                                                //打开总中断
  38.         TR1=1;                                        //打开计数器
  39. }

  40. void delay( u16 k )                   //延时大约1ms
  41. {
  42.     u16 i,j;
  43.         for(i=k;i>0;i--)
  44.         for(j=120;j>0;j--);
  45. }

  46. void SC()                                //刹车
  47. {
  48.     IN1 = 0;   
  49.         IN2 = 0;
  50.         IN3 = 0;
  51.         IN4 = 0;
  52. }
  53. void QJ()                                //前进
  54. {
  55.     IN1 = 1;   
  56.         IN2 = 0;
  57.         IN3 = 1;
  58.         IN4 = 0;
  59. }
  60. void HT()                                //后退
  61. {
  62.     IN1 = 0;   
  63.         IN2 = 1;
  64.         IN3 = 0;
  65.         IN4 = 1;
  66. }
  67. void ZZ1()                                //左转1
  68. {
  69.     IN1 = 0;   
  70.         IN2 = 1;
  71.         IN3 = 1;
  72.         IN4 = 0;
  73. }
  74. void ZZ2()                                //左转2
  75. {
  76.     IN1 = 0;   
  77.         IN2 = 0;
  78.         IN3 = 1;
  79.         IN4 = 0;
  80. }
  81. void YZ1()                                //右转1
  82. {
  83.     IN1 = 1;   
  84.         IN2 = 0;
  85.         IN3 = 0;
  86.         IN4 = 1;
  87. }
  88. void YZ2()                                //右转2
  89. {
  90.     IN1 = 1;   
  91.         IN2 = 0;
  92.         IN3 = 0;
  93.         IN4 = 0;
  94. }
  95. void HY()                                //后右转
  96. {
  97.     IN1 = 0;   
  98.         IN2 = 0;
  99.         IN3 = 0;
  100.         IN4 = 1;
  101. }

  102. void lin1()                                //红外避障程序
  103. {
  104.     if( S1 && S2 && PWM1 && PWM2 && (COM == 0) )                //两探头不反应,小车前进
  105.         {
  106.             delay(10);                                                //消抖
  107.                 if( S1 && S2 && PWM1 && PWM2 && (COM == 0) )
  108.                 {
  109.                     QJ();
  110.                 }
  111.         }
  112.         if( !S1 && S2 && PWM1 && PWM2 && (COM == 0) )                //左探头反应,小车右转
  113.         {
  114.             delay(10);                                                //消抖
  115.                 if( !S1 && S2 && PWM1 && PWM2 && (COM == 0) )
  116.                 {
  117.                     SC();
  118.                         delay(100);
  119.                     HT();
  120.                         delay(400);
  121.                     YZ1();
  122.                         delay(550);
  123.                         SC();
  124.                         delay(100);
  125.                 }
  126.         }
  127.         if( S1 && !S2 && PWM1 && PWM2 && (COM == 0) )                //右探头反应,小车左转
  128.         {
  129.             delay(10);                                                //消抖
  130.                 if( S1 && !S2 && PWM1 && PWM2 && (COM == 0) )
  131.                 {
  132.                     SC();
  133.                         delay(100);
  134.                     HT();
  135.                         delay(400);
  136.                     ZZ1();
  137.                         delay(550);
  138.                         SC();
  139.                         delay(100);
  140.                 }
  141.         }
  142.         if( !S1 && !S2 && PWM1 && PWM2 && (COM == 0) )                //两探头反应,小车后退,右转
  143.         {
  144.             delay(10);                                                //消抖
  145.                 if( !S1 && !S2 && PWM1 && PWM2 && (COM == 0) )
  146.                 {
  147.                     SC();
  148.                         delay(100);
  149.                         HT();
  150.                         delay(400);
  151.                     HY();
  152.                         delay(550);
  153.                 }
  154.         }
  155. }

  156. void lin2()                                           //寻迹功能程序
  157. {
  158.     if( !S3 && !S4 && PWM1 && PWM2 && (COM == 1) )                //两探头反应,小车前进
  159.         {
  160.             delay(10);                                                //消抖
  161.                 if( !S3 && !S4 && PWM1 && PWM2 && (COM == 1) )
  162.                 {
  163.                     QJ();
  164.                         delay(150);
  165.                         SC();
  166.                         delay(90);
  167.                 }
  168.         }
  169.         if( S1 && S2 && PWM1 && PWM2 && (COM == 1) )                //两探头反应,小车停止
  170.         {
  171.             delay(10);                                                //消抖
  172.                 if( S1 && S2 && PWM1 && PWM2 && (COM == 1) )
  173.                 {
  174.                     SC();
  175.                 }
  176.         }
  177.         if( S3 && !S4 && PWM1 && PWM2 && (COM == 1) )                //左探头不反应,小车右转
  178.         {
  179.             delay(10);                                                //消抖
  180.                 if( S3 && !S4 && PWM1 && PWM2 && (COM == 1) )
  181.                 {
  182.                     SC();
  183.                         delay(90);
  184.                         YZ2();
  185.                         delay(120);
  186.                 }
  187.         }
  188.         if( !S3 && S4 && PWM1 && PWM2 && (COM == 1) )                //右探头不反应,小车左转
  189.         {
  190.             delay(10);                                                //消抖
  191.                 if( !S3 && S4 && PWM1 && PWM2 && (COM == 1) )
  192.                 {
  193.                     SC();
  194.                         delay(90);
  195.                         ZZ2();
  196.                         delay(90);
  197.                 }
  198.         }   
  199. }

  200. void lin3()                                                                   //物块追踪功能程序
  201. {
  202.     if( S1 && S2 && PWM1 && PWM2 && (COM == 2) )                //两探头不反应,小车停止
  203.         {
  204.             delay(10);                                                //消抖
  205.                 if( S1 && S2 && PWM1 && PWM2 && (COM == 2) )
  206.                 {
  207.                     SC();
  208.                 }
  209.         }
  210.     if( !S1 && !S2 && PWM1 && PWM2 && (COM == 2) )                //两探头反应,小车前进
  211.         {
  212.             delay(10);                                                //消抖
  213.                 if( !S1 && !S2 && PWM1 && PWM2 && (COM == 2) )
  214.                 {
  215.                     QJ();
  216.                 }
  217.         }
  218.         if( !S1 && S2 && PWM1 && PWM2 && (COM == 2) )                //右探头不反应,小车左转
  219.         {
  220.             delay(10);                                                //消抖
  221.                 if( !S1 && S2 && PWM1 && PWM2 && (COM == 2) )
  222.                 {
  223.                     ZZ1();
  224.                 }
  225.         }
  226.         if( S1 && !S2 && PWM1 && PWM2 && (COM == 2) )                //左探头不反应,小车右转
  227.         {
  228.             delay(10);                                                //消抖
  229.                 if( S1 && !S2 && PWM1 && PWM2 && (COM == 2) )
  230.                 {
  231.                     YZ1();
  232.                 }
  233.         }   
  234. }

  235. void lin4()                                                                  //魔术手功能程序
  236. {
  237.      if( S1 && S2 && PWM1 && PWM2 && (COM == 3) )                //两探头不反应,小车前进
  238.         {
  239.             delay(10);                                                //消抖
  240.                 if( S1 && S2 && PWM1 && PWM2 && (COM == 3) )
  241.                 {
  242.                     QJ();
  243.                 }
  244.         }
  245.         if( !S1 && !S2 && PWM1 && PWM2 && (COM == 3) )                //两探头反应,小车后退
  246.         {
  247.             delay(10);                                                //消抖
  248.                 if( !S1 && !S2 && PWM1 && PWM2 && (COM == 3) )
  249.                 {
  250.                     HT();
  251.                 }
  252.         }
  253.         if( !S1 && S2 && PWM1 && PWM2 && (COM == 3) )                //左探头反应,小车后退
  254.         {
  255.             delay(10);                                                //消抖
  256.                 if( !S1 && S2 && PWM1 && PWM2 && (COM == 3) )
  257.                 {
  258.                     HT();
  259.                 }
  260.         }
  261.         if( S1 && !S2 && PWM1 && PWM2 && (COM == 3) )                //右探头反应,小车后退
  262.         {
  263.             delay(10);                                                //消抖
  264.                 if( S1 && !S2 && PWM1 && PWM2 && (COM == 3) )
  265.                 {
  266.                     HT();
  267.                 }
  268.         }
  269. }

  270. void lin5()                                                                          //蓝牙遥控功能程序
  271. {
  272.         switch(i)
  273.        {
  274.            case 0: QJ(); break;
  275.            case 5: SC(); break;
  276.            case 2: ZZ2(); break;
  277.            case 3: YZ2(); break;
  278.                    case 4: HT(); break;

  279.        }
  280.          
  281. }   


  282. void main ()                                   //主函数
  283. {
  284.     time();                                                     //计时器初始化
  285.     InitUART();                                                 //串口初始化
  286.         connt = 20;
  287.         PWM_NO = 14;
  288.         IN1 = 0;
  289.         IN2 = 0;
  290.         IN3 = 0;
  291.         IN4 = 0;                                                 //待机
  292.         while(1)
  293.         {
  294.             if( K1 == 0 )
  295.                 {
  296.                     delay(10);
  297.                         if( K1 == 0 )
  298.                         {
  299.                             COM++;
  300.                         }
  301.                         while( !K1 );
  302.                 }
  303.                 if( COM == 5)
  304.                 {
  305.                     COM = 0;
  306.                 }
  307. //                if( COM == 4)
  308. //                {
  309. //                    TI=RI=1;
  310. //                        while(1);
  311. //                }
  312.                 else TI=RI=0;
  313.                 if( COM == 0 )
  314.                 {
  315.                     PWM_NO = 14;
  316.                 }
  317.                 else
  318.                 PWM_NO = 16;
  319.                 lin1();
  320.                 lin2();
  321.                 lin3();
  322.                 lin4();
  323.                
  324.         }
  325. }

  326. void Timer0Interrupt(void) interrupt 1                                 //计时器中断函数
  327. {
  328.     u8 non;
  329.     TH0 = 0xfe;
  330.     TL0 = 0x0c;
  331.     non++;
  332.         if( non == PWM_NO )
  333.         {
  334.             PWM1 = 1;
  335.                 PWM2 = 1;
  336.         }
  337.         if( non == connt )
  338.         {
  339.             non = 0;
  340.                 if( PWM_NO != 0)
  341.                 {
  342.                     PWM1 = 0;
  343.                         PWM2 = 0;
  344.                 }
  345.         }
  346. }

  347. void UARTInterrupt(void) interrupt 4                         //串口中断函数
  348. {
  349.     u8 receiveData;
  350.     if(RI==1)                    //是否有数据到来 1为是 0为否
  351.     {
  352.         receiveData = SBUF;                   //暂存接收到的数据
  353.                 i = receiveData;
  354.         RI = 0;
  355.     }
  356.         lin5();
  357. }
复制代码
回复

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2018-4-18 14:24:44 | 显示全部楼层
就想问一句,你的代码与你的硬件是否相匹配
回复 支持 反对

使用道具 举报

1

主题

4

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2018-4-18 17:42:33 | 显示全部楼层
大瓶子凌凌漆 发表于 2018-4-18 14:24
就想问一句,你的代码与你的硬件是否相匹配

匹配啊,就是加上串口中断它就不执行了
回复 支持 反对

使用道具 举报

42

主题

563

帖子

1907

积分

金牌会员

Rank: 6Rank: 6

积分
1907
发表于 2018-4-19 07:52:00 | 显示全部楼层
披衣石头 发表于 2018-4-18 17:42
匹配啊,就是加上串口中断它就不执行了

那你问题要写清楚,你的意思是原来小车是可以避障功能,加上蓝牙就有问题了呗?那就先调试一下看看程序卡哪里了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2018-4-19 12:12:32 | 显示全部楼层
大瓶子凌凌漆 发表于 2018-4-19 07:52
那你问题要写清楚,你的意思是原来小车是可以避障功能,加上蓝牙就有问题了呗?那就先调试一下看看程序卡 ...

已经调试很多次了,但还是不行,可以指点一下吗?
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8339

积分

论坛元老

Rank: 8Rank: 8

积分
8339
发表于 2018-4-19 13:06:00 | 显示全部楼层
披衣石头 发表于 2018-4-19 12:12
已经调试很多次了,但还是不行,可以指点一下吗?

程序的思路是大大的有问题啊。
看你的主函数的语句:
红外避障程序、寻迹功能程序、物块追踪功能程序、魔术手功能程序,这四个功能是无条件顺序执行的。
你估算过没有,每个功能的那几条语句能执行多少时间?
就算你的串口有蓝牙数据来了,那么,你的蓝牙遥控功能程序又会运行多少时间?
我看你的程序,就是这样的:
你先通过按键调速,是吧?!我没按键(或者按键不及时),不调速,程序都执行到上面我截图处了,是吧?!
接着就每个功能执行一下下,可能小车都还来不及反应,就到下一个功能去了,所以,现像上,我们看小车根本没什么动作,就是你说的不能执行。
接着我用蓝牙发一数据,小车同样只在蓝牙遥控功能程序那里执行一下下,还没反应过来呢,语句执行完了,又进入其它功能去了,而其它功能同上述所说,没反应。所以,你的小车所有功能都不会有反应的,与你的蓝牙无关


我有一个小车,有避障、寻迹、跟随三个功能,我的程序思路是:
第一:什么条件下,让某个功能语句一直执行,让小车的动作体现出这一个功能。
第二:什么条件下,切换功能。三个功能不会同时进行的,如避障同时寻迹,可能吗?轨迹路上有障碍,就避障,你就不能寻迹了嘛;再如:小车正在寻迹行驶,你蓝牙叫它左转,它是转还是不转?转了,就不能寻迹,不转,就没有听你的命令,你让小车好难做啊,你不是坏人吧?!哈哈哈
第三:什么条件下停车,让车休息,程序员想想小车反应正常不,需要不需要修改程序,或各个功能是否达到要求,有没有需要修改的地方。


你再好好想想吧!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

1

主题

4

帖子

40

积分

新手上路

Rank: 1

积分
40
 楼主| 发表于 2018-4-19 18:23:23 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-4-19 13:06
程序的思路是大大的有问题啊。
看你的主函数的语句:
红外避障程序、寻迹功能程序、[/back ...

我的按键时切换功能的啊
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 02:06 , Processed in 0.088391 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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