通过红外遥控器实现红外遥控,红外循迹和超声波避障三种功能的切换
如果出现舵机转动时进入红外接收外部中断的情况,可以试试更换红外接收器
#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();
}
}
//