前言
本次主要介绍一下做的关于DSP的第五次实验:基于NEC的IR红外接收实验,主要包括设计原理、实验要求、运行代码、硬件结果以及心得体会。
一、设计内容
1.1 设计原理
NEC协议是一种红外通信协议,其传输特点是发送8位地址和8位命令,并且地址和命令都传输两遍(连续两个8位地址,组成一个16位地址;第二次为补码,用于检验),NEC协议的脉冲间隔调制为38kHz 载波频率。我们知道,人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为0.62~0.76μm;紫光的波长范围为0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。红外遥控具有抗干扰,电路简单,容易编码和解码,功耗小,成本低的优点。红外IR如下图:
1.2 实验要求
使用红外发射遥控器来进行按键操作,通过红外IR来接收遥控器按键的编码值,然后进行解码,并将按键的解码值显示在LED灯D4~D7上显示。
二、实验代码
代码如下(示例)
#include "stdio.h"
#include "evm5515.h"
#include "evm5515_emif.h"
Int LED_DATA2[]={0X1000,0X2000,0X0400,0X0800,0X3000,0X2400,0X0c00,0X3c00};
int LED_DATA1[]={0X0004,0X0008,0X0010,0X0800,0X000c,0X0018,0X0810,0X081c, };
int databuffer,temp_l,temp_h ;
int *IR_souraddr;
Int16 EMIF_init()
{
Uint16 i;
*(ioport volatile unsigned *)0x1C04=0x10;
*(ioport volatile unsigned *)0x1C05=0x2;
for(i=0;i<500;i++){;}
*(ioport volatile int *)0x1C02 &= 0x77FF;//打开EMIF时钟
*(ioport volatile unsigned *)0x1C04=0x020;
*(ioport volatile unsigned *)0x1C05=0x00fb;
for(i=0; i<50; i++);
EMIF_AWCCR1 = 0x0080;
EMIF_AWCCR2 = 0x00E4;
EMIF_ACS2CR1 = 0xFFF9;
return 0;
}
void main( void )
{
EVM5515_init(); //初始化
EMIF_init();
SYS_EXBUSSEL=0X6A3F; //接口设置
SYS_GPIO_DIR0=0XFFFF;
SYS_GPIO_DIR1=0XFFFF;
IR_souraddr = (int *)0x600010;
while(1)
{
databuffer = *IR_souraddr;
temp_l = databuffer>>4;
temp_h = databuffer & 0x000f;
SYS_EXBUSSEL=0X6A3F; //显示前四个LED灯
SYS_GPIO_DATAOUT0= LED_DATA2[temp_h]; //高四位
EVM5515_waitusec(200000); //时延
SYS_EXBUSSEL=0X2A3F; //显示后四个LED灯
SYS_GPIO_DATAOUT1= LED_DATA1[temp_l]; //低四位
SYS_GPIO_DATAOUT0=0x0000; //清零,熄灭LED灯
EVM5515_waitusec(200000); //时延
}
}
三、 硬件验证结果
下图是用不同的遥控按钮对应的电路板仿真的四个过程
四、遇到问题
问题1:第一次修改完程序后,LED灯D4~D7一直不能被点亮。
解决办法:在反复分析程序,发现如下图所示,LED灯D0-D3的SYS_EXBUSSEL的赋予了对应的地址0X6A3F,但是LED灯D4~D7的SYS_EXBUSSEL的没有赋予对应的地址,因此无法点亮,随后添加了如下图所示的语句,最终点亮了后四位。
问题2:不明白程序中的语句IR_souraddr=(int*)0x600010;的含义。
解决办法:通过网上资料的查询,(int*)是把此地址强转为int型的地址,而0x600010是遥控按键键码对应的地址。后边循环中的语句databuffer =IR_souraddr;中的IR_souraddr就是再解引用则把由此地址开始的连续的字节作为int类型来进行存储(如下图)。
总结
这次的实验分为两个部分:理解实验程序并尝试修改,用遥控控制电路板检测LED灯的点亮情况。
在第一个部分中,我刚开始是不明白遥控按键与数码管的显示数字的一一对应关系,然后通过运行实验程序,分别按下不同的按键来观察数码管显示的数字与程序LED_DATA1和LED_DATA2中数据的对应关系,随后将数码管的数据改成了LED流水灯的数据,由此实现了不同按键对应电路板上显示自己想要的流水灯情况。在修改程序的部分,去掉了数码管的部分,将流水灯的相关程添加进来,实现了实验程序的分析修改。
在第二个部分中,在第一部分已经将程序修改完成,第二部分就是来验证第一部分程序的可行性,运行之后,刚开始程序提示错误,原来是误把LED_DATA1[temp_l]中的“字母l”当成了“数字1”,之后改正,能够正常通过按键运行相应的流水灯。
总之,这次的实验对我来说难度还是比较大的,也是遇到了很多问题,主要是第一部分的遥控按键与数码管的显示数字的一一对应关系的分析用了不少时间,通过对程序的一分析加上网上资料的查询才明白了实验原理,最终都顺利完成了实验,收获很多。