红外遥控小车Word下载.docx

上传人:b****5 文档编号:19246592 上传时间:2023-01-04 格式:DOCX 页数:16 大小:387.10KB
下载 相关 举报
红外遥控小车Word下载.docx_第1页
第1页 / 共16页
红外遥控小车Word下载.docx_第2页
第2页 / 共16页
红外遥控小车Word下载.docx_第3页
第3页 / 共16页
红外遥控小车Word下载.docx_第4页
第4页 / 共16页
红外遥控小车Word下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

红外遥控小车Word下载.docx

《红外遥控小车Word下载.docx》由会员分享,可在线阅读,更多相关《红外遥控小车Word下载.docx(16页珍藏版)》请在冰豆网上搜索。

红外遥控小车Word下载.docx

这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。

如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。

接收器及解码:

一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

实物如下图所示:

电源端

接地端

信号输出端

注意:

一体化红外接收头在使用时,应通过一个限流电阻与电源连接。

红外接收头将38K载波信号过虑,得到与发射代码反向接收代码。

也就是说

若发射端发射的是:

则接受端解析输出的是:

解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。

如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,

因此取0.56ms+(1.12-0.56)/2=0.84ms最为可靠,一般取0.84ms左右均可。

根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

第二部分:

程序中的子函数

1、指示灯函数:

//当一体化接收头接收到信号并解析成功后,指示灯闪烁一下

sbitzhishideng=P1^0;

voidzhishi()

{

unsignedchari=200,j=125;

zhishideng=0;

while(i--)

while(j--);

zhishideng=1;

}

2、中断控制函数:

//当有按键按下时,触发外部中断0,中断函数先对红外的引导码进行识别,若识别正确,则调用后面的解码函数对红外进行解码。

voidInt0(void)interrupt0

EX0=0;

//关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号

TH0=0;

//定时器T0的高8位清0

TL0=0;

//定时器T0的低8位清0

TR0=1;

//开启定时器T0

while(IR==0);

//如果是低电平就等待,给引导码低电平计时

TR0=0;

//关闭定时器T0

LowTime=TH0*256+TL0;

//保存低电平时间

//开启定时器T0

while(IR==1);

//如果是高电平就等待,给引导码高电平计时

//关闭定时器T0

HighTime=TH0*256+TL0;

//保存引导码的高电平长度

if((LowTime>

8500)&

&

(LowTime<

9500)&

(HighTime>

4200)&

(HighTime<

4800))//如果是引导码,就开始解码,否则放弃。

{

if(DeCode()==1)//执行遥控解码功能

{

//此处是小车的功能实现代码

}

zhishi();

}

EX0=1;

//开启外中断EX0

3、单片机解码红外函数:

//当正确识别后,函数返回1。

(注:

本小车的单片机使用的是12M的晶振)

bitDeCode(void)

{

unsignedchari,j;

unsignedchartemp;

//储存解码出的数据

for(i=0;

i<

4;

i++)//连续读取4个用户码和键数据码

{

for(j=0;

j<

8;

j++)//每个码有8位数字

temp=temp>

>

1;

//temp中的各数据位右移一位,因为先读出的是高位数据

//定时器清0

//如果是低电平就等待,低电平计时

//保存低电平宽度

//如果是高电平就等待

TR0=0;

//保存高电平宽度

if((LowTime<

460)||(LowTime>

660))return0;

//如果低电平长度不在合理范围,则认为出错,停止解码

if((HighTime>

460)&

660))temp=temp&

0x7f;

//如果高电平时间在560微秒左右,则该位是0。

if((HighTime>

1500)&

1900))temp=temp|0x80;

//如果高电平时间在1680微秒左右,则该位是1。

}

a[i]=temp;

//将解码出的字节值储存在a[i]

}

if(a[2]==~a[3])return1;

//验证键数据码和其反码是否相等,一般情况下不必验证用户码。

}

第三部分:

程序整体

1、首先从实现最简单的功能开始:

前进、后退和停止。

 

#include<

reg52.h>

//包含单片机寄存器的头文件

sbitIR=P3^2;

//将IR位定义为P3.2引脚

sbitzhishideng=P1^0;

sbitdianji1=P1^1;

sbitdianji2=P1^2;

unsignedchara[4];

//储存用户码、用户反码与键数据码、键数据反码

unsignedintLowTime,HighTime;

//储存高、低电平的宽度

voidzhishi()//指示灯函数

unsignedchari=200,j=125;

zhishideng=0;

while(i--)

zhishideng=1;

bitDeCode(void)//单片机解码函数

//如果高电平时间在560微秒左右,则该位是0

//如果高电平时间在1680微秒左右,则该位是1

//验证键数据码和其反码是否相等,一般情况下不必验证用户码

