基于51单片机的红外遥控自动避障贴墙行走人体感应智能小车机器人 下载本文

void turnright() {

led=~led; left1=1; left2=0; right1=0; right2=1; //value=0; }

void turnright1() {

unsigned int j,k; j=0;k=0; while (j<3) { jd1=jd1-10; j++; }

DelayMs(1000); while (k<3) { jd1=jd1+10; k++; } }

void turnleft() {

led=~led; left1=0; left2=1; right1=1; right2=0; //value=0; }

void stop1(void) {

jd1=85;//右轮速度初始化取值范围0~200 jd2=70;//左轮速度初始化取值范围0~200 }

void turnleft1() {

unsigned int m,n; m=0;n=0;

14

while (m<3) { jd2=jd2-10; m++; }

DelayMs(1000); while (n<3) { jd2=jd2+10; n++; } }

void add() { jd1=jd1+10; jd2=jd2+10; if(jd1>145) jd1=145; if(jd2>130) jd2=130; } void pluse() { jd1=jd1-10; jd2=jd2-10; if(jd1<65) jd1=65; if(jd2<50) jd2=50; }

void bizhang() {

//Timer0_Init(); if((qian1==1)&(qian2==1)) go(); else if((qian1==0)&(qian2==0)) { DelayMs(1000);back();DelayMs(800);turnright();DelayMs(800); } else if((qian1==1)&(qian2==0)) { back();DelayMs(1000);turnleft();DelayMs(800); } else if((qian1==0)&(qian2==1)) { back();DelayMs(1000);turnright();DelayMs(800); } }

15

void DelayMs(unsigned int x) //延迟函数,0.14ms误差 0us {

unsigned char i; while(x--) {

for (i = 0; i<13; i++) {} } }

void IrInit() // 初始化红外线接收 { IT0=1;//下降沿触发 EX0=1;//打开中断0允许 IRIN=1;//初始化端口 }

void ReadIr() interrupt 0//读取红外数值的中断函数 返回值value { unsigned char j,k; unsigned int err; Time=0; DelayMs(70); if(IRIN==0) //确认是否真的接收到正确的信号 { err=1000; //1000*10us=10ms,超过说明接收到错误的信号 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低电平过去 { DelayMs(1); err--; } if(IRIN==1) //如果正确等到9ms低电平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高电平过去 { DelayMs(1); err--; } for(k=0;k<4;k++) //共有4组数据 { for(j=0;j<8;j++) //接收一组数据

16

// } } }

{ err=60; while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去 while (!IRIN) { DelayMs(1); err--; } err=500; while((IRIN==1)&&(err>0)) //计算高电平的时间长度。 { DelayMs(1);//0.14ms Time++; err--; if(Time>30) { EX0=1; return; } } IrValue[k]>>=1; //k表示第几组数据 if(Time>=8) //如果高电平出现大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完时间要重新赋值 } } value=IrValue[2]; switch(value) {

case 0x45:flag=1;led=~led;break; case 0x47:flag=2;led=~led;break; case 0x46:flag=3;led=~led;break; case 0x44:flag=4;led=~led;break; case 0x18:add();led=~led;break; case 0x52:pluse();led=~led;break; default:break; } //判断模式 17

18