51单片机小车

通过红外遥控器实现红外遥控,红外循迹和超声波避障三种功能的切换 

如果出现舵机转动时进入红外接收外部中断的情况,可以试试更换红外接收器

#include <REGX52.H>
#include <intrins.h>
#include "SMG.h"

#define IR_POWER       0x45
#define IR_MODE        0x46
#define IR_MUTE        0x47

#define IR_START_STOP  0x44
#define IR_PREVIOUS    0x40
#define IR_NEXT        0x43

#define IR_EQ          0x07
#define IR_VOL_MINUS   0x15
#define IR_VOL_ADD     0x09

#define IR_0           0x16
#define IR_RPT         0x19
#define IR_USD         0x00

#define IR_1           0x0c
#define IR_2           0x18
#define IR_3           0x5e

#define IR_4           0x08
#define IR_5           0x1c
#define IR_6           0x5a

#define IR_7           0x42
#define IR_8           0x52
#define IR_9           0x4a

sbit ENA = P2^5;
sbit IN1 = P2^4;
sbit IN2 = P2^3;
sbit IN3 = P2^2;
sbit IN4 = P2^1;
sbit ENB = P2^0;

sbit Echo = P1^4;							
sbit Trig = P1^5;
sbit pwm	= P3^7;

sbit L1 = P1^3;
sbit L2 = P1^2;
sbit R2 = P1^1;
sbit R1 = P1^0;
//sbit L3=P2^1;
//sbit L4=P2^2;
//sbit L5=P2^6;
unsigned char Command,Speed=1,mode=0,f1,t;
unsigned char PWMA,PWMB,i,j,jiaodu=3,ir_f;
unsigned int counter,Counter1,Counter2;
unsigned char sp[5] = {0,25,50,75,100};

unsigned int IR_Time,stime,S;
unsigned char IR_State;

unsigned char IR_Data[4];
unsigned char IR_pData;

unsigned char IR_DataFlag;
unsigned char IR_RepartFlag;
unsigned char IR_Address;
unsigned char IR_Command;
unsigned char F;

void qianjin();
void zuozhuan();
void youzhuan();
void houtui();
void speed_up();
void speed_down();
void forward_speed_f();//·½ÏòËÙ¶ÈÅжÏ

void mode_choose();
void IR_Init(void);
unsigned char pd(void);
void count();
void run();
void stop();
void hcsr04();
void xunji();
void delayms(unsigned int t);
unsigned char IR_GetDataFlag(void);
unsigned char IR_GetRepeatFlag(void);

void Timer0Init(void)
{
		TMOD &= 0xF0;
		TMOD |= 0x01;
		TL0 = 0x66;
		TH0 = 0xFC;
		TF0 = 0;
		TR0 = 0;
//		PT0=1;
}

void Timer1_Init(void)		
{
	TMOD &= 0x0F;		
	TMOD |= 0x10;	
	TL1 = 0xA4;
	TH1 = 0xFF;	
	TF1 = 0;
	TR1 = 1;
	ET1=1; EA=1; PT1=0;
}
//
void main()
{

	P0 = 0x00;
	Timer1_Init();
	IR_Init();
//	jiaodu = 3;
	Nixie_1(11);
	delayms(300);
	while(1)
	{
		mode_choose();
	}
}

void mode_choose()
{
	if(IR_GetDataFlag())
	{
//		L4=0;
//		delayms(200);
//		IR_DataFlag = 0;
//		Command = IR_GetCommand();		
		if(IR_Command == IR_MODE)
		{
			mode++;
			if(mode>2)
			{
				t=1;
				mode=0;
			}
		}
		else if(IR_Command == IR_POWER)
		{
			t=1;
			mode = 0;
		}
	}

	if(mode == 0)
	{
		if(t)
		{
			Nixie_1(11);
			delayms(300);
			t=0;
		}
		forward_speed_f();
		Nixie_1(Speed);
	}
	if(mode == 1)
	{
		xunji();
		Nixie_1(12);
	}
		
	if(mode == 2)
	{
		Nixie_1(13);
		hcsr04();						
		count();					 //¼ÆËã¾àÀë
		run();
	}
	
}
/*
unsigned char mode_r()
{
	if(mode == 0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
*/
///
void houtui()
{
	IN1 = 0;
	IN2 = 1;
	PWMA = sp[Speed];
	IN3 = 1;
	IN4 = 0;
	PWMB = sp[Speed];
}

