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

六、结论

经实践表明,本文所设计制作的红外线遥控小车运行稳定、遥控灵敏、占用系统硬件资源少。且在不改变硬件电路,仅通过软件编程小车就可以实现多处障碍物检测、报警等功能。

由于目前的遥控装置大多对某一设备进行单独控制,而在本设计中的红外遥控电路设计了多个控制按键,可以对不同的设备,也可以对同一设备的多个功能进行不同的控制。基本符合技术要求。

本想在底部增加循迹功能,但出于传感器数量有限,底部只剩下两个红外传感器,实现循迹困难。因此改为检查是否离地的功能模块。

但是本遥控电路也有不完善的地方,它只能单通道实现对多个设备的控制,即它不能同时控制两个或者两个以上的设备。

在设计过程中,通过大量的查阅资料,认真研究教材,对单片机有了更为深刻的理解,在设计软件时,须仔细的分析硬件电路,画出程序流程图,培养了我的耐性和刻苦钻研的精神。

【参考文献】

1、《实例解读51单片机完全学习与应用(配教学视频)》,杨欣编著,电子工业出版社。

2、《爱上单片机》,杜洋著,人民邮电出版社。

3、《全国大学生电子设计竞赛教程--基于ti器件设计方法》,黄春根等著,电子工业出版社。

9

【附录】

源程序

#include

unsigned char IrValue[6];

unsigned char jd1,jd2,m1,m2,count,Time,i,value,flag;

sbit IRIN=P3^2; sbit pwm1=P2^0; sbit pwm2=P2^1;

sbit left1=P2^2; sbit left2=P2^3; sbit right1=P2^5; sbit right2=P2^4;

sbit led=P2^6; sbit person=P2^7;

sbit xia1=P1^2; sbit xia2=P1^0; sbit qian1=P1^1; sbit qian2=P1^3; sbit hou1=P1^4; sbit hou2=P1^5;

void IrInit();

void DelayMs(unsigned int ); void Timer0_Init(); void go(); void back(); void turnleft(); void turnleft1(); void turnright(); void turnright1(); void add(); void pluse(); void yaokong(); void bizhang(); void stop();

10

void stop1(); void main() {

pwm1=0; pwm2=0; count=0; led=1;

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

IrInit();

Timer0_Init(); left1=0; left2=0; right1=0; right2=0;

qian1=1; qian2=1; //xia1=0; //xia2=0; hou1=1; hou2=1; flag=0; //preson=1; while(1) { while(flag==1)//手动遥控 { if ((xia1==1)|(xia2==1)) stop(); else if((xia1==0)&(xia2==0)) yaokong(); } while (flag==2) //贴墙走 { if ((xia1==1)&(xia2==1)) stop(); else { if ((hou1==1)&(hou2==1)) stop(); else if ((hou1==0)&(hou2==1)&((qian1==1)|(qian2==1))) {go();} else if ((hou1==0)&(hou2==1)&((qian1==0)&(qian2==0))) {turnright();DelayMs(5000);} else if ((hou1==1)&(hou2==0)&((qian1==1)|(qian2==1))) {go();}

11

else if ((hou1==1)&(hou2==0)&((qian1==0)&(qian2==0))) {turnleft();DelayMs(5000);} } }

while (flag==3){ if ((xia1==1)&(xia2==1)) stop(); else bizhang();}//避障 while (flag==4) { if ((xia1==1)&(xia2==1)) stop(); else { if(person==1) bizhang(); else if(person==0) { stop(); } } } }}

void Timer0_Init() //函数功能:定时器初始化,每1us执行一次 { TMOD=0x01; TH0=0xff;//65436/256 TL0=0x9c;//65436%6 TR0=1; EA =1; //打开总中断 ET0=1; //打开定时器0中断 TR0=1; //启动定时器0 }

void Timer0_Int() interrupt 1//中断程序 {

TH0=0xff; TL0=0x9c;

m1=count; m2=count;

if(m1

if(m2

12

count%=200; //20m秒需要数200次 }

void yaokong() {

switch(value) {

case 0x15:stop();break; //按键 case 0x40:go();break; }

void go() {

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

void stop() {

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

void back() {

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

case 0x19:back();break; case 0x07:turnleft();break; case 0x09:turnright();break; case 0x1c:stop1();break; case 0x08:turnleft1();break; case 0x5a:turnright1();break; default:break; } 13