.
} }
void IR_IN(void) interrupt 2 {
unsigned char j,k,N=0; EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return; }
//确认IR信号出现
while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。 {IRdelay(1);}
for (j=0;j<4;j++) //收集四组数据 {
for (k=0;k<8;k++) //每组数据有8位 {
while (TRIG) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {IRdelay(1);}
while (!TRIG) //等 IR 变为高电平 {IRdelay(1);}
while (TRIG) //计算IR高电平时长 {
IRdelay(1);
N++; if(N>=30) {EX1=1; return;} //0.14ms计数过长自动离开。
} //高电平计数完毕 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0” if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1” N=0; }//end for k
}//end for j
if(IRCOM[2]!=~IRCOM[3]) //判断数据码与数据反码是否正确 真确返回 { EX1=1; return; }
EX1 = 1;
'.
.
}
void time1_suspend1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断0 4 串口中断 {
TH1=0Xec; //装入初值定时一次为0.0005s 2000hz TL1=0x78; time_2++; //控制PWM 脉冲计数 if(state_total!=3) //判断进入按键是否按下 进入状态1 避障 或者 { state_2=1; //退出按键判断 }
/* if(time_2>100) { time_2=0; } else if(time_2<=SPEED) { PWM_g; //频率为2000hz的占空比为高电平的方波 } else { PWM_l; //为低电平 } */ }
void IRdelay(unsigned char x) //x*0.14MS用于红外遥控 {
unsigned char i; while(x--) {
for (i = 0; i<13; i++) {} } }
void Delay10ms(void) //用于按键检测误差 {
unsigned char a,b,c; for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--); }
void delay(uint dat) //延时函数用于初始化 {
uint i;
for(i=dat;i>0;i--)
'.
0 循迹 .
{ _nop_(); } }
void delay_100ms(uint ms) //延时函数用于超声波 {
uint i,j;
for(i=ms;i>0;i--) for(j=200;j>0;j--) { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } }
//小车前进 void run(void) {
PWM=0X56; }
//小车后退
void back(void) {
PWM=0XA9; TR1=1; time_2=0;
while(time_2<=100); //延时0.2s TR1=0; }
//小车停止
void stop(void) {
PWM=0X00; }
//小车左转180 void left_180() {
//PWM=0X59; //左两轮反转,右两轮正转 PWM=0X50; //右两轮正转 TR1=1; time_2=0;
while(time_2<=150); //延时0.2s
'.
.
time_2=0;
while(time_2<=150); //延时0.2s }
//小车左转 90 void left_90(void) {
PWM=0X59; //左两轮反转,右两轮正转 //PWM=0X50; //右两轮正转 TR0=1; time_1=0;
while(time_1<=20); //延时0.2s TR0=0; }
//小车左转 120 void left_120(void) {
PWM=0X59; //左两轮反转,右两轮正转 // PWM=0X50; //右两轮正转 TR0=1; time_1=0;
while(time_1<=60); //延时0.4s TR0=0; }
//小车右转 90
void right_90(void) {
PWM=0XA6; //左两轮正转 右两轮反转 //PWM=0X06; //左两轮正转 TR0=1; time_1=0;
while(time_1<=20); //延时0.2s TR0=0; }
//小车右转 120
void right_120(void) {
PWM=0XA6; //左两轮正转 右两轮反转 // PWM=0X06; //左两轮正转 TR0=1; time_1=0;
while(time_1<=60); //延时0.4s TR0=0;
'.