void qianjin()
{
	IN1 = 1;
	IN2 = 0;
	PWMA = sp[Speed];
	IN3 = 0;
	IN4 = 1;
	PWMB = sp[Speed];
}

void youzhuan()
{
	IN1 = 1;
	IN2 = 0;
	PWMA = sp[Speed];
	IN3 = 1;
	IN4 = 0;
	PWMB = sp[Speed];
}

void zuozhuan()
{
	IN1 = 0;
	IN2 = 1;
	PWMA = sp[Speed];
	IN3 = 0;
	IN4 = 1;
	PWMB = sp[Speed];
}

void speed_up()
{
	Speed++;
	if(Speed > 4)
	{
		Speed = 1;
	}
}

void speed_down()
{
	Speed--;
	if(Speed < 1)
	{
		Speed = 4;
	}
}

void forward_speed_f()
{
	if(IR_GetRepeatFlag())
	{
//		IR_RepartFlag = 0;
//		Command = IR_GetCommand();
		switch(IR_Command)
		{
			case IR_2:        //Ç°½ø
				qianjin();
			break;
			
			case IR_8:        //ºóÍË
				houtui();
			break;
			
			case IR_4:        //×óת
				zuozhuan();
			break;
			
			case IR_6:        //ÓÒת
				youzhuan();
			break;
			
			case IR_1:        //¼ÓËÙ
				speed_up();
			break;
			
			case IR_3:        //¼õËÙ
				speed_down();
			break;
			
		}
	}
}
///Delay//
void delayms(unsigned int t)		//@11.0592MHz
{
	unsigned char i, j;
	while(t--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}
IRºìÍâ


void Int0_Init(void)
{
	IT0 = 1;
	IE0 = 0;
	EX0 = 1;
	EA = 1;
	PX0 = 1;
	
}

void IR_Init(void)
{
	Int0_Init();
	Timer0Init();
}

void Timer0_SetCounter(unsigned int Value)
{
	TH0 = Value;
	TL0 = Value;
}


unsigned char IR_GetDataFlag(void)
{
	if(IR_DataFlag)
	{
		IR_DataFlag = 0;
		return 1;
	}
	return 0;
}

unsigned char IR_GetRepeatFlag(void)
{
	if(IR_RepartFlag)
	{
		IR_RepartFlag = 0;
		return 1;
	}
	return 0;
}
/*
unsigned char IR_GetAddress(void)
{
	return IR_Address;
}
unsigned char IR_GetCommand(void)
{
	return IR_Command;
}
*/
unsigned char pd(void)
{
	if(F)
	{
		F = 0;
		return 1;
	}
	return 0;
}

void Int0_Routine(void) interrupt 0
{
	if(IR_State == 0)
	{
		Timer0_SetCounter(0);
		TR0=1;
		IR_State = 1;
	}
	else if(IR_State == 1)
	{
		IR_Time = TH0*256+TL0;
		Timer0_SetCounter(0);
		if(IR_Time > 13500-800 && IR_Time < 13500+800)
		{
			IR_State = 2;
		}
		else if(IR_Time > 11250-1000 && IR_Time < 11250+1000)
		{
			IR_RepartFlag = 1;
			TR0=0;
			IR_State = 0;
		}
		else
		{
//			L5=~L5;
			IR_State = 0;
			if(mode == 2)
			{
				mode=0;
				t=1;
				if(TR0==1)
				{
					TR0=0;
				}
				
			}

//			Timer0_SetCounter(0);
//			TR0=1;
		}
	}
	else if(IR_State == 2)
	{
		IR_Time = TH0*256+TL0;
		Timer0_SetCounter(0);
		if(IR_Time > 1120-800 && IR_Time < 1120+800)
		{
			IR_Data[IR_pData/8] &= ~(0x01 << (IR_pData%8)); 
			IR_pData++;
		}
		else if(IR_Time > 2250-800 && IR_Time < 2250+800)
		{
			IR_Data[IR_pData/8] |= (0x01 << (IR_pData%8)); 
			IR_pData++;
		}
		else
		{
			IR_pData = 0;
			IR_State = 1;
		}
		if(IR_pData >= 32)
		{
			IR_pData = 0;
			if((IR_Data[0] == ~IR_Data[1]) && (IR_Data[2] == ~IR_Data[3]))
			{
				IR_Address = IR_Data[0];
				IR_Command = IR_Data[2];
				IR_DataFlag = 1;
			}
			TR0=0;
			IR_State = 0;
//			L4=~L4;
		}
	}
	F = 1;
//	Timer0_SetCounter(0);
	
}
//  ³¬Éù²¨
void straight()	//PWM 15
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 20;
	IN3 = 0;
	IN4 = 1;
	PWMB = 21;
}
void turnleft() //PWM 60
{
	IN1 = 0;
	IN2 = 1;
	PWMA = 20;
	IN3 = 0;
	IN4 = 1;
	PWMB = 20;
}
void turnright()	//PWM 60
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 20;
	IN3 = 1;
	IN4 = 0;
	PWMB = 20;
}
void stop()	//PWM 0
{
	IN1 = 0;
	IN2 = 0;
	PWMA = 0;
	IN3 = 0;
	IN4 = 0;
	PWMB = 0;
}

