找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机小车程序 在寻迹过程中好像并没有调到速?求帮助

[复制链接]
跳转到指定楼层
楼主
ID:703117 发表于 2020-5-11 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
蓝牙控制小车的,蓝牙是HC-06,功能是用蓝牙控制小车前后左右和寻迹功能,现在功能能够实现,但是在寻迹过程中好像并没有调到速,我明明写了PWM,有点奇怪
#include "reg52.h"
#include <intrins.h>
sbit IN1=P1^0;  //定义驱动模块IN1为P1.0                  左上电机 M2                OUT1 OUT2
sbit IN2=P1^1;        //定义驱动模块IN2为P1.1
sbit IN3=P1^2;        //定义驱动模块IN3为P1.2                  左下电机 M3                OUT3 OUT4
sbit IN4=P1^3;        //定义驱动模块IN4为P1.3
sbit IN5=P1^4;        //定义驱动模块IN5为P1.4                  右上电机 M1                OUT5 OUT6
sbit IN6=P1^5;        //定义驱动模块IN6为P1.5
sbit IN7=P1^6;        //定义驱动模块IN7为P1.6                  右下电机 M4                OUT7 OUT8
sbit IN8=P1^7;        //定义驱动模块IN8为P1.7

sbit left_led=P2^5;           //定义左路寻迹为P2.5
sbit middle_led=P2^6;  //定义中路寻迹为P2.6
sbit right_led=P2^7;   //定义右路寻迹为P2.7

#define Left_moto_go      {IN1=1,IN2=0,IN3=1,IN4=0;}    //左边两个电机向前走
#define Left_moto_back    {IN1=0,IN2=1,IN3=0,IN4=1;}         //左边两个电机向后转
#define Left_moto_Stop    {IN1=0,IN2=0,IN3=0,IN4=0;}    //左边两个电机停转                             
#define Right_moto_go     {IN5=1,IN6=0,IN7=1,IN8=0;}        //右边两个电机向前走
#define Right_moto_back   {IN5=0,IN6=1,IN7=0,IN8=1;}        //右边两个电机向后转
#define Right_moto_Stop   {IN5=0,IN6=0,IN7=0,IN8=0;}        //右边两个电机停转

        #define Left_moto_go1      {IN1=1,IN3=1;}        //左边两个电机向前走
        #define Left_moto_back1    {IN1=0,IN3=0;}            //左边两个电机向后转                  
        #define Right_moto_go1     {IN5=1,IN7=1;}               //右边两个电机向前走
        #define Right_moto_back1   {IN5=0,IN7=0;}               //右边两个电机向后走

#define M2_moto_pwm          IN2         //PWM信号端        左上电机M2
#define M3_moto_pwm          IN4         //                                左下电机M3
#define M1_moto_pwm          IN6         //                                右上电机M1
#define M4_moto_pwm          IN8         //                                右下电机M4

unsigned char pwm_val_left  =0;//变量定义
unsigned char push_val_left =0;//左电机占空比N/10
unsigned char pwm_val_right =0;//变量定义
unsigned char push_val_right=0;//右电机占空比N/10

bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned  int  timer0=0;

        #define left     'C'            //左转
    #define right    'D'                //右转
        #define up       'A'            //前进
    #define down     'B'                //后退
        #define stop     'F'                //停止
        #define Car      '1'            //手机软件1号键
        
        char code str[] =  "收到指令,向前!\n";
        char code str1[] = "收到指令,向后!\n";
        char code str2[] = "收到指令,向左!\n";
        char code str3[] = "收到指令,向右!\n";
        char code str4[] = "收到指令,停止!\n";

        bit  flag_REC=0;
        bit  flag    =0;
        bit  flag_xj =0;

        unsigned char  i=0;
        unsigned char  dat=0;
    unsigned char  buff[5]=0; //接收缓冲字节
//延时函数        
void delay(unsigned int k)
{   
     unsigned int x,y;
         for(x=0;x<k;x++)
         for(y=0;y<2000;y++);
}
//全速前进
     void  run(void)
{

         Left_moto_go ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}

//前速后退
     void  backrun(void)
{

         Left_moto_back ;   //左电机往前走
         Right_moto_back ;  //右电机往前走
}

//左转
     void  leftrun(void)
{

         Left_moto_back ;   //左电机往前走
         Right_moto_go ;  //右电机往前走
}

