找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机蓝牙红外寻迹红外避障小车代码

[复制链接]
跳转到指定楼层
楼主
做51单片机小车的硬件部分:一个开发板,带电机车轮的小车底盘,蓝牙模块,充电宝为小车供电

软件部分,串口助手,需要了解蓝牙AT指令用以改蓝牙名字,避免干扰,keli51开发环境

制作出来的实物图如下:


单片机源程序如下:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

  //定义电机输入端口
sbit right_b=P1^3;  
sbit right_a=P1^2;
sbit left_b=P1^1;
sbit left_a=P1^0;
sbit out3=P3^3;  //定义红外输入端口
sbit out2=P3^2;
sbit out0=P0^2;
sbit out1=P0^4;
sbit fm=P0^7;    //定义蜂鸣器输出端口


void delay(int n)    //延时函数
{
  int i;
  while(n--)
  {
  for(i=0;i<113;i++);
  }
}
/*void come(int n)    //利用电机差速调速 本次全速,所以注释了。
{
    int i=0;
    left_a=1;
    left_b=0;

    right_b=0;
    while(i++<5)
    {
    right_a=1;
    delay(n);
    right_a=0;
    delay(10-n);
    }
}*/
void go_up()       //前进函数
{
         left_a=1;
         left_b=0;
        right_b=0;
         right_a=1;


}
void go_back()    //后退函数
{
  left_a=0;
         left_b=1;
        right_b=1;
         right_a=0;
}

void left()      //左转函数
{
            fm=1;
             delay(10);
          fm=0;
        left_a=1;
          left_b=0;
        right_b=0;
            right_a=0;
}

void right()   /右转函数
{

        fm=1;
            delay(10);
          fm=0;
        left_a=0;
           left_b=0;
        right_b=0;
            right_a=1;  
}

void stop()   //停止函数
{
       left_a=0;
         left_b=0;
        right_b=0;
            right_a=0;

}
void ssz()   //顺时针旋转
{
          fm=1;
            delay(3);
          fm=0;
        left_a=0;
          left_b=1;
        right_b=0;
        right_a=1;
}
void nsz()   //逆时针旋转
{
      fm=1;
        delay(3);
    fm=0;
    left_a=1;
    left_b=0;
    right_b=1;
         right_a=0;
}
void UART_Init(void)        
{
    PCON &= 0x7F;        
    SCON = 0x50;        
    TMOD &= 0x0F;        
    TMOD |= 0x20;        
    TL1 = 0xFD;   
    TH1 = 0xFD;        
    ET1 = 0;        
    TR1 = 1;        
    EA=1;        
    ES=1;        
}

  
void UART_Routine() interrupt 4  //蓝牙数据接收以及判断
{
    unsigned char S;
    if(RI==1)  
    {
            stop();
            S=SBUF;
            switch(S)        
            {
                case ('1'):        
                    go_up();break;
                case ('2'):        
                    go_back();break;
                case ('3'):
                    nsz();break;
                case ('4'):
                    ssz();break;
                case ('0'):
                    stop();break;
            }   
            
            RI=0;
    }
}
void main (void)       //主函数
{
        UART_Init();   // 串口通信初始化   
while (1)   //主循环 寻迹功能, 避障功能 在此部分改动
  {
            if(out0==0&out1==0)//&out2==0&out3==0  
                     {
                    go_back();
                     }
            else
         stop();                  
                     
//                     if(out0==0&out1==0&S=='1')//&out2==0&out3==0
//                     {
//                    go_back();
//                     }
//                         if(out0==1&out1==0)//&out2==1&out3==0
//                     {
//                     nsz();
//                     }
//                     else if(out0==0&out1==1)//&out2==0&out3==1
//                     {
//                     ssz();
//                     }
//                        else if(out0==1&out1==1)//&out2==1&out3==1
//                     {
//                            go_up();
//                     }
  }   
}  


//——————————————————测试功能————————————————————

////单片机接收PC发出的数据  用于测试串口通信
//#include<reg51.h>       //包含单片机寄存器的头文件
///*****************************************************
//函数功能:接收一个字节数据
//***************************************************/
//sbit KEY2=P3^4;
//void delay(int n)
//{
//  int i;
//  while(n--)
//  {
//  for(i=0;i<113;i++);
//  }
//}
// unsigned char Receive(void)
//{
//  unsigned char dat;
//  while(RI==0)  //只要接收中断标志位RI没有被置“1”
//         ;      //等待,直至接收完毕(RI=1)
//      RI=0;      //为了接收下一帧数据,需将RI清0
//     dat=SBUF;  //将接收缓冲器中的数据存于dat
//      return dat;
//}
///*****************************************************
//函数功能:主函数
//***************************************************/
//void main(void)
//{
//   TMOD=0x20;  //定时器T1工作于方式2
//   SCON=0x50;  //SCON=0101 0000B,串口工作方式1,允许接收(REN=1)
//   PCON=0x00;  //PCON=0000 0000B,波特率9600
//   TH1=0xfd;  //根据规定给定时器T1赋初值
//   TL1=0xfd;  //根据规定给定时器T1赋初值      
//   TR1=1;    //启动定时器T1   
//   REN=1;    //允许接收
//   
//  while(1)
//   {  
//         P1=0xFF;
//         P1=Receive(); //将接收到的数据送P1口显示
//         delay(1000);            
//    }

//   }
//}


////单片机向PC发送数据    用于测试串口通信
//#include<reg51.h>       //包含单片机寄存器的头文件
//unsigned char code Tab[ ]="hello word ";
///*****************************************************
//函数功能:向PC发送一个字节数据
//***************************************************/
//void Send(unsigned char dat)
//{
//   SBUF=dat;
//   while(TI==0)
//      ;
//    TI=0;
//}
///**************************************************************
//函数功能:延时约150ms
//**************************************************************/
// void delay(void)   
//{
//   unsigned char m,n;
//     for(m=0;m<200;m++)
//      for(n=0;n<250;n++)      
//           ;
// }
///*****************************************************
//函数功能:主函数
//***************************************************/
//void main(void)
//{
//   unsigned char i;
//   TMOD=0x20;  //TMOD=0010 0000B,定时器T1工作于方式2
//   SCON=0x40;  //SCON=0100 0000B,串口工作方式1
//   PCON=0x00;  //PCON=0000 0000B,波特率9600
//   TH1=0xfd;    //根据规定给定时器T1赋初值
//   TL1=0xfd;    //根据规定给定时器T1赋初值
//   TR1=1;      //启动定时器T1   
//  while(1)
//   {
//      for(i=0;i<8;i++)   //模拟检测数据
//         {
//            Send(Tab[ i]);        //发送数据i
//              delay();   //150ms发送一次数据              
//          }        
//   }
//}      

单片机引脚及地址.png (141.66 KB, 下载次数: 57)

开发板原理图

开发板原理图

原理图.png (51.28 KB, 下载次数: 74)

红外模块原理图

红外模块原理图

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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