void Delay15us()		//@11.0592MHz
{
	unsigned char i;

	i = 4;
	while (--i);
}

void hcsr04()
{
	
	Trig=1;			              
	Delay15us();						//´óÓÚ10usµÄ´¥·¢ÐźÅ
	Trig=0;

	while(!Echo);
	TR0=1;			    			//¿ªÆô¼ÆÊý
	while(Echo);	
	TR0=0;								//¹Ø±Õ¼Æʱ
	stime=TH0*256+TL0;			//¼ÆÊýÆ÷ÿ¼ÓÒ»´Î£¬1us
	Timer0_SetCounter(0);	//ÇåÁ㶨ʱÆ÷0¼ÆÊý

}



void count(void)
{
//	L4=~L4;							
	S=(stime*1.8)/100;      //»»Ëã¾àÀ룬µ¥Î»CM
}

void run()
{

		if(jiaodu ==3 && S >= 15)
		{
			
			straight();
			hcsr04();
			count();
		}
		else if(jiaodu ==3 && S < 15)
		{
			stop();
			jiaodu = 2;
			delayms(200);
			hcsr04();
			count();
		}
		if(jiaodu == 2 && S >=15)
		{
			turnright();
			delayms(500);
			
			jiaodu =3;
			delayms(200);
			
			hcsr04();
			count();
			delayms(20);
		}
		else if(jiaodu == 2 && S < 15)
		{
			stop();
			jiaodu = 4;
			delayms(200);
			
			hcsr04();
			count();
		}
		if(jiaodu == 4 && S >=15)
		{
			turnleft();
			delayms(500);
			jiaodu =3;
			delayms(200);
			hcsr04();
			count();
		}
		else if(jiaodu == 4 && S <15)
		{
			stop();
			jiaodu =3;
			delayms(200);
			
			hcsr04();
			count();
		}

}

//    Ñ­¼£

void straight2()	//PWM 15
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 18;
	IN3 = 0;
	IN4 = 1;
	PWMB = 19;
}

void turnleft1() //PWM 60
{
	IN1 = 0;
	IN2 = 0;
	PWMA = 18;
	IN3 = 0;
	IN4 = 1;
	PWMB = 18;
}
void turnright1()	//PWM 60
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 18;
	IN3 = 0;
	IN4 = 0;
	PWMB = 18;
}