//右转
     void  rightrun(void)
{

         Left_moto_go ;   //左电机往前走
         Right_moto_back ;  //右电机往前走
}
//停止
     void  stoprun(void)
{

         Left_moto_Stop ;   //左电机往前走
         Right_moto_Stop ;  //右电机往前走
}
//PWM前进函数
void  run_pwm(void)
{
         push_val_left=7;        //速度调节变量 0-9。。。9最小,0最大
         push_val_right=7;        //速度调节变量 0-9。。。9最小,0最大
         Left_moto_go1 ;    //左电机往前走
         Right_moto_go1 ;   //右电机往前走
}
//PWM后退函数
void  backrun_pwm(void)
{
    push_val_left=7;        //速度调节变量 0-9。。。9最小,0最大
        push_val_right=7;        //速度调节变量 0-9。。。9最小,0最大
        Left_moto_back1 ;   //左电机往后走
        Right_moto_back1 ;  //右电机往后走
}
//PWM左转函数
void  leftrun_pwm(void)
{
     push_val_left=7;        //速度调节变量 0-9。。。9最小,0最大
         push_val_right=7;        //速度调节变量 0-9。。。9最小,0最大
         Left_moto_Stop ;   //左电机往前走
         Right_moto_go1 ;    //右电机往后走
}
//PWM右转函数
void  rightrun_pwm(void)
{
     push_val_left=7;        //减低一半速度         速度调节变量 0-9。。。9最小,0最大
         push_val_right=7;        //减低一半速度         速度调节变量 0-9。。。9最小,0最大
         Left_moto_go1 ;     //左电机往前走
         Right_moto_Stop ;  //右电机往后走
}
void xunji()
{
if(right_led==1&&middle_led==1&&left_led==1) //三路检测到黑线
                {
                 run_pwm();//前进
                }
                  else
                {
            if(right_led==1&&middle_led==0&&left_led==0) //右边检测到黑线
                {
                 rightrun_pwm();//右转
                }        
                if(right_led==0&&middle_led==0&&left_led==1) //左边检测到黑线
                {
                 leftrun_pwm();//左转
                }        
       }
}
//左电机调速
void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
               {
                     M2_moto_pwm=1;          //M2的PWM
                     M3_moto_pwm=1;          //M3的PWM
                   }
          else
               {
                 M2_moto_pwm=0;
                     M3_moto_pwm=0;
                   }
        if(pwm_val_left>=10)
               pwm_val_left=0;
   }
    else   
          {
           M2_moto_pwm=0;
           M3_moto_pwm=0;
                  }
}
//右电机调速
void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
              {
               M1_moto_pwm=1;            //M1
                   M4_moto_pwm=1;            //M4
                   }
        else
              {
                   M1_moto_pwm=0;
                   M4_moto_pwm=0;
                  }
        if(pwm_val_right>=10)
               pwm_val_right=0;
   }
   else   
          {
           M1_moto_pwm=0;
           M4_moto_pwm=0;
              }
}
void Time0Config()
{
        TMOD|= 0x01;   //设置定时计数器工作方式1为定时器
        
        //--定时器赋初始值,12MHZ下定时0.5ms--//  
        TH0 = 0xFF;
        TL0 = 0x9C;
        ET0 = 1;          //开启定时器1中断
        EA  = 1;
        TR0 = 1;         //开启定时器        
}
void Time0(void) interrupt 1    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断

