这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » DIY迷你蓝牙小坦克,支持重力感应!(三)

共1条 1/1 1 跳转至

DIY迷你蓝牙小坦克,支持重力感应!(三)

高工
2013-10-12 09:52:07     打赏

在这期间对电路的接线改了一下,所以和上面的相比会有些变化,这个接口是用来充电和下载程序的。对了,那块黑黑的电池原来是 palm 手机的,单独用来给小电机供电。


装上外壳,准备收工了 


蓝牙模块和接口放在炮塔里,虽然充电和下载有点麻烦,先不管那么多了


装好了!跟买回来的时候没啥两样。嘿嘿


尾部原来充电的地方改成了指示灯


当打开电源的时候,指示灯就按照设定的频率一闪一闪的,表示单片机正在工作,如果灯不闪或者闪烁有异常,说明电量不足或者单片机有问题了


来一个帅气的侧面照




霸气测漏的炮管。。。


虽然它各种霸气外漏,但归根到底还是一个死物,所以我们要用程序让它动起来


首先是 drive.h 头文件,声明了几个接口,分别是左转,右转,前进,后退。具体由drive.c来实现相应的功能。

  1. #ifndef __DRIVE_H__
  2. #define __DRIVE_H__
  3. void Left();
  4. void Right();
  5. void Forward();
  6. void Backward();
  7. void Stop();
  8. #endif

然后是 drive.c,里面负责控制相应的电路,来实现小电机的转向,从而实现小坦克的左右转,前后退等
  1. #include <reg52.h>
  2. #include "drive.h"
  3. sbit L_A = P1^7;
  4. sbit L_B = P1^6;
  5. sbit R_A = P1^5;
  6. sbit R_B = P1^4;
  7. void Left()
  8. {
  9.     L_A = 1;
  10.     L_B = 0;
  11.     R_A = 0;
  12.     R_B = 1;
  13. }
  14. void Right()
  15. {
  16.     L_A = 0;
  17.     L_B = 1;
  18.     R_A = 1;
  19.     R_B = 0;
  20. }
  21. void Forward()
  22. {
  23.     L_A = 1;
  24.     L_B = 0;
  25.     R_A = 1;
  26.     R_B = 0;    
  27. }
  28. void Backward()
  29. {
  30.     L_A = 0;
  31.     L_B = 1;
  32.     R_A = 0;
  33.     R_B = 1;    
  34. }
  35. void Stop()
  36. {
  37.     L_A = 0;
  38.     L_B = 0;
  39.     R_A = 0;
  40.     R_B = 0;    
  41. }
最后是 main.c 也就是主模块。

  1. #include<reg51.h>
  2. #include "drive.h"
  3. sfr P1M1 = 0x91;    //这两个是让P1口设置为推挽输出
  4. sfr P1M0 = 0x92;                
  5. sbit L_A = P1^7;      //定义L9110所接的引脚,关于L9110的详细驱动方式见其PDF(其实跟L298差不多)
  6. sbit L_B = P1^6;
  7. sbit R_A = P1^5;
  8. sbit R_B = P1^4;
  9. sbit led_pin = P3^5;   //定义led所接的引脚
  10. unsigned char cmd;    //全局变量,用于存放蓝牙传过来的命令
  11. void led() interrupt 1   //led闪烁函数,由定时器T0产生中断,大约1.5秒闪烁一下
  12. {
  13.     unsigned char i;
  14.     i++;
  15.     if(i==15)
  16.     {
  17.         led_pin = !led_pin;
  18.         i=0;
  19.     }
  20.     TH0 = (65536-50000)/256;
  21.     TL0 = (65536-50000)%256;
  22. }
  23. void com() interrupt 4    //串口中断函数,当蓝牙传命令过来的时候执行
  24. {
  25.     RI  = 0;
  26.     cmd = SBUF;       //把收到的命令放到全局变量里面
  27. }
  28. void com_init()    //串口初始化函数,波特率9600bps
  29. {
  30.     TMOD = 0x00;
  31.     TMOD = 0x21;
  32.     TH1  = 0xfd;
  33.     TL1  = 0xfd;
  34.     TR1  = 1;
  35.     
  36.     REN  = 1;
  37.     SM0  = 0;
  38.     SM1  = 1;
  39.     EA   = 1;
  40.     ES   = 1;
  41. }
  42. void led_init()    //定时器0初始化函数,用于led闪烁
  43. {
  44.     TH0  = (65536-50000)/256;
  45.     TL0  = (65536-50000)%256;
  46.     ET0  = 1;
  47.     TR0  = 1;
  48. }
  49. void main()    //主函数
  50. {
  51. P1M1 = 0x00;    //设置P1口为推挽输出模式
  52. P1M0 = 0xff;
  53. com_init();    //串口初始化
  54. led_init();    //led闪烁定时器初始化
  55.     while(1)       //死循环,等待蓝牙传命令过来
  56.     {
  57.     switch(cmd)    //判断收到的命令是干嘛的,其中 1 是前进 2是后退 3是右转 4是左转,0是停止,以后还可以扩展其他的功能
  58.         {
  59.         case 1:Forward();break;        //前进
  60.         case 2:Backward();break;    //后退
  61.         case 3:Right();break;        //右转
  62.         case 4:Left();break;        //左转
  63.         case 0:Stop();break;        //停止
  64.         }
  65.     }
  66. }


程序写完后在keil 里编译一下,然后下载到单片机就OK了。




关键词: 迷你     蓝牙     坦克     支持     重力     感应    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]