嵌入式系统设计与开发课程设计Word文件下载.docx
《嵌入式系统设计与开发课程设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计与开发课程设计Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
12)完全兼容MCS-51产品
原理图:
芯片图:
引脚介绍:
ALE地址锁存允许
/PSEN程序存储器允许
EA/VPP为0-访问外部程序存储器
为1-访问内部程序存储器
RST复位信号输入
XTAL1、XTAL2外部晶振
P0.0~P0.7I/O端口(P0口)
P1.0~P1.7I/O端口(P1口)
P2.0~P2.7I/O端口(P2口)
P3.0~P3.7I/O端口(P3口)
五、设计原理:
红外对射管由发射管和接受管组成,设计中发射管在遥控上,接受管为方形红外接收管,下面将进行详细介绍。
1、红外接收管:
红外线接收管是在LED行业中命名的,是专门用来接收和感应红外线发射管发出的红外线光线的。
一般情况下都是与红外线发射管成套运用在产品设备当中。
红外线接收管是将红外线光信号变成电信号的半导体器件,它的核心部件是一个特殊材料的PN结,和普
通二极管相比,在结构上采取了大的改变,红外线接收管为了更多更大面积的接受入射光线,PN结面积尽量做的比较大,电极面积尽量减小,而且PN结的结深很浅,一般小于1微米。
红外线接收二极管是在反向电压作用之下工作的。
没有光照时,反向电流很小(一般小于0.1微安),称为暗电流。
当有红外线光照时,携带能量的红外线光子进入PN结后,把能量传给共价键上的束缚电子,使部分电子挣脱共价键,从而产生电子---空穴对(简称:
光生载流子)。
它们在反向电压作用下参加漂移运动,使反向电流明显变大,光的强度越大,反向电流也越大。
这种特性称为“光电导”。
红外线接收二极管在一般照度的光线照射下,所产生的电流叫光电流。
如果在外电路上接上负载,负载上就获得了电信号,而且这个电信号随着光的变化而相应变化。
2.遥控器
红外线遥控是目前使用最广泛的一种通信和遥控手段,它具有体积小、功耗低、功能强、成本低等特点。
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下所示:
a.发射部分:
键盘矩阵、编码调制、LED红外发送器
b.接收部分
3.红外解码
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
a.采用脉宽调制的串行码
b.以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;
以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。
LC7461产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码用于核对数据是否接收正确。
当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。
解码时,“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。
如果从0.56ms低电平过后,再经过0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”。
为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,一般取0.84ms左右即可。
4.数码管显示电路
六、设计过程:
1.熟悉阶段:
开发板、编程软件(KEIL)、下载方法(看门狗STC-ISP)
2.硬件结构
3.程序流程图
七、心得体会
经过这次的设计,对51单片机中的红外遥控数码管这一部分有了充分的了解。
先从硬件上来说,对红外对射管有了一定的了解,知道了它的工作原理。
对遥控解码原理也有了一定的了解,理解到是通过判断电平延时的长度判断遥控码为0还是为1。
在读取了所有遥控码之后,再对遥控码第三位的数据码进行读取,从而显示相应的按键数字。
了解时间值的作用之后,也就自然知道解码过程是把时间值转换为二进制值的原因了。
再从程序来说,以前学过C语言,MATLAB,JAVA,都是编程的,所以对嵌入式的程序不会太陌生,但是要真正搞懂或者要自己编程还是有极大的困难,而通过这次设计,对本实验的程序做了一定的了解,虽然有些地方还不是很明白,但是充分提供了一个学习的机会,经过上网查找,同学讨论,还是学到了不少东西。
通过自己选题,可以选择自己感兴趣的课题做实验,增加了学习兴趣,发现嵌入式系统的优点:
专用性强,系统精简等。
主要还是靠程序。
相信在不断训练,理解程序下,将来自己也可以编写出实用的程序,来实现一些功能。
八、参考资料
1.《红外线解码心得和解码程序》作者:
程克辉
网址:
2.《遥控器红外解码数码管显示》作者:
151129
3.《基于51单片机的红外线控制系统》作者:
突然想去很远
4.《红外解码1602液晶显示》作者:
QLS小屁孩
附:
程序
//使用12M晶振
#include<
reg52.h>
stdio.h>
intrins.h>
#defineTURE1
#defineFALSE0
——————————————
基本参数
定义
sbitIR=P3^2;
//红外接口标志
sbitQ=P2^5;
sbitdula=P2^6;
sbitwela=P2^7;
unsignedcharconstdofly[]
={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//显示0-9
——————————————————
unsignedcharirtime;
//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
//红外码一般由四个字节组成:
地址码-地址码-数据码-数据反码
unsignedcharirdata[33];
//存储32+1位
————————————————
voidDelay(unsignedcharmS);
voidIr_work(void);
voidIrcordpro(void);
voidtim0_isr(void)interrupt1using1//定时器0中断服务函数,记录电平的持续时间
{
irtime++;
}
voidex0_isr(void)interrupt0using0//外部中断0服务函数,存储持续时间
staticunsignedchari;
staticbitstartflag;
if(startflag)
{
if(irtime<
42&
&
irtime>
=33)//引导码TC9012的头码
i=0;
irdata[i]=irtime;
//存储每个电平的持续时间
irtime=0;
i++;
if(i==33)
{
irok=1;
定时器
及中断
i=0;
}
}
else
{irtime=0;
startflag=1;
voidTIM0init(void)//定时器0初始化
TMOD=0x02;
//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;
//reloadvalue
TL0=0x00;
//initialvalue
ET0=1;
//开中断
TR0=1;
————————————————————
voidEX0init(void)
IT0=1;
//Configureinterrupt0forfallingedgeon/INT0(P3.2)
EX0=1;
//EnableEX0Interrupt
EA=1;
voidIr_work(void)//红外键值散转程序
Q=1;
wela=1;
P0=0x00;
wela=0;
dula=1;
switch(IRcord[2])//判断第三位的数码值
case0:
P0=dofly[1];
break;
//1显示相应的按键值
case1:
P0=dofly[2];
//2
case2:
P0=dofly[3];
//3
case3:
P0=dofly[4];
//4
case4:
P0=dofly[5];
//5
case5:
P0=dofly[6];
//6
case6:
P0=dofly[7];
//7
case7:
P0=dofly[8];
//8
case8:
P0=dofly[9];
//9
}
irpro_ok=0;
//处理完成标志
dula=0;
——————————————————————
voidIrcordpro(void)//红外码值处理函数,即解码
{
unsignedchari,j,k;
unsignedcharcord,value;
k=1;
for(i=0;
i<
4;
i++)//处理4个字节
for(j=1;
j<
=8;
j++)//处理1个字节8位
cord=irdata[k];
if(cord>
7)//判断读取的时间值是否大于1
{
value=value|0x80;
//读取数置1
else
value=value;
if(j<
8)
value=value>
>
1;
//由于从高位读取遥控器发送的数据,故要右移把第一次度的数据送到最低位
k++;
IRcord[i]=value;
value=0;
irpro_ok=1;
//处理完毕标志位置1
voidmain(void)
EX0init();
//EnableGlobalInterruptFlag
TIM0init();
//初始化定时器0
while
(1)//主循环
if(irok)//接收到红外
{
Ircordpro();
//解码,时间值转换为二进制
irok=0;
if(irpro_ok)//解码成功
Ir_work();
//码值识别散转
}