void turnleft2() //PWM 60
{
	IN1 = 0;
	IN2 = 1;
	PWMA = 20;
	IN3 = 0;
	IN4 = 1;
	PWMB = 20;
}
void turnright2()	//PWM 60
{
	IN1 = 1;
	IN2 = 0;
	PWMA = 20;
	IN3 = 1;
	IN4 = 0;
	PWMB = 20;
}
/*
void stop()	//PWM 0
{
	IN1 = 0;
	IN2 = 0;
	PWMA = 0;
	IN3 = 0;
	IN4 = 0;
	PWMB = 0;
}
*/

void xunji()
{
	if(L1==1&&L2==1&&R2==1&&R1==1)
	{
		straight2();
	}
	if(L1==0&&L2==0&&R2==1&&R1==0)    //×óÒÆ
	{
		turnright1();
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			straight2();
		}
	}
	if(L1==0&&L2==1&&R2==0&&R1==0)    //ÓÒÒÆ
	{
		turnright1();
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			straight2();
		}
	}
	if(L1==1&&L2==1&&R2==0&&R1==0)    //Ö±½Ç×ó¹Õ
	{
		straight2();
		delayms(50);
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			stop();
			delayms(50);
			turnleft2();
		}
	}
	if(L1==0&&L2==0&&R2==1&&R1==1)    //Ö±½ÇÓÒ¹Õ
	{
		straight2();
		delayms(50);
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			stop();
			delayms(50);
			turnright2();
		}
	}
	if((L1==1&&L2==0&&R2==0&&R1==0)||(L1==1&&L2==0&&R2==1&&R1==0)||(L1==1&&L2==1&&R2==1&&R1==0)) //Èñ½Ç×ó¹Õ
	{
		straight2();
		delayms(50);
		delayms(50);
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			stop();
			delayms(50);
			turnleft2();
		}
	}
	if((L1==0&&L2==0&&R2==0&&R1==1)||(L1==0&&L2==1&&R2==0&&R1==1)||(L1==0&&L2==1&&R2==1&&R1==1)) //Èñ½ÇÓÒ¹Õ
	{
		straight2();
		delayms(50);
		delayms(50);
		if(L1==0&&L2==0&&R2==0&&R1==0)
		{
			stop();
			delayms(50);
			turnright2();
		}
	}
	if(L1==0&&L2==1&&R2==1&&R1==0)
	{
		straight2();
		if(R1==1)
		{
//			stop();
//			delayms(50);
			turnright2();
		}
	}
	if(L1==0&&L2==1&&R2==1&&R1==0)
	{
		straight2();
		if(L1==1)
		{
//			stop();
//			delayms(50);
			turnleft2();
		}
	}
}
///
void Timer1_Routine()  interrupt 3
{
	TL1 = 0x33;
	TH1 = 0xFE;
	i++;
	j++;
	counter++;
	Counter1++;
	Counter2++;
	if(mode == 0)
	{
		f1 = pd();
	}
	else
	{
		f1 = 1;
	}

	
	if(f1 == 0)    ///ËÉÊÖÅжÏ
	{
		if(Counter1>=600)
		{
			PWMA = 0;
			PWMB = 0;
			Counter1 = 0;
		}
	}
	else
	{
		Counter1 = 0;
	}

	if(mode==2)
	{
	  if(counter <= jiaodu) pwm = 1;
		if(counter > jiaodu && counter <= 40) pwm = 0;
		if(counter > 40) counter = 0;
	}
	
	if(i < PWMA)
	{
		ENA = 1;
	}
	else 
	{
		ENA = 0;
		if(i >= 100)
		{
			i = 0;
		}
	}
	if(j < PWMB)
	{
		ENB = 1;
	}
	else 
	{
		ENB = 0;
		if(j >= 100)
		{
			j = 0;
		}
	}
	if(Counter2>=4)
	{
		Counter2=0;
		Nixie_loop();
	}
}
//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值