遥控电动小车实验与程序设计.docx
《遥控电动小车实验与程序设计.docx》由会员分享,可在线阅读,更多相关《遥控电动小车实验与程序设计.docx(18页珍藏版)》请在冰点文库上搜索。
遥控电动小车实验与程序设计
遥控小车及程序
1、实验前言
随着科技的发展,近年来单片机等微型处理器在控制方面的应用越来越多。
加之其易于使用、性价比高,所以用该类型芯片开发的产品成本低廉且使用方便。
我们正是看中了单片机处理器的这些优点,经过性价比的分析设计了出了基于51系列的AT89S52处理器的电动遥控小车。
本作品主要采用红外发送和红外接收技术,利用PC838红外接收管接收红外遥控发出的信号,然后将数据传送至AT89S52单片机中进行数据处理,从而控制L297电机驱动。
实现小车遥控控制的功能。
二、模块分析
1、红外控制模块
方案一:
红外发射器使用PT2262/PT2272芯片搭建而成,红外接收模块使用PC838红外接收管搭建。
方案二:
红外发射器直接使用市场现成的红外发射模块。
由于自己搭建的红外发射器不稳定,且干扰因素多,综合考虑,红外发射器采用市场现成模块电路。
红外接收模块由红外接受管PC838及相应器件搭建。
红外遥控原理:
一般红外遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。
一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码,用于核对数据是否接收准确。
根据红外编码的格式,发送数据前需要先发送9ms的起始码和4.5ms的结果码。
遥控串行数据编码波形如下图所示:
接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输出低电平,否则为高电平。
所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低电平处发送38kHz红外信号,高电平处则不发送红外信号。
2、电机驱动模块:
方案一:
使用L297驱动芯片做直流电机驱动,原理:
芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的电机绕组中的电流。
该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。
L297的芯片引脚特别紧凑,采用双列直插20脚塑封封装。
方案二:
使用L298驱动芯片做直流电机驱动,驱动原理和297相似,但是该芯片使用时产生热量过多。
综合考虑,采用方案一。
3、显示模块
方案一:
采用LCD液晶显示器,LCD有明显的优点:
功耗的,美观,寿命长,尺寸小,使用方便,但其成本相对LED较高。
方案二:
采用LED数码管显示,LED数码管亮度高,但不足以达到实验显示要求,且难以控制。
综合考虑采用方案一。
三、系统分析
该系统是基于51系列的AT89S52处理器的电动遥控小车。
本作品主要采用红外发送和红外接收技术,使用红外遥控板上的K1及前后左右五个控制按键触发发射红外信号,利用PC838红外接收管接收红外遥控发出的信号,然后将数据传送至AT89S52单片机中进行数据处理,从而控制L297电机驱动。
实现小车遥控控制的功能。
1、硬件模块设计
仿真图
小车整体图
显示部分
遥控部分
2、软件模块设计
系统初始化
系统数据转化
与LCD显示
外部
中断0等待
No
Yes
处理器对中断数据处理
L297驱动
直流电机车体
4、实验感悟
通过这次实验,我们锻炼了自己的动手能力,了解了遥控小车的原理及制作过程,使我们的团队意识增强,经过几天的努力,完成了模块的设计与制作,完成了整个系统的编程、组装与调试。
基本上满足竞赛的要求,使用模块时,综合考虑电路的简单、电路的成本、以及电路的性能。
此次设计仍有一些问题没有得到完全解决,对一些器件的应用还不是很熟悉,因此在今后的学习中,更要好好学习知识,增加技能训练。
比如红外传感器的原理与应用的知识,光敏二极管的原理与应用电路等,当我们遇到不懂不会的问题时,我们能通过图书馆、网络等各种渠道学习想要知道的知识,有时候虽然只是一个很简单的小车模块,但使我们认识到自己所学的专业知识在实践中所出现的很大的不足。
在实际的设计当中也应注意到的许多问题,如在焊接时应提前布线、制图,以免在调试过程时无从下手。
虽然在这次设计中对于知识的运用和衔接还不够熟练,但是我们将在以后的工作和学习中继续努力、不断完善。
学习自己的专业知识,加强自己的动手实践,努力提高自己的专业技能,能在今后的生活学习中更好的应用。
5、参考文献
[1]董少明.单片机原理与应用.北京:
北京理工大学出版社,2009
[2]黄智伟.全国大学生电子设计竞赛电路设计.北京:
北京航空航天出版社,2006
[3]张毅刚等.电子系统设计.哈尔滨:
哈尔滨工业大学出版社,2009
[4]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编.北京:
北京理工大学出版社
附录1、遥控系统功能键列表
按键编号
按键码
按键名
功能
1
0x10
K1
停止
2
0x1D
UP
前进
3
0x12
DOWN
后退
4
0x19
L
左转
5
0x11
R
右转
附录2、遥控小车硬件连接图
附录2、系统软件程序
/*******************************************************************
**
*红外遥控直流电机运行*
**
*MCU:
AT89S52晶振:
11.0592MHz*
*******************************************************************/
#include//管脚定义头文件
#include"lcd.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;//蜂鸣器
sbitIRIN=P3^2;//红外接收端口
bitflag=0;//红外接收有效标志
ucharcodecdis1[]={"IR_CODE:
--H"};
ucharcodecdis2[]={"RATE:
"};
ucharcodecdis3[]={"STOP"};//停止
ucharcodecdis4[]={">>>>"};//正转
ucharcodecdis5[]={"<<<<"};//反转
ucharcodecdis6[]={"G0!
"};//前进
ucharcodecdis7[]={"BACK"};//后退
ucharIRCOM[6];
charcodereserve[3]_at_0x3b;//保留0x3b开始的3个字节
/**********************************************************
x*0.14ms延时子函数
**********************************************************/
voiddelay(ucharx)
{
uchari;
while(x--)
{
for(i=0;i<14;i++);
}
}
/**********************************************************
蜂鸣器响一声
**********************************************************/
voidbeep(void)
{
uchari;
for(i=0;i<200;i++)
{
delay(5);
BEEP=!
BEEP;//BEEP取反
}
BEEP=1;//关闭蜂鸣器
}
/**********************************************************
编码转换与显示子函数
**********************************************************/
voidcode_conv(void)
{
IRCOM[4]=IRCOM[2];
IRCOM[5]=IRCOM[4]&0x0f;//低位
if(IRCOM[5]>0x09)
IRCOM[5]=IRCOM[5]+0x37;
else
IRCOM[5]=IRCOM[5]+0x30;
IRCOM[4]=(IRCOM[4]&0xf0)>>4;//高位
if(IRCOM[4]>0x09)
IRCOM[4]=IRCOM[4]+0x37;
else
IRCOM[4]=IRCOM[4]+0x30;
lcd_pos(10,1);//第一行10列
lcd_wdat(IRCOM[4]);
lcd_wdat(IRCOM[5]);
}
/**********************************************************
主函数
**********************************************************/
voidmain(void)
{
P0=0xff;//端口初始化
P2=0xff;
P1=0xf0;//步进电机断电
lcd_init();//LCD1602初始化
lcd_pos(0,1);//设置显示位置为第一行
wr_string(cdis1,0);//显示字符串1
lcd_pos(0,2);//设置显示位置为第二行
wr_string(cdis2,0);//显示字符串2
lcd_pos(10,2);//第二行10列
wr_string(cdis3,0);//显示停止标记
EA=1;//允许总中断
EX0=1;//使能INT0外部中断
IT0=1;//下降沿触发
//flag=1;
while
(1)
{
code_conv();//显示键码
if(flag)
{
if(IRCOM[2]==0x10)//为遥控器K1键
{
lcd_pos(10,2);//第二行10列
wr_string(cdis3,0);//显示停止标记
P1=0xf0;//步进电机断电
}
if(IRCOM[2]==0x1d)//为遥控器的UP键
{//小车前进
lcd_pos(10,2);//第二行10列
wr_string(cdis6,0);//的显示前进标记
P1=0xf9;//取数据,前进
delay(5);
}
if(IRCOM[2]==0x12)//为遥控器的DOWN键
{//小车后退
lcd_pos(10,2);//第二行10列
wr_string(cdis7,0);//显示后退标记
P1=0xf5;//取数据,后退
delay(5);
}
if(IRCOM[2]==0x19)//为遥控器的L键
{
//小车左转
lcd_pos(10,2);//第二行10列
wr_string(cdis5,0);//显示左转标记
P1=0xe8;//取数据,左转
delay(5);
}
if(IRCOM[2]==0x11)//为遥控器的R键
{
//小车右转
lcd_pos(10,2);//第二行10列
wr_string(cdis4,0);//显示右转标记
P1=0xd1;//取数据,右转
delay(5);
}
flag=0;
}
}
}
/**********************************************************
INT0中断服务子函数(负责红外解码)
**********************************************************/
voidIR_IN()interrupt0
{
unsignedcharj,k,Num=0;
EX0=0;//关闭INT0中断
delay(15);//延时
if(IRIN==1)
//再确认IR信号是否出现
{
EX0=1;//开INT0中断
return;//退出
}
while(!
IRIN)
//等IR变为高电平,跳过9ms的前导低电平信号。
{
delay
(1);
}
while(IRIN)
//等IR变为低电平,跳过4.5ms的前导高电平信号。
{
delay
(1);
}
for(j=0;j<4;j++)
//收集四组数据
{
for(k=0;k<8;k++)
//每组数据有8位
{
while(IRIN)
//等IR变为低电平
{
delay
(1);
}
while(!
IRIN)
//等IR变为高电平
{
delay
(1);
}
while(IRIN)
//计算IR高电平时长
{
delay
(1);
Num++;
if(Num>=15)
{
EX0=1;//0.14ms计数过长自动离开。
return;
}
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(Num>=8)
IRCOM[j]=IRCOM[j]|0x80;
//数据最高位补“1”
Num=0;
}//endfork
}//endforj
if(IRCOM[0]!
=0x00)
//比较用户码
{
EX0=1;//开INT0中断
return;//退出
}
if(IRCOM[2]!
=~IRCOM[3])
//接收数据是否正确
{
EX0=1;//开INT0中断
return;//退出
}
beep();//蜂鸣器响一声
flag=1;
EX0=1;//重新开INT0中断
}