小言_互联网的博客

51单片机智能小车C程序 蓝牙遥控+避障+自动寻迹

295人阅读  评论(0)

/*********************************************************
    文件名:car.c
    文件说明:小车的蓝牙,避障,自动寻迹C程序
    编写人员:Seven
    编写日期:2017年6月9日
    程序说明:MCU采用AT89C52,外接11.0592MHz晶振、3个光电
              开关、5个红外对管、HC06蓝牙模块、L298N电机驱
              动模块,12V电源供电,L7805稳压输出5V。
    版权标注:河南工程学院 电气信息工程系C303创新实验室
*********************************************************/
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define MAIN_Fosc  11059200

uint i;
uchar tmp;
sbit IN1=P0^0;      //控制左前后轮正转 1正转 0停止
sbit IN2=P0^1;      //控制左前后轮倒转 1倒转 0停止
sbit IN3=P0^2;      //控制右前后轮正转 1正转 0停止
sbit IN4=P0^3;      //控制右前后轮倒转 1倒转 0停止
sbit ENA=P0^4;      //左轮使能端
sbit ENB=P0^5;      //右轮使能端
sbit red1=P1^0;      //red是红外对管,从左到右分别是1~~5
sbit red2=P1^1;      //红外对管以第三个为准,寻迹时返回为高电平
sbit red3=P1^2;      //为1时为高电平,无信号返回
sbit red4=P1^3;
sbit red5=P1^4;
sbit eye1=P2^5;       //eye为红外光电开关
sbit eye2=P2^6;
sbit eye3=P2^7;
sbit Beep=P0^7;

/********串*口*初*始*化*函*数*******/
void init()        
 {
                       TMOD = 0x20;        //工作模式2,8位自动重装
                    TH1 = 0xfd;
                    TL1 = 0xfd;            //波特率9600bps
                    SM0 = 1;
                    SM1 = 1;            //串口工作方式1     10位异步收发器
                    TR1 = 1;            //T1定时器启动
                    REN = 1;            //允许串口通讯
                    EA  = 1;            //开总中断
                    ES  = 1;            //串口中断打开

 }

 /********* ms*级*延*时*函*数*********/

void Delay_Ms(uint ms)
{
     uint i;
       do{
          i = MAIN_Fosc / 96000;
         while(--i);  
      }while(--ms);
}

/*****运*动*状*态*控*制*函*数*****/
void turnleft()
{
    for(i=0;i<7;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;     //设置占空比,控制小车速度,下同
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void turnright()
{
    for(i=0;i<7;i++)
    {
    IN1=1;
    IN2=0;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void anticlockwise()
{
    for(i=0;i<13;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;              
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
    
}
void clockwise()
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
}
/*******go*函*数*用*于*寻*迹*******/
void go(void)
{
    for(i=0;i<10;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(2);    
      ENA=ENB=0;
     Delay_Ms(14);
    }
}

/*********用*于*180度*转*身*避*障*********/
void turn_round(void)
{
    for(i=0;i<58;i++)
    {
    IN1=0;
    IN2=1;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(4);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
    
}
/*******run*函*数*用*于*蓝*牙*遥*控*******/
void run(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=ENB=1;               
      Delay_Ms(2);    
      ENA=ENB=0;
     Delay_Ms(8);
    }
}
void upleft(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENB=1;
    Delay_Ms(13);
    ENA=1;            
      Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }
}
void upright(void)
{
    for(i=0;i<13;i++)
    {
    IN1=1;
    IN2=0;
    IN3=1;
    IN4=0;
    ENA=1;               
      Delay_Ms(13);
    ENB=1;
      Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }
}
void back(void)
{
    for(i=0;i<15;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENA=ENB=1;               
      Delay_Ms(3);    
      ENA=ENB=0;
     Delay_Ms(7);
    }
}
void stop()
{
    IN1=0;
    IN2=0;
    IN3=0;
    IN4=0;
}
void bottom_left()
{
    for(i=0;i<15;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENB=1;
     Delay_Ms(13);
    ENA=1;              
      Delay_Ms(5);    
      ENA=ENB=0;
     Delay_Ms(12);
    }
    
}
void bottom_right()
{
    for(i=0;i<10;i++)
    {
    IN1=0;
    IN2=1;
    IN3=0;
    IN4=1;
    ENA=1;              
      Delay_Ms(13);
    ENB=1;
     Delay_Ms(5);
      ENA=ENB=0;
     Delay_Ms(12);
    }

}
/*************蓝*牙*遥*控*函*数*********************/
void ctrl()                      //接收处理函数
{
                           switch(tmp)
                            {
                                 case '1': //led1 = 0;
                                    upleft();
                                    break;   
                                case '2':
                                    run();
                                    break;
                                case '3':                         
                                     upright();
                                     break;
                                case '4':                                            
                                    anticlockwise();
                                    break;
                                case '5':
                                    stop();    
                                    break;
                                case '6':
                                    clockwise();
                                    break;
                                case '7':
                                    bottom_left();
                                    break;
                                case '8':
                                    back();
                                    break;
                                case '9':
                                    bottom_right();
                                    break;
                                 default:
                                    stop();          
                              }

}

/*******寻*迹*函*数*******/
void Tracing(void)
{  
    if((red1==0)&&(red3==1)&&(red5==0))
       go();
    if(((red4==1)||(red5==1))&&(red3==0))
       turnleft();
    if(((red1==1)||(red2==1))&&(red4==0))
       turnright();
    if((red1==0)&&(red2==0)&&(red3==0)&&(red4==0)&&(red5==0))
      stop();   
}

/*************避*障*函*数************/
void Avoid(void)
{

  P2=0xe0;
  while(((eye1==0)&&(eye2==0))||(eye1==0))
       {  
          Beep=0;
          turnleft();                                          
          Beep=1;
       }
  while(((eye2==0)&&(eye3==0))||(eye3==0))
       {
          Beep=0;
          turnright();
          Beep=1;
       }
  while(((eye1==0)&&(eye2==0)&&(eye3==0))||(eye2==0)||((eye1==0)&&(eye2==1)&&(eye3==0)))
       {
          Beep=0;
          turn_round();
          Beep=1;
       }      
}


void main()
{          
              init();
            while(1)
            {

//            tmp = SBUF;     
//            if(tmp == '2')
//            {                    
//            go();
//               }
//
//            if(tmp == '8')
//            {                     
//            back();
//            }

            Tracing();
            Avoid();
            }
 }

/*******串*口*中*断*服*务*程*序*******/
void UART() interrupt 4
{
          if(RI==1)                    //是否有数据到来 1为是 0为否
          {
          tmp = SBUF;                   //暂存接收到的数据
          RI = 0;
          }
          ctrl();
}          
 


转载:https://blog.csdn.net/seven94959/article/details/72957432
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场