五一七教育网
您的当前位置:首页红外遥控小车设计报告

红外遥控小车设计报告

来源:五一七教育网


单片机技能与认证培训设计报告

题目:红外遥控小车

姓 名: 学 号: 系别专业: 电信系 班 级: 完成时间: 6月12日

华南理工大学广州学院电子信息工程学院

一、设计任务及要求

用红外遥控的方式,控制小车模型前进、后退、左转、右转等功能。

二、设计方案以及元器件选取

设计方案:本设计方案通过红遥控发射信号产生高低电平,用来提供给L298N,达到来控制电机的目的。其中INA、INB、INC、IND的电平分别为一高一低,两个电机就能转动了。小车尾部采用万向轮来辅助小车前进后退以及左右转。

元器件选取:

L298N小车驱动 c52单片机 hs0038红外接收器 2个直流电机 4节五号电池 万向轮1个 电解电容2个

电阻、电容、晶振等最小系统部分元器件 三、硬件电路

1. 最小系统部分如下图所示:

复位电路采取按键复位电路。

晶振的作用则是为系统提供基本的时钟信号

2. 红外接受电路采用hs0038红外接收器,电路图如下

3. 小车驱动电路采用L298N来控制电机:

四、软件设计

红外专用的延迟函数:

主函数部分如下

五、调试以及结果

1. 第一次小车无法起动。后发现原因是因为把hs0038的3个口弄错,误把

第一个引脚当作GND,导致无法通过红外遥控小车行走。后发现1为输出端,2为GND,3为VCC。修改线路后成功通过遥控控制小车前后左右行走。

2. 小车左轮部分齿轮在1个地方有时会卡住无法转动,需要人工转动下带

动左轮转动,经过除尘、添加润滑油等措施后,卡住现象稍有减少,但无法完全避免。

六、总结

通过这次实验,我们锻炼了自己的动手能力,了解了遥控小车的原理及制作过程,使我们的团队意识增强,经过几天的努力,完成了模块的设计与制作,完成了整个系统的编程、组装与调试。基本上满足竞赛的要求,使用模块时,综合考虑电路的简单、电路的成本、以及电路的性能。此次设计仍有一些问题没有得到完全解决,对一些器件的应用还不是很熟悉,因此在今后的学习中,更要好好学习知识,增加技能训练。比如红外传感器的原理与应用的知识,光敏二极管的原理与应用电路等,当我们遇到不懂不会的问题时,我们能通过图书馆、网络等各种渠道学习想要知道的知识,有时候虽然只是一个很简单的小车模块,但使我们认识到自己所学的专业知识在实践中所出现的很大的不足。在实际的设计当中也应注意到的许多问题,如在焊接时应提前布线、制图,以免在调试过程时无从下手。虽然在这次设计中对于知识的运用和衔接还不够熟练,但是我们将在以后的工作和学习中继续努力、不断完善。学习自己的专业知识,加强自己的动手实践,努力提高自己的专业技能,能在今后的生活学习中更好的应用。

七、附录

原理图如下:

PCB板图如下

源程序如下: #include

#define uchar unsigned char #define uint unsigned int sbit led1 = P0^0; // sbit led2 = P0^1; // sbit led3 = P0^2; // sbit led4 = P0^3; // sbit PWM_0 = P1^4; //定义直流电机的控制端口 sbit PWM_1 = P1^6; //定义直流电机的控制端口 sbit PWM_3 = P1^5; //定义直流电机的控制端口 sbit PWM_4 = P1^7; //定义直流电机的控制端口 sbit IRIN = P3^3; //红外接收器数据线 uchar CYCLE; //定义周期 uchar PWM_ON ; //定义低电平时间 uchar PWM_FF ; //定义低电平时间 uchar PWM_3T ; //定义低电平时间 uchar PWM_4T ; //定义低电平时间 uchar IRCOM[7];

