找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙小车循迹

[复制链接]
跳转到指定楼层
楼主
ID:912725 发表于 2021-4-26 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • #include<reg52.h>
  • typedef unsigned char u8;        //宏定义无符号字符型         8位
  • typedef unsigned int  u16;        //宏定义无符号整形                16位
  • sbit PWM1 = P2^6;          //左电机高电平
  • sbit PWM2 = P2^5;          //右电机高电平
  • sbit IN1 = P2^4;
  • sbit IN2 = P2^3;          //左电机
  • sbit IN3 = P2^2;
  • sbit IN4 = P2^1;          //右电机
  • sbit S1 = P1^1;                  //左红外避障模块
  • sbit S2 = P1^2;                  //右红外避障模块
  • sbit S3 = P1^3;                  //左红外寻迹模块
  • sbit S4 = P1^4;                  //右红外寻迹模块
  • sbit K1 = P3^2;                  //功能转换按键
  • u8 connt;                          //调速周期
  • u8 PWM_NO;                          //高电平时间
  • u8 COM = 0;                          //功能控制位
  • u8 t=0;                                  //判断串口中断是否执行
  • void time(void)                                          //定时计时器初始化函数
  • {
  •     TMOD = 0x01;                                  //中断方式1
  •     TH0 = 0xfe;
  •     TL0 = 0x0c;                                          //0.5ms
  •     EA = 1;                                                  //打开总中断
  •     ET0 = 1;                                          //打开计时器中断
  •     TR0 = 1;                                          //启动计时器
  • }
  • void InitUART(void)                 //串口中断初始化函数
  • {
  •     SCON=0x50;                        //设置为工作方式1
  •         TMOD=0x20;                        //设置计数器工作方式2
  •         PCON=0x00;                        //波特率加倍
  •         TH1=0xfd;                                //计数器初始值设置,注意波特率是9600的
  •         TL1=0xfd;
  •         ES=1;                                                //打开接收中断
  •         EA=1;                                                //打开总中断
  •         TR1=1;                                        //打开计数器
  • }
  • void delay( u16 k )                   //延时大约1ms
  • {
  •     u16 i,j;
  •         for(i=k;i>0;i--)
  •         for(j=120;j>0;j--);
  • }
  • void SC()                                //刹车
  • {
  •     IN1 = 0;
  •         IN2 = 0;
  •         IN3 = 0;
  •         IN4 = 0;
  • }
  • void QJ()                                //前进
  • {
  •     IN1 = 1;
  •         IN2 = 0;
  •         IN3 = 1;
  •         IN4 = 0;
  • }
  • void HT()                                //后退
  • {
  •     IN1 = 0;
  •         IN2 = 1;
  •         IN3 = 0;
  •         IN4 = 1;
  • }
  • void ZZ1()                                //左大转
  • {
  •     IN1 = 0;
  •         IN2 = 1;
  •         IN3 = 1;
  •         IN4 = 0;
  • }
  • void ZZ2()                                //左小转
  • {
  •     IN1 = 0;
  •         IN2 = 0;
  •         IN3 = 1;
  •         IN4 = 0;
  • }
  • void YZ1()                                //右大转
  • {
  •     IN1 = 1;
  •         IN2 = 0;
  •         IN3 = 0;
  •         IN4 = 1;
  • }
  • void YZ2()                                //右小转
  • {
  •     IN1 = 1;
  •         IN2 = 0;
  •         IN3 = 0;
  •         IN4 = 0;
  • }
  • void HY()                                //后右转
  • {
  •     IN1 = 0;
  •         IN2 = 0;
  •         IN3 = 0;
  •         IN4 = 1;
  • }
  • void lin1()                                //红外避障程序
  • {
  •     if( S1 && S2 )                //两探头不反应,小车前进
  •     {
  •         QJ();
  •     }
  •     if( !S1 && S2 )                //左探头反应,小车右转
  •     {
  •             SC();
  •             delay(100);
  •             HT();
  •             delay(400);
  •             YZ1();
  •             delay(550);
  •             SC();
  •             delay(100);
  •     }
  •     if( S1 && !S2 )                //右探头反应,小车左转
  •     {
  •          SC();
  •          delay(100);
  •          HT();
  •          delay(400);
  •          ZZ1();
  •          delay(550);
  •          SC();
  •          delay(100);
  •     }
  •     if( !S1 && !S2 )                //两探头反应,小车后退,右转
  •     {
  •           SC();
  •           delay(100);
  •           HT();
  •           delay(400);
  •           HY();
  •           delay(550);
  •     }
  • }
  • void lin2()                                           //寻迹功能程序
  • {
  •     if( !S3 && !S4 )                //两探头反应,小车前进
  •     {
  •          QJ();
  •          delay(150);
  •          SC();
  •          delay(90);
  •     }
  •     if( S1 && S2 )                //两探头反应,小车停止
  •     {
  •         SC();
  •     }
  •     if( S3 && !S4 )                //左探头不反应,小车右转
  •     {
  •           SC();
  •           delay(90);
  •           YZ2();
  •           delay(120);
  •     }
  •     if( !S3 && S4 )                //右探头不反应,小车左转
  •     {
  •            SC();
  •            delay(90);
  •            ZZ2();
  •            delay(90);
  •     }
  • }
  • void lin3()                                                                   //物块追踪功能程序
  • {
  •     if( S1 && S2 )                //两探头不反应,小车停止
  •     {
  •           SC();
  •     }
  •     if( !S1 && !S2 )                //两探头反应,小车前进
  •     {
  •            QJ();
  •     }
  •     if( !S1 && S2 )                //右探头不反应,小车左转
  •     {
  •            ZZ1();
  •     }
  •     if( S1 && !S2 )                //左探头不反应,小车右转
  •     {
  •            YZ1();
  •     }
  • }
  • void lin4()                                                                  //魔术手功能程序
  • {
  •      if( S1 && S2 )                //两探头不反应,小车前进
  •      {
  •            QJ();
  •      }
  •      if( !S1 && !S2 )                //两探头反应,小车后退
  •      {
  •             HT();
  •      }
  •      if( !S1 && S2 )                //左探头反应,小车后退
  •      {
  •             HT();
  •      }
  •      if( S1 && !S2 )                //右探头反应,小车后退
  •      {
  •             HT();
  •      }
  • }
  • void konzi()                  //控制位
  • {
  •     if( K1 == 0 )
  •     {
  •         delay(10);
  •         if( K1 == 0 )
  •         {
  •             COM++;
  •         }
  •         while( !K1 );
  •     }
  •     if( COM == 5)
  •     {
  •         COM = 0;
  •                 t=0;
  •     }
  •     if( COM == 0 )
  •     {
  •         PWM_NO = 14;
  •     }
  •     else
  •     PWM_NO = 15;
  • }
  • void main ()                                   //主函数
  • {
  •     time();                                                     //计时器初始化
  •     InitUART();                                                 //串口初始化
  •     connt = 20;                                                 //PWM的一个周期
  •     PWM_NO = 14;                                         //调速,数值越大速度越慢
  •     IN1 = 0;
  •     IN2 = 0;
  •     IN3 = 0;
  •     IN4 = 0;                                                 //待机
  •     while(1)
  •     {
  •             konzi();
  •         switch(COM)                                           //功能选择区
  •             {
  •                 case 0: lin1();break;                //避障
  •                 case 1: lin2();break;                //寻迹
  •                 case 2: lin3();break;                //物体跟随
  •                 case 3: lin4();break;                //魔术手
  •                     case 4: t=1;SC();while(1);break;  //跳转到蓝牙控制
  •             }
  •     }
  • }
  • void Timer0Interrupt(void) interrupt 1                                 //计时器中断函数
  • {
  •     u8 non;
  •     TH0 = 0xfe;
  •     TL0 = 0x0c;
  •     non++;
  •     if( non == PWM_NO )
  •     {
  •              PWM1 = 1;
  •          PWM2 = 1;
  •     }
  •     if( non == connt )
  •     {
  •              non = 0;
  •          if( PWM_NO != 0)
  •         {
  •              PWM1 = 0;
  •              PWM2 = 0;
  •         }

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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