找回密码
 立即注册

QQ登录

只需一步,快速开始

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

萌新的蓝牙控制小车程序制作

[复制链接]
跳转到指定楼层
楼主
ID:254430 发表于 2018-3-4 16:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
尝试做了下,应该说模仿制作了个关于蓝牙控制的小车避障,还在细化

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<math.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar Buffer[4] = {0}; //从串口接收的数据
  6. uint i,j;
  7. sbit ENA=P1^5; /* L298的Enable A */
  8. sbit ENB=P1^0; /* L298的Enable B */
  9. sbit IN1=P1^4; /* L298的Input 1 */
  10. sbit IN2=P1^3; /* L298的Input 2 */
  11. sbit IN3=P1^2; /* L298的Input 3 */
  12. sbit IN4=P1^1; /* L298的Input 4 */
  13. sbit ISS=P2^1;/*红外传感信号接收口*/
  14. uchar a=20;
  15. uchar t=0; /* 中断计数器 */
  16. uchar m1=0; /* 电机1速度值 */
  17. uchar m2=0; /* 电机2速度值 */
  18. uchar tmp1,tmp2; /* 电机当前速度值 */

  19. /****************************************延时程序 Delay_1ms()******************************************/
  20. void Delay_1ms(uint i)//1ms延时
  21. {
  22.                 uchar x,j;
  23.                 for(j=0;j<i;j++)
  24.                 for(x=0;x<=148;x++);
  25. }

  26. /********************************************************************
  27. * 名称 : Init()
  28. * 功能 : 初始化,晶振11.0592,波特率9600,使串口中断,同时定时器0控制PWM
  29. ***********************************************************************/
  30. void Init(void)
  31. {
  32.         TMOD = 0x22; //8 位自动重装计数
  33.         PCON = 0x00;
  34.         SCON = 0x50;//串行口控制寄存器 SM1=1,SM0=0方式一波特率可变
  35.         TH0=0x9b;
  36.         TL0=0x9b;
  37.         TH1= 0xFd; //设置波特率 9600
  38.         TL1= 0xFd;
  39.         TR1=1; //启动定时器1
  40.         ET0=1;
  41.         TR0=1;
  42.         ES = 1; //开串口中断
  43.         EA = 1; //开总中断
  44. }
  45. void motorL( char speed)
  46. {         m1=abs(speed); /* 取速度的绝对值 */
  47.         if(speed>0)
  48.                 {
  49.                    IN1=0;           //正转
  50.                    IN2=1;
  51.                  }
  52.      else
  53.            {  
  54.               IN1=1;
  55.                      IN2=0;        //倒转
  56.                        

  57.                  }  
  58. }
  59. void motorR( char speed)
  60. {
  61.         m2=abs(speed); /* 电机2的速度控制 */
  62.         if(speed>0)
  63.                 {
  64.                   IN3=0;
  65.                   IN4=1;
  66.                  }
  67.         else
  68.                  {       
  69.                   IN3=1;
  70.                   IN4=0;
  71.                  }  
  72. }
  73. void GO(void)

  74.         {       
  75.                 motorL(a);
  76.                 motorR(a);

  77.        
  78.         }
  79. void BACK()
  80.         {       
  81.                 motorL(-20);
  82.                 motorR(-20);

  83.         }
  84. void TL(void)
  85.         {
  86.                 motorL(30);
  87.                 motorR(50);

  88.         }
  89. void TR(void)
  90.         {       
  91.                 motorL(50);
  92.                 motorR(30);

  93.         }

  94. void STOP(void)
  95.         {
  96.                 IN1=1;
  97.                 IN2=1;
  98.                 IN3=1;
  99.                 IN4=1;
  100.         }

  101. void dang1(viod)
  102.    {
  103.      motorL(20);
  104.          motorR(20);

  105.    }
  106. void dang2(viod)
  107.    {
  108.      motorL(30);
  109.          motorR(30);

  110.                    }
  111. void dang3(viod)
  112.    {
  113.      motorL(40);
  114.          motorR(40);

  115.    }
  116. void main()
  117. {
  118.         Delay_1ms(100);
  119.         Init();//初始化


  120.         while(1)
  121.         {
  122.                         switch(Buffer[0])
  123.                         {
  124.                                 case 0X00: STOP(); break;                   

  125.                                 case 0X01:GO(); break;                                

  126.                                 case 0X03: TR(); break;                       

  127.                                 case 0X02:  BACK();break;                       

  128.                                 case 0X04:  TL();  break;            
  129.                                
  130.                                 case 0x05:  dang1();break;                           
  131.                        
  132.                                 case 0x06:  dang2();break;

  133.                                 case 0x07:  dang3();break;
  134.                                
  135.                                 default:break;
  136.                         }
  137.          if(ISS==0)
  138.          {
  139.      motorL(0);
  140.          motorR(0);
  141.          STOP();
  142.            }
  143.         }
  144. }

  145. void Com_Int(void) interrupt 4
  146.         {
  147.        
  148.                  EA = 0;
  149.                 if(RI == 1) //当硬件接收到一个数据时,RI会置位
  150.                 {
  151.                         Buffer[0] = SBUF ;
  152.                         RI = 0;
  153.        
  154.                 }
  155.                 EA = 1;
  156.         }
  157. void timer0() interrupt 1 /* T0中断服务程序 */
  158.         {
  159.                 if(t==0) /* 1个PWM周期完成后才会接受新数值 */
  160.                 {         tmp1=m1;
  161.                           tmp2=m2;
  162.                 } //这个一开始车子的速度为零
  163.                 if(t<tmp1) ENA=1; else ENA=0; /* 产生电机1的PWM信号 */
  164.                 if(t<tmp2) ENB=1; else ENB=0; /* 产生电机2的PWM信号 */
  165.                 t++;
  166.                 if(t>=50) t=0; /* 1个PWM信号由100次中断产生 */
  167.         }
复制代码

下载:
蓝牙1.5.rar (25.8 KB, 下载次数: 4)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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