找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机蓝牙控制小车程序

[复制链接]
跳转到指定楼层
楼主
ID:405955 发表于 2018-10-6 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51单片机蓝牙控制小车程序

单片机源程序如下:
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

  2. typedef unsigned int u16;          //对数据类型进行声明定义
  3. typedef unsigned char u8;

  4. sbit IN1=P1^0;               
  5. sbit IN2=P1^1;
  6. sbit IN3=P1^2;                                                                                       
  7. sbit IN4=P1^3;

  8. sbit PWM_L=P2^6;         
  9. sbit PWM_R=P2^7;

  10. #define CAR_SPEED_MAX 10

  11. #define up       'A'
  12. #define down     'B'
  13. #define left     'C'
  14. #define right    'D'
  15. #define stop     'E'
  16. #define ALL                 'F'
  17. #define speed5         '2'
  18. #define speed10         '8'

  19. #define L_go            IN1=0;IN2=1 //左轮前进
  20. #define L_back          IN1=1;IN2=0 //左轮后退   
  21. #define L_stop          IN1=0;IN2=0 //左轮停止,两个输出1也可以
  22. #define R_go            IN3=0;IN4=1 //右轮前进
  23. #define R_back          IN3=1;IN4=0 //右轮后退
  24. #define R_stop          IN3=0;IN4=0 //右轮停止,两个输出1也可以

  25. #define car_go               L_go;R_go                  //小车前进
  26. #define car_back             L_back;R_back              //小车后退
  27. #define car_left             R_go;L_stop                //小车左转弯
  28. #define car_right            L_go;R_stop                //小车右转弯
  29. #define car_stop             L_stop;R_stop              //小车停车
  30. #define car_left_360         R_go;L_back                //小车向左360度转,是大转弯
  31. #define car_right_360        L_go;R_back                //小车向右360度转,是大转弯


  32. u8 HighRH = 0;
  33. u8 HighRL = 0;
  34. u8 LowRH = 0;
  35. u8 LowRL = 0;

  36. bit  flag_REC=0;
  37. bit  flag=0;
  38. u8   i=0;
  39. u8   dat=0;
  40. u8   buff[5]=0; //接收缓冲字节

  41. /*******************************************************************************
  42. * 函数名         :UsartInit()
  43. * 函数功能                   :设置串口
  44. * 输入           : 无
  45. * 输出                  : 无
  46. *******************************************************************************/
  47. void UsartInit()
  48. {
  49.         SCON=0X50;                        //设置为工作方式1
  50.         TMOD=0X20;                        //设置计数器工作方式2
  51.         PCON=0X00;                        //波特率加倍
  52.         TH1=0XFd;                                //计数器初始值设置,注意波特率是9600的
  53.         TL1=0XFd;
  54.         ES=1;                                                //打开接收中断
  55.         EA=1;                                                //打开总中断
  56.         TR1=1;                                        //打开计数器
  57. }

  58. void ConfigPWM(unsigned int fr, unsigned char dc)
  59. {
  60.         unsigned long tmp;
  61.         unsigned int high, low;

  62.         tmp = 11059200/12/fr;
  63.         high = (tmp*dc)/100;
  64.         low = tmp - high;
  65.         high = 65536 - high + 12;
  66.         low = 65536 - low + 12;
  67.         HighRH = (unsigned char)(high >>8);
  68.         HighRL = (unsigned char)high;
  69.         LowRH = (unsigned char)(low >> 8);
  70.         LowRL = (unsigned char)low;
  71.         TMOD &= 0xF0;
  72.         TMOD |= 0x01;
  73.         TH0 = HighRH;
  74.         TL0 = HighRL;
  75.         ET0 = 1;
  76.         TR0 = 1;
  77.         PWM_L = 1;
  78.         PWM_R = 1;
  79.         EA = 1;
  80. }


  81. void ControlCar()
  82. {
  83.              if(flag_REC==1)                                    //
  84.            {
  85.           
  86.                 flag_REC=0;
  87.                 if(buff[0]=='O'&&buff[1]=='N')        //第一个字节为O,第二个字节为N,第三个字节为控制码
  88.                 switch(buff[2])
  89.              {
  90.                       case up:                                                        // 前进
  91.                              car_go;                            
  92.                              break;
  93.                       case down:                                                // 后退
  94.                              car_back;
  95.                              break;
  96.                       case left:                                                // 左转
  97.                              car_left;
  98.                              break;
  99.                       case right:                                                // 右转
  100.                              car_right;
  101.                              break;
  102.                       case stop:                                                // 停止
  103.                              car_stop;
  104.                              break;
  105.                           case speed5:                          
  106.                          ConfigPWM(100,30);
  107.                              break;                                      
  108.                            case speed10:                     
  109.                                ConfigPWM(100,60);
  110.                              break;
  111.                           case ALL:                                                // 停止
  112.                              car_stop;
  113.                              break;                                      
  114.              }
  115.                                          
  116.          }
  117. }
  118. /*******************************************************************************
  119. * 函 数 名       : main
  120. * 函数功能                 : 主函数
  121. * 输    入       : 无
  122. * 输    出             : 无
  123. *******************************************************************************/
  124. void main()
  125. {       
  126.         UsartInit();  //        串口初始化
  127.         ConfigPWM(100,40);
  128.         while(1)
  129.         {
  130.                 ControlCar();
  131.         }               
  132. }


  133. void InterruptTimer0() interrupt 1
  134. {
  135.     if (PWM_L == 1&&PWM_R == 1)  //当前输出为高电平时,装载低电平值并输出低电平
  136.     {
  137.         TH0 = LowRH;
  138.         TL0 = LowRL;
  139.         PWM_L  = 0;
  140.                 PWM_R  = 0;
  141.     }
  142.     else              //当前输出为低电平时,装载高电平值并输出高电平
  143.     {
  144.         TH0 = HighRH;
  145.         TL0 = HighRL;
  146.         PWM_L  = 1;
  147.                 PWM_R  = 1;
  148.     }
  149. }

  150. /*******************************************************************************
  151. * 函数名         : Usart() interrupt 4
  152. * 函数功能                  : 串口通信中断函数
  153. * 输入           : 无
  154. * 输出                  : 无
  155. *******************************************************************************/
  156. void sint() interrupt 4          //中断接收3个字节
  157. {

  158.     if(RI)                         //是否接收中断
  159.     {
  160.        RI=0;
  161.        dat=SBUF;
  162.        if(dat=='O'&&(i==0)) //接收数据第一帧
  163.          {
  164.             buff[i]=dat;
  165.             flag=1;        //开始接收数据
  166.          }
  167.        else
  168.       if(flag==1)
  169.       {
  170.        i++;
  171.        buff[i]=dat;
  172.        if(i>=2)
  173.        {
  174.               i=0;
  175.                   flag=0;
  176.                   flag_REC=1;
  177.            }  // 停止接收
  178.       }
  179.         }
  180. }
复制代码

所有资料51hei提供下载:
蓝牙程序-小车.rar (29.35 KB, 下载次数: 28)


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

使用道具 举报

沙发
ID:508963 发表于 2019-4-10 17:35 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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