基于51单片机的智能小车

这个是为了去年参加某比赛的作品。

 

功能:

蓝牙启动,

变速,

蔽障,

舵机摆臂攻击,

目标搜索,

其它

 

硬件搭建布局图:

 

基于51单片机的智能小车_第1张图片

 基于51单片机的智能小车_第2张图片

 

在实验室写的程序,没及时备份。。完整版的程序没有了!

只实现部分模块功能的源码:

 

#include "reg52.h"
#include

#define uint unsigned int
#define uchar unsigned char

#define Cycle 20000  //定义周期
uint PWM_Value[8];

uchar order=0; //中断步长

//按键检测
//sbit key1=P2^0; 
//sbit key2=P2^1; 

//PWM的输出端口 
sbit PWM_OUT0=P2^5;
sbit PWM_OUT1=P2^6;

//红外检测口
sbit H1 = P0^0;
sbit H2 = P0^1;
sbit H3 = P0^2;
sbit H4 = P0^3;
sbit H5 = P0^4;
sbit H6 = P0^5;
sbit H7 = P0^6;
sbit H8 = P0^7;

//步进电机方向口
sbit B1 = P1^4;
sbit B2 = P1^5;
sbit B3 = P1^6;
sbit B4 = P1^7;

//步进电机脉冲口
sbit BU1 = P1^0;
sbit BU2 = P1^1;
sbit BU3 = P1^2;
sbit BU4 = P1^3;

int i,key1,key2;
/********************************************
	 延时程序
*********************************************/
void delay(uint t,uint ti)
{                           
   uint k;
   while(t--)
   {
     for(k=0; k1000)
                        PWM_Value[0]-=2;
                if(PWM_Value[1]>1000)
                        PWM_Value[1]-=2;
        }

        delay(5,20);
}


/**********************************************************
*														  *
*                 步进电机驱动							  *
*num表示距离,num1表示步进电机脉冲频率,				  *
*num2和num3表示延迟时间长度								  *
***********************************************************/
void  motor_forward(int num,int num1,int num2,int num3) //前进
 { 
          B1 = 1;
		  B2 = 1;
		  B3 = 0;
		  B4 = 0;
		while(num--){
			motor_ffw(num1,num2,num3);
		} 

  } 

void  motor_backward(int num,int num1,int num2,int num3) //后退
 { 
          B1 = 0;
		  B2 = 0;
		  B3 = 1;
		  B4 = 1; 
		while(num--){
			motor_ffw(num1,num2,num3);
		}           

  }

void  motor_left(int num,int num1,int num2,int num3) //左转
 { 
          B1 = 0;
		  B2 = 0;
		  B3 = 0;
		  B4 = 0;  
		while(num--){
			motor_ffw(num1,num2,num3);
		}           
  }
void  motor_right(int num,int num1,int num2,int num3) //右转
 { 
          B1 = 1;
		  B2 = 1;
		  B3 = 1;
		  B4 = 1;  
		while(num--){
			motor_ffw(num1,num2,num3);
		}            

  }

/********************************************************
*                                                       
*红外测距传感器函数   ,0为检测到障碍物,1为正常                                            
*                                                      
*********************************************************/
void red_driver()
{
   if((H5|H6|H7|H8) == 1)  //检测小车是否到达擂台边缘
		{
			 if((H5&H7) == 1){//检测小车正前方到达边缘,先退后,再右转
				motor_backward(20,20,2,50);
				motor_right(36,16,2,50);
				}
		else if((H6&H8) == 1){//检测小册正后方到达边缘
				motor_forward(20,20,2,50);
				motor_right(36,16,2,50);
				}
	 	else 
			{				//检测小车四个角落到达边缘
			if (H5 == 1){
				motor_backward(20,20,2,50);
				motor_right(36,16,2,50);
				}
			else if (H6 == 1){
				motor_forward(10,20,2,50);
				}
			else if (H7 == 1){
				motor_backward(20,20,2,50);
				motor_left(36,16,2,50);
				}
			else if (H8 == 1){
				motor_forward(10,20,2,50);
				}
		 	}
		}
	else if((H3&H4) == 0)	//检测小车左右两边是否有障碍物
 		{
		 	 if (H3 == 0){
				motor_left(36,16,2,50);
				}
		else if (H4 == 0){
				motor_right(36,16,2,50);//38
				}
		 }
	else if(H2 == 0){   //检测小车后面是否有障碍物,加速倒退
			motor_backward(20,16,2,40);
			}
	else  if(H1 == 0){	//检测小车前面是否有障碍物,加速冲击
			motor_backward(20,16,2,40); 
			}
	else
			motor_forward(1,20,2,50);
}

/********************************************
	 初始化
*********************************************/
void init()
{
		SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1    	       	   
	    TMOD|= 0x21;      //定时器工作方式2                    
		PCON|= 0x80;                                                          
		//TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无 (11.0592) 
		TH1 = 0xF3;		// //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)
    	TL1 = 0xF3;         
		TH0=(65536-500)/256;
        TL0=(65536-500)%256;

		TR1 = 1;        //打开定时器1中断 
        TR0 = 1;		//启动定时器0          
		ES  = 1;        //开串口中断                  
		ET0 = 1;		//打开定时器0中断
		ET1 = 1;		//打开定时器1中断
		EA  = 1;        // 开总中断 

        PT0 = 0;  		//定时器0 设置为最高优先中断,1表示高,0表示低
        PX0 = 0; 		// 外部中断0 设置最低中断
		PS  = 1; 		//串口中断 
}

/********************************************************
*                                                       
*主函数                                               
*                                                      
*********************************************************/
void main() 
{
	init();
		PWM_Value[0]=1500;
        PWM_Value[1]=1500;
	H5=H6=H7=H8 =0;
	H1=H2=H3=1;
	H4 = key1 = 0;
	RI = 1;

	for(i=0;i<100;i++)
	{
		keyscan();
	}
	key1 = 1;
	key2 = 0;
	while(1)
	{
	}
}

/********************************************************
*                                                       
*串口中断                                    
*                                                      
*********************************************************/
void serial() interrupt 4
{ 
	motor_forward(60,20,2,50);
	while(1)
	{
	for(i=0;i<100;i++)
	{
		keyscan();
	}
	key2 = 1;
	red_driver();
	}
}

/********************************************************
//定时器0 中断子函数
//这里输出几路波形 就应该为 20MS/N =X 那么X 就是N路平分时间 
//在用N-高电平时间  就为该路低电平时间咯。 就这么简单。。。
*********************************************************/
void timer0() interrupt 1 
{         
        switch(order)
        {
                case 1:PWM_OUT0=1;
                           TH0=-PWM_Value[0]/256;     //第一路输出高电平时长
                           TL0=-PWM_Value[0]%256;
                           break;
                case 2:PWM_OUT0=0;
                           TH0=-(5000-PWM_Value[0])/256;   //第一路 输出低电平时长 
                           TL0=-(5000-PWM_Value[0])%256;
                           break;
                case 3:PWM_OUT1=1;
                           TH0=-PWM_Value[1]/256;
                           TL0=-PWM_Value[1]%256;
                           break;
                case 4:PWM_OUT1=0;
                           TH0=-(5000-PWM_Value[1])/256;
                           TL0=-(5000-PWM_Value[1])%256;
                           break;
                           
                           order=0;
                           break;

                           default: order=0;
                }
                order++;
} 


 

你可能感兴趣的:(单片机)