void Delay_1ms(uint i) { uchar x,j; for(j=0;j/*********************红外专用延迟函数**********************************/ void delay(uchar x) //x*0.14MS {

uchar i; while(x--) {

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

/***************** 红外遥控键盘函数 *************/ void key() {

if((IRCOM[2]==0x18)) //按数字键2 上 { Delay_1ms(20); if(IRCOM[2]==0x18)

{ PWM_ON=10; PWM_FF=10; PWM_3T=0; PWM_4T=0; led1 = 0; // led2 = 1; // led3 = 1; // led4 = 1; // while(!IRCOM[2]); } } if((IRCOM[2]==0x52)) //按数字键8 下 { Delay_1ms(20); if(IRCOM[2]==0x52) { led1 = 1; // led2 = 0; // led3 = 1; // led4 = 1; // PWM_ON=0; PWM_FF=0; PWM_3T=10; PWM_4T=10; while(!IRCOM[2]); } }

if((IRCOM[2]==0x08)) //按数字键4 左 { Delay_1ms(20); if(IRCOM[2]==0x08) { led1 = 1; // led2 = 1; // led3 = 0; // led4 = 1; // PWM_ON=0; PWM_FF=10; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } }

if((IRCOM[2]==0x5a))//按数字键6 右 { Delay_1ms(20); if(IRCOM[2]==0x5a) { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 0; // PWM_ON=10; PWM_FF=0; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } } if((IRCOM[2]==0x1c))//按数字键5 停 { Delay_1ms(20); if(IRCOM[2]==0x1c) { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 1; // PWM_ON=0; PWM_FF=0; PWM_3T=0; PWM_4T=0; while(!IRCOM[2]); } } }

void Time0(void) { TMOD |=0x01; //定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1mS IE= 0x82; //打开中断 TR0=1; //定时器打开 }

/*********** 定时器0、1,外部中断1 初始化 *****************/

void Time(void) { TMOD =0x11; //定时器设置 1ms in 12M crystal TH0=(65536-1000)/256; TL0=(65536-1000)%256; //定时1mS // TH1 = 0x4c; //对TH0 TL0赋值

// TL1 = 0x00; //使定时器0.05秒中断一次 // ET1 = 1; ET0 = 1; EX1 = 1; EA = 1; //打开中断 TR0 = 1; //定时器打开 // TR1 = 1; IRIN= 1; //红外I/O口初始化 }

main() { led1 = 1; // led2 = 1; // led3 = 1; // led4 = 1; // CYCLE = 10; //时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步 PWM_0 = 0; PWM_1 = 0;

Time(); //中断初始化 while(1) { } }

/********************************/ /* 定时中断 */ /********************************/ void tim(void) interrupt 1 using 1 { static unsigned char count; TH0=(65536-1000)/256; TL0=(65536-1000)%256;//定时1mS if(count==PWM_ON) { PWM_0 = 1; //直流电机转

} if(count==PWM_FF) { PWM_1 = 1; //直流电机转 } if(count==PWM_3T) { PWM_3 = 1; //直流电机转 } if(count==PWM_4T) { PWM_4 = 1; //直流电机转 } count++; if(count == CYCLE) { count=0; if(PWM_ON!=0) //如果左右时间是0 保持原来状态 { PWM_0 = 0; //直流电机不转 } if(PWM_FF!=0) //如果左右时间是0 保持原来状态 { PWM_1 = 0; //直流电机不转 } if(PWM_3T!=0) //如果左右时间是0 保持原来状态 { PWM_3 = 0; //直流电机不转 } if(PWM_4T!=0) //如果左右时间是0 保持原来状态 { PWM_4 = 0; //直流电机不转 } } }

/********************************************************************/ /********* 红外外部中断1函数 ***********/ /********************************************************************/

void IR_IN() interrupt 2 using 0 {

unsigned char j,k,N=0;

EX1 = 0; delay(15); if (IRIN==1) { EX1 =1; return; }

//确认IR信号出现

while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。 {delay(1);}

for (j=0;j<4;j++) //收集四组数据 {

for (k=0;k<8;k++) //每组数据有8位 {

while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。 {delay(1);}

while (!IRIN) //等 IR 变为高电平 {delay(1);} while (IRIN) //计算IR高电平时长 { delay(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; } key(); EX1 = 1; }

因篇幅问题不能全部显示,请点此查看更多更全内容