voidmain()

EA=1;

//开启总中断

EX0=1;

//开外中断0

ET0=1;

//定时器T0中断允许

TMOD=0x01;

//使用定时器T0的模式1

//定时器T0关闭

while

(1);

//等待用户的按键操作

if(a[2]==0x09){P0=0x05;

}//如果按下后退键,则电机反转

if(a[2]==0x15){P0=0x0a;

}//如果按下前进键,则电机正转

if(a[2]==0x47){dianji1=dianji2=0;

}//如果按下停止键,则电机不使能

//指示灯闪烁,表示正确解析红外信号并进行相关操作,且有适当延时效用

}

2、在实现了前进、后退和停止的功能后,我们可对程序进行适当扩充,使小车具有除前进、后退和停止功能外,还具有开启、加速、减速、左转、右转和原地打转的功能。

代码如下:

sbitjieshou=P3^2;

sbitzhishideng=P1^0;

unsignedcharflag1=0,flag2=0;

unsignedinthightime,lowtime;

voiddelay(unsignedchari)//延时函数

unsignedcharj=124;

voidzhishi()//指示灯函数

delay(200);

intshibie()//单片机解码红外函数

unsignedchari,x,temp;

i++)

for(x=0;

x<

x++)

temp=temp>

TH0=0;

TL0=0;

TR0=1;

while(jieshou==0);

TR0=0;

lowtime=TH0*256+TL0;

while(jieshou==1);

hightime=TH0*256+TL0;

if(lowtime<

400||lowtime>

700)return0;

if(hightime>

450&

hightime<

675)temp=temp&

0x7f;

1410&

1955)temp=temp|0x80;

a[i]=temp;

//定时器T0中断允许

//定时器T0关闭

while

(1)

if(flag1=='

+'

)//前进时,把速度分为5挡,通过占空比来控制

if(flag2==1){P0=0xf5;

delay

(2);

P0=0xf0;

delay(8);

if(flag2==2){P0=0xf5;

delay(4);

delay(6);

if(flag2==3){P0=0xf5;

if(flag2==4){P0=0xf5;

if(flag2==5){P0=0xf5;

-'

)//后退时,分6挡,其中0挡是停止挡,是避免小车停止这一功能另写一个子函数而进行的结合;

另外5个挡才是真正通过占空比来进行后退调速的

if(flag2==0){P0=0xf0;

if(flag2==1){P0=0xfa;

if(flag2==2){P0=0xfa;

if(flag2==3){P0=0xfa;

if(flag2==4){P0=0xfa;

if(flag2==5){P0=0xfa;

<

'

)//左转功能,通过控制左右轮速度的不同而进行左转

P0=0xf4;

delay(3);

P0=0xf1;

delay(7);

)//右转功能,通过控制左右轮速度的不同而进行右转

o'

){P0=0xf4;

}//原地打转功能,通过一边轮转,一边轮不转来实现

voidint0()interrupt0//中断函数

TH0=0;

TL0=0;

TR0=1;

while(jieshou==0);

lowtime=TH0*256+TL0;

while(jieshou==1);

hightime=TH0*256+TL0;

if(lowtime>

8460&

lowtime<

9550&

hightime>

3910&

5100)

if(shibie()==1)

if(a[2]==0x45){flag1='

;

flag2=3;

}//开启直流电机

if(a[2]==0x47){flag1='

flag2=0;

}//关闭直流电机

if(a[2]==0x09){flag1='

flag2=flag2+1;

if(flag2==6)flag2=1;

}//前进

if(a[2]==0x15){flag1='

}//后退

if(a[2]==0x40){flag1='

}//左转

if(a[2]==0x43){flag1='

}//右转

if(a[2]==0x16){flag1='

}//原地打转

//指示灯闪烁

第四部分:

说明和注意事项

1、本制作中,单片机的晶振为12Mhz的,若使用其他频率的晶振,要对程序里红外解码的有关部分进行数值上的修改,否则单片机不能正确识别和解码。

2、一体化红外接收头容易受到干扰,故应该让接收头远离电机(电机需要大电流,在加减速时会造成很大的干扰)和单片机。

实际制作中,可以用硬棒把接收头架起来。

3、红外遥控的距离有限,大概为7-8米左右,故应当注意遥控的距离。

4、本制作中使用的车体是四驱的,即含有四个独立电机。

其中车体一边的两电机并联接入驱动模块中使用,其效果如同两驱的一样。

所以也适用于只有两个独立电机的车体。

5、本制作中,电机驱动使用的是双H桥直流电机驱动成品模块,其说明图如下(读者可以自己使用L298来制作):

电机A、B的正反转控制

电机A、B的使能控制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1