基于ARM的红外遥控信号分析器设计.docx
《基于ARM的红外遥控信号分析器设计.docx》由会员分享,可在线阅读,更多相关《基于ARM的红外遥控信号分析器设计.docx(16页珍藏版)》请在冰豆网上搜索。
基于ARM的红外遥控信号分析器设计
ARM课程设计报告
基于ARM的红外遥控信号分析器设计
院系:
机电工程学院
专业:
电子信息工程
年级(班级):
xxxx级(x)班
姓名:
xxx
学号:
xxxxxxxxxxx
指导教师:
xxx
职称:
讲师
完成日期:
2014年x月xx日
目录
1设计任务及要求1
2总体设计思路及功能描述1
2.1设计思路1
2.2功能描述1
3各部分程序功能及详细设计2
3.1红外显示界面设计2
3.2红外按键检测流程3
3.3红外接收信号检测的程序实现3
3.4红外接收结果显示5
4调试的步骤及调试过程中出现的问题以及解决方法6
4.1调试的步骤6
4.2问题以及解决方法7
5设计心得体会7
附录A:
源程序9
基于ARM的红外遥控信号分析器设计
1设计任务及要求
这次的ARM课程设计,我选的课题是基于ARM的红外遥控信号分析器设计,需设计一个能在LCD屏上显示所接收的红外遥控按键名称。
其实现的功能如下:
(1)能接收并显示普通电视红外遥控信号
(2)译码遥控信号并显示
2总体设计思路及功能描述
2.1设计思路
本次设计方案就是利用ARM的多功能性的特点来设计的,具体思路为利用S3C2440和触摸屏的驱动对产生的信号进行触摸屏显示,设计框图如下图。
图1总体框图
1、以ARM作为核心,综合应用了中断系统、定时器、计数器等知识,应用红外光的优点
2、遥控发射器通过对红外光发射频率的控制来区别不同的操作
3、遥控接收器通过对红外光接收频率的识别,判断出控制操作,来完成整个红外遥控发射、接收过程
4、S3C2440通过对遥控接收器的信号分析处理,解码出遥控器上对应的按键,并将其按键名显示在LCD屏上。
2.2功能描述
能在LCD屏上显示所接收的红外遥控按键名称。
其实现的功能如下:
(1)能接收并显示普通电视红外遥控信号
(2)译码遥控信号并显示
3各部分程序功能及详细设计
3.1红外显示界面设计
图2红外显示界面
红外显示界面的程序实现:
GUI_SetBkColor(GUI_RED);
GUI_Clear();
GUI_SetPenSize(10);
GUI_SetColor(GUI_BLACK);//设定前景颜色API
GUI_SetTextMode(GUI_TM_TRANS);
GUI_DispStringHCenterAt("红外遥控按键显示",240,10);
GUI_DispStringHCenterAt("您按下的按键是:
",60,100);
GUI_DispStringHCenterAt("xx电信(x)班",250,200);
GUI_DispStringHCenterAt("xxxxx号",245,220);
3.2红外按键检测流程
图3红外按键检测流程图
红外接收头检测到遥控器红外发射来的信号,S3C2440对信号进行分析处理,判断是否接收到正确的红外信号编码,如果信号错误重新开始检测,若成功识别,则将遥控按键名称显示在LCD屏上。
3.3红外接收信号检测的程序实现
unsignedcharj,k,N=0,L=0,X=21;
while((rGPGDAT&0x1)==0)
{
delay(15);
if(rGPGDAT&0x1)
{
break;
}
//确认IR信号出现
while((rGPGDAT&0x1)==0)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay
(1);}
while(rGPGDAT&0x1)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{delay
(1);
L++;
}
if(L>3)
{break;}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while((rGPGDAT&0x1)==0)//等IR变为高电平
{delay
(1);}
while(rGPGDAT&0x1)//计算IR高电平时长
{
delay
(1);
N++;
if(N>=30)//0.14ms计数过长自动离开。
{break;}
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
/*if(IRCOM[2]!
=(~IRCOM[3]))
{
break;
}*/
IRCOM[5]=IRCOM[2]&0x0F;//取键码的低四位
IRCOM[6]=IRCOM[2]>>4;//右移4次,高四位变为低四位
3.4红外接收结果显示
图4红外接收显示结果
3.5程序流程图
Y
图7设计总流程图
4调试的步骤及调试过程中出现的问题以及解决方法
4.1调试的步骤
1、连接实验箱与计算机的串口线,打开计算机超级终端,并设定为com1,115200,8,1,0N
2、连接仿真调试电缆(J-Link)。
3、打开ARM集成开发环境ADS,按要求编写或打开实验程序。
4、根据实验内容要求编写,调试程序。
5、通过ADS的DEBUG把编写好的程序加载到J-Link,进行程序仿真测试。
6、记录相关数据和实验现象。
7、调试完毕,整理实验箱,并切断实验箱电源。
4.2问题以及解决方法
1、出现文件找不到的错误。
通过菜单的Project->Removeobject,并重新编译程序,生成新的.axf文件,便可解决问题。
2、调试时发现无法解码红外信号,经排除遥控器电量不足的可能后,用示波器直接对红外接收头的输出引脚进行波形观测,当按下遥控按键时,示波器会显示出一瞬间的波形,按住不放时,遥控器会间断发射循环码,从示波器的波形分析,红外接收到的波形是正确的。
因为红外遥控发射的红外信号遵循NEC协议,而程序是用定时器进行延时,然后对延时进行计数,对计数值进行分析处理可得到遥控器的红外编码,因此延时时间需要比较精准。
用延时程序写一个简单的方波,再用示波器观测其延时时间,经过调整,将延时调节到了理想状态,再重新编译程序,便成功的接收到了正确的红外信号。
3、将遥控的按键名显示在LCD上,出现数据更新时重叠显示,进查阅GUI手册,调用清初文字的函数,在每次跟新按键名之前,运行该函数,便解决该问题。
5设计心得体会
在本次的ARM课程设计过程中,从构思设计到实现,遇到了很多问题,但都一一克服了。
本次课程设计让我们对嵌入式系统的硬件和软件的基本原理、基本特点,嵌入式系统设计的基本方法有了更进一步的了解掌握。
通过课程设计,我们对ARM这门课程有了更深一步的了解。
也让我感受到了ARM的强大与重要,意识到我们需要花更多的时间去将ARM的理论应用到实践中去,多动手,多去解决问题,锻炼自己解决问题的能力,积累经验,才能正在学好ARM这门课程。
这次课程设计,我经过自己的努力,在老师同学的帮助下,顺利完成了。
参考文献
[1]戴峻峰,付丽辉.多功能红外线遥控器的设计.2002.8(12):
16~18.
[2]苏长赞.红外线与超声波遥控,北京:
人民邮电出版社.1995年.
[3]杨恢先,王子菡,杨穗,陶霞.一种基于单片机的红外遥控软件解码方法,自动化与仪器仪表.2004,22
(2):
16~18.
[4]s3c2440中文数据手册(完整版).pdf.
[5]ARM公司.arm指令集[EB/OL].[2013-06-10],
附录A:
程序
#include"config.h"
#include"gui.h"
voidledflash(void);
staticvoid__irqkey_handler(void);
voidkey_init(void);
unsignedcharIRCOM[7];
unsignedcharPRING[21][10]={"关机","SETUP","静音","MODE","返回",
"EQ","后退","前进","暂停/播放","音量减",
"音量加","0","1","2","3",
"4","5","6","7","8","9"};
voidusDelay(inttime)
{
inti,j;
for(i=time;i>0;i--)
for(j=1;j>0;j--);
}
voiddelay(unsignedcharx)//x*0.14MS
{
inty;
for(y=0;yusDelay(134);
}
voidledflash(void)
{
inti;
/*
rGPGCON=(rGPGCON&0xFFFFFFF0)|(0xd<<0);
rGPGDAT=rGPGDAT&0xfffe|0x0;
for(i=0;i<100000;i++);//延时
rGPGDAT=rGPGDAT&0xfffe|0x1;
for(i=0;i<100000;i++);//延时
rGPBDAT=(rGPBDAT&0xf0f)|(0xd<<4);
for(i=0;i<500000;i++);//延时
rGPBDAT=(rGPBDAT&0xfff)|(0xf<<4);
for(i=0;i<500000;i++);//延时
}
voidMain()
{
/*TargetInit();
rGPFCON=(rGPFCON&0xFF0F)|(0x7<<4);
while
(1)
{
delay
(1);
rGPFDAT=(rGPFDAT&0xf7)|(1<<3);
delay
(1);
rGPFDAT=(rGPFDAT&0xf7)|(0<<3);
}
*/
unsignedcharh=0,l=0;
TargetInit();
GUI_Init();
rGPBCON=(rGPBCON&0xfff3ff)|(0x4<<8);
rGPGUP&=0xfffe|0x1;
rGPGCON=(rGPGCON&0xFFFFFFF0)|(0xc<<0);
GUI_SetBkColor(GUI_RED);
GUI_Clear();
GUI_SetPenSize(10);
GUI_SetColor(GUI_BLACK);
//设定前景颜色API
GUI_SetTextMode(GUI_TM_TRANS);
GUI_DispStringHCenterAt("红外遥控按键显示",240,10);
GUI_DispStringHCenterAt("您按下的按键是:
",60,100);
GUI_DispStringHCenterAt("xx电信(x)班",250,200);
GUI_DispStringHCenterAt("xxxxx号",245,220);
while
(1)
{
unsignedcharj,k,N=0,L=0,X=21;
while((rGPGDAT&0x1)==0)
{
delay(15);
if(rGPGDAT&0x1)
{
break;
}
//确认IR信号出现
while((rGPGDAT&0x1)==0)//等IR变为高电平,跳过9ms的前导低电平信号。
{delay
(1);}
while(rGPGDAT&0x1)
//等IR变为低电平,跳过4.5ms的前导高电平信号。
{delay
(1);
L++;
}
if(L>3)
{break;}
for(j=0;j<4;j++)//收集四组数据
{
for(k=0;k<8;k++)//每组数据有8位
{
while((rGPGDAT&0x1)==0)//等IR变为高电平
{delay
(1);}
while(rGPGDAT&0x1)
//计算IR高电平时长
{
delay
(1);
N++;
if(N>=30)//0.14ms计数过长自动离开。
{break;}
}
//高电平计数完毕
IRCOM[j]=IRCOM[j]>>1;//数据最高位补“0”
if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补“1”
N=0;
}//endfork
}//endforj
/*if(IRCOM[2]!
=(~IRCOM[3]))
{
break;
}*/
IRCOM[5]=IRCOM[2]&0x0F;
//取键码的低四位
IRCOM[6]=IRCOM[2]>>4;
//右移4次,高四位变为低四位
if(IRCOM[5]>9)
{l=IRCOM[5]+0x37;}
else
l=IRCOM[5]+0x30;
if(IRCOM[6]>9)
{h=IRCOM[6]+0x37;}
else
h=IRCOM[6]+0x30;
if((h==(4+0x30))&(l==(8+0x30)))
{X=0;}
if((h==(2+0x30))&(l==(8+0x30))|(h==(14+0x37))&(l==(5+0x30)))
{X=1;}
if((h==(0+0x30))&(l==(8+0x30))|(h==(14+0x37))&(l==(1+0x30)))
{X=2;}
if((h==(6+0x30))&(l==(8+0x30)))
{X=3;}
if((h==(14+0x37))&(l==(8+0x30)))
{X=4;}
if((h==(8+0x30))&(l==(8+0x30)))
{X=5;}
if((h==(0+0x30))&(l==(0+0x30)))
{X=6;}
if((h==(4+0x30))&(l==(2+0x30))|(h==(10+0x37))&(l==(8+0x30)))
{X=7;}
if((h==(12+0x37))&(l==(1+0x30)))
{X=8;}
if((h==(2+0x30))&(l==(2+0x30))|(h==(10+0x37))&(l==(4+0x30)))
{X=9;}
if((h==(9+0x30))&(l==(8+0x30))|(h==(12+0x37))&(l==(3+0x30))|(h==(15+0x37))&(l==(15+0x35)))
{X=10;}
if((h==(4+0x30))&(l==(1+0x30))|(h==(12+0x37))&(l==(8+0x30)))
{X=11;}
if((h==(6+0x30))&(l==(1+0x30))|(h==(12+0x37))&(l==(12+0x37)))
{X=12;}
if((h==(14+0x37))&(l==(3+0x30))|(h==(9+0x30))&(l==(12+0x37)))
{X=13;}
if((h==(2+0x30))&(l==(11+0x37))|(h==(8+0x30))&(l==(5+0x30)))
{X=14;}
if((h==(14+0x37))&(l==(1+0x30))|(h==(13+0x37))&(l==(12+0x37)))
{X=15;}
if((h==(6+0x30))&(l==(3+0x30))|(h==(8+0x30))&(l==(12+0x37)))
{X=16;}
if((h==(10+0x37))&(l==(11+0x37))|(h==(9+0x30))&(l==(5+0x30)))
{X=17;}
if((h==(10+0x37))&(l==(8+0x30)))
{X=18;}
if((h==(10+0x37))&(l==(10+0x37))|(h==(11+0x37))&(l==(5+0x30)))
{X=19;}
if((h==(10+0x37))&(l==(9+0x30))|(h==(13+0x37))&(l==(5+0x30)))
{X=20;}
GUI_GotoXY(150,100);
GUI_DispCEOL();
GUI_DispStringAtCEOL(&PRING[X],235,100);
//GUI_DispStringHCenterAt(&PRING[X],150,100);
/*GUI_SetFont(&GUI_Font8x16);
GUI_GotoXY(150,100);
GUI_DispCEOL();
GUI_GotoXY(150,100);
GUI_DispChar(h);
GUI_GotoXY(170,100);
GUI_DispCEOL();
GUI_GotoXY(170,100);
GUI_DispChar(l);*/
}
}
}
voidkey_init(void)
{
rGPGCON&=~(0x3<<0);
rGPGCON|=(0x2<<0);
rEXTINT1&=~(0xf<<0);
rEINTPEND|=(1<<8);
rEINTMASK&=~(1<<8);
pISR_EINT8_23=(U32)key_handler;
EnableIrq(BIT_EINT8_23);
}
staticvoid__irqkey_handler(void)
{
if(rINTPND==BIT_EINT8_23);
{
ClearPending(BIT_EINT8_23);
if(rEINTPEND&(1<<8))
rEINTPEND|=(1<<8);
for(;;){ledflash();}
}
}