红外遥控.docx
- 文档编号:1886674
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:13
- 大小:18.98KB
红外遥控.docx
《红外遥控.docx》由会员分享,可在线阅读,更多相关《红外遥控.docx(13页珍藏版)》请在冰点文库上搜索。
红外遥控
红外遥控及C语言51红外遥控解码程序设计实例
什么是红外线?
人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。
其中红光的波长范围为0.62~0.76μm;比红光波长还长的光叫红外线。
红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.
红外线遥控就是利用波长为0.76~1.5μm之间的近红外线来传送控制信号的。
红外发光二极管一般有黑色、深蓝、透明三种颜色。
红外遥控系统一般分发射和接收两个部分。
发射部分的主要元件为红外发光二极管。
目前大量使用的红外发光二极管发出的红外线波长为940mm左右,外形与普通φ5发光二极管相同。
接收部分的红外接收管是一种光敏二极管。
红外发光二极管一般有圆形和方形两种。
由于红外发光二极管的发射功率一般都较小(100mW左右),所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。
最近几年大多都采用成品红外接收头。
成品红外接收头的封装大致有两种:
一种采用铁皮屏蔽;一种是塑料封装。
均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。
红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。
成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。
但在使用时注意成品红外接收头的载波频率。
红外遥控常用的载波频率为38kHz,这是由发射端所使用455kHz晶振来决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。
也有一些遥控系统采用36 kHz、40 kHz、56 kHz等,由发射端晶振的振荡频率来决定。
红外遥控的特点是不影响周边环境的、不干扰其他电器设备。
室内近距离(小于10米)遥控中得到了广泛的应用。
红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.
引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的误别码,以免搞错.
遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码
1为EF10也是互为反码.
SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正
常范围,低电平在4000-5000之间都看作是正常范围.引导码后的32位编码(16位系统码和16位键码)不管高低电平,载波时间都是
560微秒,但低电平持续时间是1125微秒,高电平持续时间是2250微秒,所以低电平除去载波时间大约是560微秒,高电平除去载波时间
大约是1680微秒.低电平也有一个波动范围,在400-700之间都看作是正常的,具体多少可以通过示波器测量出来.高电平也有一个波
动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确.在捕捉到有高低
电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.
下面有两个经过实践能在实验板上显示键码的程序,一个是汇编写的,一个是用C写的,与大家一起探讨遥控器.
以下程序能在LCD上显示系统码和键码,按不同的按键,系统码不变,变的是键码.有不懂的地方可以在留言本上留言.
RSEQUP2.5 ;这几个是LCD引脚.
RWEQUP2.6
EEQUP2.7
IRREQUP3.3 ;红外接收的输出接P3.3.
BUFEQU30H;30H-33H保存解码结果
;=============================================
ORG0000H
AJMPMAIN
;=============================================
ORG0030H
MAIN:
MOVSP,#70H;堆栈指针设到70H的地方
ACALLINIT_LCD ;初始化LCD
MOVR7,#10
ACALLDELAY_MS
MOVDPTR,#MSG1
CALLDISPLAY_LINE1 ;在第一行显示Test8:
IRReader
MOVDPTR,#MSG2
CALLDISPLAY_LINE2 ;在第二行显示
MAIN_LOOP:
JBIRR,$;等待接收头信号为低
ACALLGET_LOW;测量引导脉冲低电平
CLRC
MOVA,R7
SUBBA,#(8000/50);SC6122的引导脉冲低电平为9000US,我们只要测到低电平的值在8000-10000US范围内就认为合格的.
JCMAIN_LOOP;如果小于8000US,不对,重新等待接收
CLRC
MOVA,R7
SUBBA,#(10000/50)
JNCMAIN_LOOP
ACALLGET_HIGH;测量引导脉冲高电平
CLRC
MOVA,R7
SUBBA,#(4000/50)
JCMAIN_LOOP ;如果小于4000US,不对,重新等待接收
CLRC
MOVA,R7
SUBBA,#(5000/50)
JNCMAIN_LOOP ;如果大于5000US,不对,重新等待接收
MOVR0,#BUF;
MOVR5,#8;SC6122发的码有32位,我们用4个字节来存放,每个字节有8位
IR_NEXT:
CALLGET_LOW
CLRC
MOVA,R7
SUBBA,#(300/50);300US
JCMAIN_LOOP ;低电平小于300微秒认为不对,重新接收
CLRC
MOVA,R7
SUBBA,#(800/50);800US
JNCMAIN_LOOP ;低电平大于800微秒认为不对,重新接收
ACALLGET_HIGH
CLRC
MOVA,R7
SUBBA,#(300/50);300US
JCMAIN_LOOP ;高电平小于300微秒认为不对,重新接收
CLRC
MOVA,R7
SUBBA,#(2000/50);2000US
JNCMAIN_LOOP ;高电平大于2000微秒认为不对,重新接收
CLRC
MOVA,R7
SUBBA,#(1120/50); ;跟中间值1120进行比较
RRCA
MOV@R0,A ;通过CY移到间接地址R0中去
DJNZR5,IR_NEXT ;8位移完了吗
MOVR5,#8
INCR0
MOVA,R0
XRLA,#(BUF+4)
JNZIR_NEXT;如果不到4个字节,接收下一个
MOVDPTR,#MSG_6122
ACALLDISPLAY_LINE1;显示格式名称
ACALLDISPLAY_IR_CODE;显示码
AJMPMAIN_LOOP
;============================================
MSG1:
DB"Test8:
IRReader"
MSG2:
DB""
MSG_6122:
DB"Format:
SC6122"
;============================================
;转为ASCII码在LCD在显示
TO_ASCII:
CJNEA,#0AH,TO_ASCII_1
TO_ASCII_1:
JCTO_ASCII_2;小于10
ADDA,#('A'-10)
RET
TO_ASCII_2:
ADDA,#'0'
RET
;============================================
DISPLAY_IR_CODE:
MOVA,#0C0H;显示在第二行
ACALLSEND_COMMAND_BYTE;设置DDRAM地址
MOVR0,#BUF
DISPLAY_IR_CODE_NEXT:
MOVA,@R0
SWAPA
ANLA,#0FH ;分离出高字节
ACALLTO_ASCII ;转为ASCII码
ACALLSEND_DATA_BYTE ;显示
MOVA,@R0
ANLA,#0FH ;分离出低字节
ACALLTO_ASCII ;转为ASCII码
ACALLSEND_DATA_BYTE ;显示
MOVA,#''
ACALLSEND_DATA_BYTE ;显示空格
INCR0
MOVA,R0
XRLA,#(BUF+4)
JNZDISPLAY_IR_CODE_NEXT
MOVR0,#8;第2行共有20个字符,前面显示用了12个,再用8个空格填满
DISPLAY_IR_CODE_B:
MOVA,#''
ACALLSEND_DATA_BYTE
DJNZR0,DISPLAY_IR_CODE_B
RET
;============================================
;测量低电平时间,50US采样一次,R7加1一次,比如低电平时间为9000US,测得R7的结果为180(0B4H)
;OUTPUT:
R7
GET_LOW:
MOVR7,#00H
GET_LOW_NEXT:
MOVR6,#20;在晶振为11.0592M时,延50US需要46个机器周期,
DJNZR6,$;这条指令执行需要2个机器周期
JBIRR,GET_LOW_RTN;接收头为高电平,结束测量
INCR7
MOVA,R7
JNZGET_LOW_NEXT;看R7是否有溢出
GET_LOW_RTN:
RET
;============================================
;测量高电平时间,50US采样一次,R7加1一次,比如高电平时间为4500US,测得R7的结果为90
;OUTPUT:
R7
GET_HIGH:
MOVR7,#00H
GET_HIGH_NEXT:
MOVR6,#20;在晶振为11.0592M时,延50US需要46个机器周期,
DJNZR6,$;这条指令执行需要2个机器周期
JNBIRR,GET_HIGH_RTN;接收头为低电平,结束测量
INCR7
MOVA,R7
JNZGET_HIGH_NEXT;看R7是否有溢出
GET_HIGH_RTN:
RET
;
DELAY_MS:
MOVR6,#250
DELAY_MS_NEXT:
NOP
NOP
DJNZR6,DELAY_MS_NEXT
DJNZR7,DELAY_MS
RET
;============================================
;INPUT:
R7
DELAY:
DJNZR7,$
RET
;============================================
;向LCD写一个命令字节
;INPUT:
ACC
SEND_COMMAND_BYTE:
CLRRS
CLRRW
MOVP0,A
SETBE
NOP
NOP
NOP
NOP
NOP
NOP
CLRE
MOVR7,#100
ACALLDELAY
RET
;===============================================
;向LCD写一个数据字节
;INPUT:
ACC
SEND_DATA_BYTE:
SETBRS
CLRRW
MOVP0,A
SETBE
NOP
NOP
NOP
NOP
NOP
NOP
CLRE
MOVR7,#100
ACALLDELAY
RET
;======================================================
;初始化LCD
INIT_LCD:
MOVA,#30H
ACALLSEND_COMMAND_BYTE
ACALLSEND_COMMAND_BYTE
ACALLSEND_COMMAND_BYTE
MOVA,#38H;设置工作方式
ACALLSEND_COMMAND_BYTE
MOVA,#0CH;显示状态设置
ACALLSEND_COMMAND_BYTE
MOVA,#01H;清屏
ACALLSEND_COMMAND_BYTE
MOVA,#06H;输入方式设置
ACALLSEND_COMMAND_BYTE
RET
;=======================================================
;在第一行显示
;INPUT:
DPTR指向要显示的内容
DISPLAY_LINE1:
MOVA,#080H
DISPLAY_LINE1_A:
ACALLSEND_COMMAND_BYTE;设置DDRAM地址
MOVR6,#20
DISPLAY_LINE1_NEXT:
CLRA
MOVCA,@A+DPTR
ACALLSEND_DATA_BYTE
INCDPTR
DJNZR6,DISPLAY_LINE1_NEXT
MOVR7,#100
ACALLDELAY
RET
;=======================================================
;在第二行显示
;INPUT:
DPTR指向要显示的内容
DISPLAY_LINE2:
MOVA,#0C0H
AJMPDISPLAY_LINE1_A
;=======================================================
END
下面是一个用C写的遥控器程序.能在数码管上显示键码.
#include
#definec(x)(x*110592/120000)
sbitIr_Pin=P3^3;
unsignedcharcodeLed_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
unsignedcharcodeLed_Sel[]={0xe,0xd,0xb,0x7};
unsignedcharLed_Buf[4];//显示缓冲区
charLed_Index; //位选
unsignedcharIr_Buf[4];//用于保存解码结果
//==============================================================
//数码管扫描
timer0()interrupt1using1
{
TL0=65536-1000;
TH0=(65536-1000)/256;//定时器0设定约1000us中断一次,用于数码管扫描
P0=0xff;
P2=Led_Sel[Led_Index]; //位选
P0=Led_Tab[Led_Buf[Led_Index]]; //段选
if(++Led_Index>3)Led_Index=0; //四个扫描完了,到第一个数码管
}
//==============================================================
unsignedintIr_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!
Ir_Pin&&(TH1&0x80)==0);
TR1=0;
returnTH1*256+TL1;
}
//=============================================================
unsignedintIr_Get_High()
{
TL1=0;
TH1=0;
TR1=1;
while(Ir_Pin&&(TH1&0x80)==0);
TR1=0;
returnTH1*256+TL1;
}
//==============================================================
main()
{
unsignedinttemp;
chari,j;
Led_Index=1;
TMOD=0x11;
TL0=65536-1000;
TH0=(65536-1000)/256;//定时器0设定约1000us中断一次,用于数码管扫描
EA=1;
ET0=1;
TR0=1;
Led_Buf[0]=0;
Led_Buf[1]=0;
Led_Buf[2]=0;
Led_Buf[3]=0;//显示区设成0
do{
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp
temp=Ir_Get_High();
if(temp
for(i=0;i<4;i++)//4个字节
for(j=0;j<8;j++)//每个字节8位
{
temp=Ir_Get_Low();
if(temp
temp=Ir_Get_High();
if(temp
Ir_Buf[i]>>=1;
if(temp>c(1120))Ir_Buf[i]|=0x80;
}
Led_Buf[0]=Ir_Buf[2]&0xf;
Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
Led_Buf[2]=Ir_Buf[3]&0xf;
Led_Buf[3]=(Ir_Buf[3]/16)&0xf;//显示结果
}while
(1);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红外 遥控