{
    TH0 = 0xFF;
        TL0 = 0x9C;
    timer0++;  
        pwm_val_left++;
        pwm_val_right++;
        pwm_out_left_moto();
        pwm_out_right_moto();
}
//串口初始化函数
void init()
{
   TMOD=0x20;  //定时器T1工作模式2,8位自动重装
   TH1=0xF3;   // 4800波特率
   TL1=0xF3;
   SCON=0x50;  
   PCON=0x80;
   TR1=1;           //启动定时器T1
   REN=1;      //允许串口通讯
   EA =1;           //打开总中断
   ES =1;           //串口中断打开
}
//字符串发送函数
          void send_str( )
                   // 传送字串
    {
            unsigned char i = 0;
            while(str[ i] != '\0')
           {
                SBUF = str[ i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }        
    }
        
                  void send_str1( )
                   // 传送字串
    {
            unsigned char i = 0;
            while(str1[ i] != '\0')
           {
                SBUF = str1[ i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }        
    }        

                          void send_str2( )
                   // 传送字串
    {
            unsigned char i = 0;
            while(str2[ i] != '\0')
           {
                SBUF = str2[ i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }        
    }        
                    
                          void send_str3()
                   // 传送字串
    {
            unsigned char i = 0;
            while(str3[ i] != '\0')
           {
                SBUF = str3[ i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }        
    }        

              void send_str4()
                   // 传送字串
    {
            unsigned char i = 0;
            while(str4[ i] != '\0')
           {
                SBUF = str4[ i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }        
    }        

                    
void sint() interrupt 4          //中断接收3个字节
{

    if(RI)                         //是否接收中断
    {
       RI=0;
       dat=SBUF;                        //串口数据  蓝牙数据
       if(dat=='O'&&(i==0)) //接收数据第一帧
         {
            buff[ i]=dat;
            flag=1;        //开始接收数据
         }
       else
      if(flag==1)
     {
      i++;
      buff[ i]=dat;
      if(i>=2)
      {
          i=0;
          flag=0;
          flag_REC=1 ;        // 停止接收
          }  
     }
         }
}
//主函数
void main(void)
{
         TMOD|= 0x01;   //设置定时计数器工作方式1为定时器
        
        //--定时器赋初始值,12MHZ下定时0.5ms--//  
        TH0 = 0xFF;
        TL0 = 0x9C;
        ET0 = 1;          //开启定时器0中断
        TR1 = 1;         //开启定时器        
   TMOD=0x20;  //定时器T1工作模式2,8位自动重装
   TH1=0xF3;   // 4800波特率
   TL1=0xF3;
   SCON=0x50;  
   PCON=0x80;
   TR1=1;           //启动定时器T1
   REN=1;      //允许串口通讯
   EA =1;           //打开总中断
   ES =1;           //串口中断打开
   delay(100);
   while(1)                                                        /*无限循环*/
        {
        
         
                          
                  while(flag_xj)                           //循线标志位
                  {
                               if(flag_REC==1)
                                 {
                                  stoprun();
                                  break;
                                 }
                                 if(right_led==1&&middle_led==1&&left_led==1) //三路检测到黑线
                {
         Right_moto_stop=1;
         Left_moto_stop =1;
                 run_pwm();                     //前进
                }
                  else
                {
            if(right_led==1&&middle_led==0&&left_led==0) //右边检测到黑线
                {
                 Right_moto_stop=1;
         Left_moto_stop =1;
                 rightrun_pwm();                     //右转
                }        
                if(right_led==0&&middle_led==0&&left_led==1) //左边检测到黑线
                {
                 Right_moto_stop=1;
         Left_moto_stop =1;
                 leftrun_pwm();                      //左转
                }        
       }
           }
            if(flag_REC==1)                                    //
           {
                flag_REC=0;
                if(buff[0]=='O'&&buff[1]=='N')        //第一个字节为O,第二个字节为N,第三个字节为控制码
                switch(buff[2])
             {
                      case up :                                                    // 前进
                          send_str( );
                          flag_xj=0;
               
                          run();
                          break;

                      case down:                                                // 后退
                          send_str1( );
                          flag_xj=0;
                        
                          backrun();
                          break;

                      case left:                                                // 左转
                          send_str2( );
                          flag_xj=0;
                        
                          leftrun();
                          break;

                      case right:                                                // 右转
                          send_str3( );
                          flag_xj=0;
               
                          rightrun();
                          break;

                      case stop:                                                // 停止
                          send_str4( );
                          flag_xj=0;
                        
                          stoprun();
                          break;

                          case Car :                                                //                 
                          flag_xj=1;
                          break;
}
}
}
}

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

使用道具 举报

沙发
ID:703117 发表于 2020-5-11 10:52 | 只看该作者
我主程序那里写错了,定时器0中断是TR0=1,我写成TR1=1了,但是改过来,小车一通电就无法控制
回复

使用道具 举报

板凳
ID:703117 发表于 2020-5-11 20:10 | 只看该作者
感觉就是定时器和中断的问题吧,我看别人程序是用T2定时器弄得,我按着来改好像用不了,所以就用T1和T0了,有没有会的大佬指导一下啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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