微波光电子课程设计.docx
《微波光电子课程设计.docx》由会员分享,可在线阅读,更多相关《微波光电子课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
![微波光电子课程设计.docx](https://file1.bdocx.com/fileroot1/2022-11/28/fe2b2dff-76bb-4d56-9780-e7e485a6b9e6/fe2b2dff-76bb-4d56-9780-e7e485a6b9e61.gif)
微波光电子课程设计
2014年微波光电子课程设计
设计报告
项目名称基于51单片机的红外编码解码实验
参与者李思彧徐楠李梦婷袁高峰王阳
所在学院电子科学与应用物理学院
专业年级电子科学与技术11-1班
指导教师毛剑波
报告人李思彧
时间2014.7
一、设计题目,主要指标和要求
1.利用Proteus设计仿真电路,要求可以实现红外编码以及红外解码。
在编码端通过16个按钮开关实现选码,用单片机实现编码。
在解码端要求利用数码管将编码电路中按键所对应的数值显示出来。
2.编写程序,利用学林单片机实验箱实现对ht6221遥控器的红外解码,要求利用数码管显示ht6221各键所对应的键值编码。
二、方案设计以及基本原理
1.红外遥控系统
红外遥控系统主要由红外遥控发射装置、红外接收设备、遥控微处理机等组成。
红外遥控发射装置,其主要组件为红外发光二极体。
单只红外发光二极管的发射功率约100mW。
接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正常工作而获得高的灵敏度。
红外遥控器的常见协议分析
常用的红外线信号传输协议有ITT协议、NEC协议、NokiaNRC协议、Sharp协议、PhilipsRC-5协议、PhilipsRC-6协议,PhilipsRECS-80协议,以及SonySIRC协议等。
协议组成:
一般由引导码,用户码,资料码,重复码或资料码的反码和结束码构成。
载波:
常用的有33K,36K,36.6K,38K,40K,56K,无载波、占空比:
常用的有1/3,1/2,不常用1/4、调制方式:
脉宽调制,相位调制,脉冲位置调制
2.红外编码和解码原理
红外遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC协议为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms间隔0.56ms周期1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”其波形如下图所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
编码数据如下图所示
遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,发射波形图如下图所示
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
需要注意的是:
当一体化接收头接收到38kHz红外信号时,输出端输出低电平,否则为高电平。
所以一体化接收头输了的波形是与发射波形是反向的,接收头接收到的波形如图所示:
3.方案设计
根据题目要求我们需要利用Proteus完成电路的仿真,所以在设计方案时我们不仅要设计红外的接收模块,同时,也要完成红外发射编码的模块设计为了完成任务要求我们将方案设计如下:
在红外编码发射模块中,我们用开关键盘实现红外编码发射过程的控制,并通过键盘选择需要发射的数据,之后经过单片机编码将数据传输给红外发射管进行发射。
在红外解码接收模块中,红外接收管接收到红外信号,将信号传输给单片机,利用单片机进行解码,解码的结果通过数码管显示出来。
设计方案如图:
三、电路设计
1.单元电路设计
键盘电路:
我们使用16个按钮开关作为键盘按键,按钮排列成四行四列,4根行选择线通过总线接单片机P1口的低四位,4根列选择线通过总线接单片机P1口的高四位。
每个开关按钮一端接行线,另一端接列线。
当开关被按下,低四位中的一位与高四位中的一位引脚相连,利用P1口的高低电平变化来获取按键位置,从而获取按键信息。
电路设计如图:
单片机编码电路:
红外发射电路:
在红外发射电路中我们加入了PNP管来完成电平信号的放大,同时也使得电平反转。
红外接收电路:
在Proteus中我们使用irlink来模拟红外发射管与红外接收管。
红外解码电路:
数码管显示电路:
在数码管显示电路中我们加入了74LS240来实现增强电平驱动的作用。
2.完整电路设计:
3.元件清单:
3Resistors
Quantity:
References
Value
OrderCode
1
R1
2
H1K
1
R2
10k
M10K
1
R3
1k
H1K
3IntegratedCircuits
Quantity:
References
Value
OrderCode
2
U1,U2
80C52
1
U3
74LS240
1Transistors
Quantity:
References
Value
OrderCode
1
Q1
PNP
1Miscellaneous
Quantity:
References
Value
OrderCode
1
IRL1
IRLINK
四、程序设计
1.单片机实验板红外接收程序设计:
数码管显示,P0口为数码管的数据口,p2为数码管的控制位
控器接p3.2,喇叭接p3.7,每次按键喇叭提示
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voidIR_show();
voiddelay(unsignedcharx);
sbitIRIN=P3^2;
sbitGEWEI=P2^7;
sbitSHIWEI=P2^6;
ucharIRCOM[8];
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0X88,0X83,0XC6,0XA1,0X86,0X8E};
ucharx,y;
voidmain(void)
{x=0;
y=0;
IT0=1;
EX0=1;
EA=1;
while
(1)
{IR_show();}
}
voidIR_IN()interrupt0
{
uintN;
uchari;
EX0=0;
N=0;
while(!
IRIN)N++;
if(N<1000){EX0=1;return;}
N=0;
while(IRIN)if(N++>400){EX0=1;return;}
if(N<200){EX0=1;return;}
for(i=0;i<32;i++)
{
N=0;
while(!
IRIN);
while(IRIN)if(N++>200){EX0=1;return;}
IRCOM[i/8]>>=1;
if(N>60)IRCOM[i/8]|=0x80;
}
if(IRCOM[2]==~IRCOM[3]&&IRCOM[0]==~IRCOM[1])
{x=IRCOM[2]/16;
y=IRCOM[2]%16;
}
EX0=1;
}
voidIR_show()
{
SHIWEI=1;
P0=table[y];
GEWEI=0;
delay
(1);
GEWEI=1;
P0=table[x];
SHIWEI=0;
delay
(1);
}
voiddelay(ucharx)
{
uchari,j;
for(i=0;ifor(j=0;j<24;j++)_nop_();
}
2.Proteus仿真红外解码程序:
使用外部中断0接收P3.2
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
voidIR_show();
voiddelay(unsignedcharx);
sbitIRIN=P3^2;
sbitGEWEI=P2^7;
sbitSHIWEI=P2^6;
ucharIRCOM[8];
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
ucharx,y;
voidmain(void)
{x=0;
y=0;
IT0=1;
EX0=1;
EA=1;
while
(1){IR_show();}
}
voidIR_IN()interrupt0
{
uintN;
uchari;
EX0=0;
N=0;
while(!
IRIN)N++;
if(N<1000){EX0=1;return;}
N=0;
while(IRIN)if(N++>400){EX0=1;return;}
if(N<200){EX0=1;return;}
for(i=0;i<32;i++)
{
N=0;
while(!
IRIN);
while(IRIN)if(N++>200){EX0=1;return;}
IRCOM[i/8]>>=1;
if(N>60)IRCOM[i/8]|=0x80;
}
if(IRCOM[2]==~IRCOM[3]&&IRCOM[0]==~IRCOM[1])
{x=IRCOM[2]/16;
y=IRCOM[2]%16;
}
EX0=1;
}
voidIR_show()
{
SHIWEI=1;
P0=table[y];
GEWEI=0;
delay
(1);
GEWEI=1;
P0=table[x];
SHIWEI=0;
delay
(1);
}
voiddelay(ucharx)
{
uchari,j;
for(i=0;ifor(j=0;j<24;j++)_nop_();
}
3.Proteus仿真红外编码程序:
发射引脚(接PNP三极管b极)
PNP三极管e极接2Ω电阻,c极接红外发射管
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineSBM0x80
#definem9(65536-9000)
#definem4_5(65536-4500)
#definem1_6(65536-1630)
#definem_65(65536-580)
#definem_56(65536-560)
#definem40(65536-40000)
#definem56(65536-56000)
#definem2_25(65536-2250)
sbitIR=P3^6;
sbitLED=P3^7;
ucharKEY(void);
voidSanZhuan(void);
voidZZ(ucharx);
voidZ0(uchartemp);
voidTT0(bitBT,uintx);
voidYS(uchartime);
voidmain(void)
{TMOD=0x01;
IR=1;
while
(1)
{
SanZhuan();
}
}
ucharKEY(void)
{
ucharH,L;
H=0;
L=0;
P1=0xf0;
if(P1!
=0xf0)
{
YS(10);
if(P1!
=0xf0)
{
H=P1&0xf0;
P1=0x0f;
L=P1&0x0f;
}
return(H+L);
}
return0;
}
voidSanZhuan(void)
{
ucharv;
v=KEY();
switch(v)
{
case0x77:
ZZ(0x01);v=0;break;//""
case0xb7:
ZZ(0x02);v=0;break;//""
case0xd7:
ZZ(0x03);v=0;break;//""
case0xe7:
ZZ(0x04);v=0;break;//""
case0x7b:
ZZ(0x05);v=0;break;//""
case0xbb:
ZZ(0x06);v=0;break;//""
case0xdb:
ZZ(0x07);v=0;break;//""
case0xeb:
ZZ(0x08);v=0;break;//""
case0x7d:
ZZ(0x09);v=0;break;//""
case0xbd:
ZZ(0x10);v=0;break;//""
case0xdd:
ZZ(0x11);v=0;break;//""
case0xed:
ZZ(0x12);v=0;break;//""
case0x7e:
ZZ(0x13);v=0;break;//""
case0xbe:
ZZ(0x14);v=0;break;//""
case0xde:
ZZ(0x15);v=0;break;//""
case0xee:
ZZ(0x16);v=0;break;//""
default:
v=0;
}
}
voidZZ(ucharx)
{
TT0(1,m9);
TT0(0,m4_5);
Z0(SBM);
Z0(~SBM);
Z0(x);
Z0(~x);
TT0(1,m_65);
TT0(0,m40);
while(KEY())
{TT0(1,m9);
TT0(0,m2_25);
TT0(1,m_56);
TT0(0,m40);
TT0(0,m56);
};
}
voidZ0(uchartemp)
{
ucharv;
for(v=0;v<8;v++)
{
TT0(1,m_65);
if(temp&0x01)TT0(0,m1_6);
else
TT0(0,m_56);
temp>>=1;}}
voidTT0(bitBT,uintx)
{
TH0=x>>8;
TL0=x;
TF0=0;
TR0=1;
if(BT==0)while(!
TF0);
elsewhile
(1)
{IR=0;
if(TF0)break;
if(TF0)break;
IR=1;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
if(TF0)break;
}
TR0=0;
TF0=0;
IR=1;}
voidYS(uchartime)
{
uchari,j;
for(i=0;i