红外接收器有很多型号,比如HS0038 VS838,功能大致相同,只是引脚封装不同。红外接收有几种统一的编码方法。采样的编码方式取决于遥控器使用的芯片,接收器接
红外接收器有很多型号,比如HS0038 VS838,功能大致相同,只是引脚封装不同。
红外接收有几种统一的编码方法。采样的编码方式取决于遥控器使用的芯片,接收器接收的信号也是一样的。
电视遥控器使用专用集成发射芯片传输遥控代码,如东芝TC9012、飞利浦AA3010T等。通常,彩电遥控信号的发射是将某个按键对应的控制命令和系统码(0和1的序列)调制在38KHz载波上,然后放大驱动红外发射管发射信号。不同公司的遥控芯片,采样遥控码的格式不同。常见的有两种,一种是NEC标准,一种是飞利浦标准。
NEC标准:遥控载波频率38KHz(占空到1:3)。当按下一个键时,系统将首先传输一个完整的完整代码。如果超过108毫秒未松开按键,下一个发送的代码(突发代码)将由一个起始代码(9毫秒)和一个结束代码(2.5毫秒)组成。
一个完整的完整代码=引导代码+用户代码+用户代码+数据代码+数据代码+数据反代码。
开机代码高电平为9ms,低电平为4.5ms;系统码8位,数据码8位,共32位;前16位是用户识别码,可以区分不同的红外遥控设备,防止不同的遥控码相互干扰。后16位为8位操作码和8位运算逆码,用于校验数据接收是否准确。接收器根据数据代码判断应该执行上述动作。
突发码是连续按下按键时发送的代码。它通知接收者。一个键被连续按下。
NEC标准下的传输代码表示
以“0.56ms高电平+0.565ms低电平= 1.125ms”传输数据0;
1数据用“高电平0.56ms+1.69ms = 2.25ms”表示。
从遥控器发送信号:
需要注意的是:当一体化接收头收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以一体化接收头输出的波形和发射波形是反向的需要注意的是,当集成接收头接收到38kHz红外信号时,输出端输出低电平,否则为高电平。因此,集成接收头输出的波形和发射波形是相反的。
飞利浦标准:载频38KHz:没有鼓。按下该键时,控制代码1和0将会切换。如果连续按下该键,控制代码将保持不变。
全代码=起始代码’ 11 ‘+控制代码+用户代码+用户代码
0用“低电平1.778ms+高电平1.778 ms”表示;
1数据用“高电平1.778ms+低电平1.778 ms”表示。
连续代码重复延迟为114 ms。
所谓解码就是一个区分脉冲宽度的过程。红色信号的0和1由脉冲的持续时间来区分,
我的遥控器用的是NEC标准的WD6122芯片,遥控器代码如下:
下面是我用1602显示红外接收器接收到的代码的程序:①这是1602运算的功能。
– */
#包含“1602.h”
#包含“delay.h”
#定义检查忙
sbit RS = p2^4;//定义端口
sbit rw = p2^5;
sbit en = p2^6;
#定义RS_CLR RS=0
#定义RS_SET RS=1
#定义RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#定义数据端口P0
/* –
忙判断功能
– */
位LCD_Check_Busy(void)
{
#ifdef检查忙
数据端口= 0xFF
RS _ CLR
RW _ SET
EN _ CLR
_ nop _
EN _ SET
返回(位)(数据端口& amp0x 80);
#否则
返回0;
#endif
}
/* –
写命令功能
– */
void LCD_Write_Com(无符号字符Com)
{
//while(LCD _ Check _ Busy);//忙的时候等一下
戴莱姆斯(5);
RS _ CLR
RW _ CLR
EN _ SET
DataPort = com
_ nop _
EN _ CLR
写数据功能
– */
void LCD_Write_Data(无符号字符数据)
{
//while(LCD _ Check _ Busy);//忙的时候等一下
戴莱姆斯(5);
RS _ SET
DataPort=数据;
_ nop _
屏幕清除功能
– */
void LCD_Clear(void)
{
LCD _ Write _ Com(0x 01);
写字符串函数
– */
void LCD_Write_String(无符号字符x,无符号字符y,无符号字符*s)
{
如果(y == 0)
{
LCD _ Write _ Com(0x 80+x);//指示第一行。
}
其他
{
LCD _ Write _ Com(0xc 0+x);//表示第二行。
}
while (*s)
{
LCD _ Write _ Data(* s);
s++;
写字符功能
– */
/* void LCD_Write_Char(无符号字符x、无符号字符y、无符号字符数据)
LCD _ Write _ Com(0x 80+x);
LCD _ Write _ Com(0xc 0+x);
}
LCD_Write_Data(数据);
}*/
/* –
初始化功能
– */
void LCD_Init(void)
{
LCD _ Write _ Com(0x 38);/*显示模式设置*/
戴莱姆斯(5);
LCD _ Write _ Com(0x 38);
LCD _ Write _ Com(0x 08);/*炫耀*/
LCD _ Write _ Com(0x 01);/*显示清晰屏幕*/
LCD _ Write _ Com(0x 06);/*显示光标移动设置*/
戴莱姆斯(5);
LCD _ Write _ Com(0x0C);/*显示开启和光标设置*/
}
②延时功能
用户延迟函数,输入参数为无符号字符t,无返回值
无符号字符是定义无符号字符变量,其取值范围是
这里用的是0~255晶振12M。请使用组件获得精确延迟和近似延迟。
以下长度T=tx2+5 uS
– */
void DelayUs2x(无符号字符t)
{
while(-t);
MS延迟函数,输入参数为无符号字符t,无返回值
无符号字符是定义无符号字符变量,其取值范围是
这里用的是0~255晶振12M。请使用组件以获得准确的延迟。
– */
void延迟符号(无符号字符t)
{
while(t -)
{
//大致延迟1mS
delayus 2x(245);
③以下是主要功能
# include & ltreg52.h & gt//包含头文件,一般不需要更改。头文件包含特殊功能寄存器的定义。
#包含“1602.h”
#包含“delay.h”
sbit ir=p3^2;//红外数据关联标志
char code Tab[16]= ” 0123456789 abcdef “;
/* –
全局变量声明
– */
无符号字符irtime//红外的全局变量
位irpro_ok,irok
无符号字符IRcord[4];
无符号字符IR data[33];
无符号字符TempData[16];
/* –
函数声明
– */
void Ir _ work(void);
void Ircordpro(void);
/* –
0定时器中断处理
– */
void tim0_isr (void)使用1中断1
{
irtime++;//用于计算两个下降沿之间的时间
外部中断0中断处理
– */
Voiex0 _ ISR (void)中断0//外部中断0服务函数
{
静态无符号字符I;//接收红外信号处理
静态位起始标志;//要开始处理标志位吗?
if(开始标志)
{
if(IR time & lt;63 & amp& ampirtime & gt=33)//启动代码TC9012的头,9ms+4.5ms
I = 0;
IR data[I]= IR time;//存储每一级的持续时间,以确定后面是0还是1。
IR time = 0;
i++;
如果(i==33)
{
irok = 1;
其他
start flag = 1;
0定时器初始化
– */
voit im 0 init(void)//定时器0初始化
{
TMOD = 0x 02;//定时器0工作在模式2,TH0为重载值,TL0为初始值。
TH0 = 0x00//重载值
TL0 = 0x00//初始化值
ET0 = 1;//打开中断
TR0 = 1;
外部中断0初始化
– */
void EX0init(void)
{
IT0 = 1;//指定外部中断0的下降沿触发,INT0 (P3.2)
EX0 = 1;//启用外部中断
EA = 1;//打开总中断
键值处理
– */
void Ir_work(void)
{
TempData[0]= Tab[IRcord[0]/16];//处理客户代码
TempData[1]= Tab[IRcord[0]% 16];
TempData[2]= ‘-‘;
TempData[3]= Tab[IRcord[1]/16];//处理客户代码
TempData[4]= Tab[IRcord[1]% 16];
TempData[5]= ‘-‘;
TempData[6]= Tab[IRcord[2]/16];//流程数据代码
TempData[7]= Tab[IRcord[2]% 16];
TempData[8]= ‘-‘;
TempData[9]= Tab[IRcord[3]/16];//处理数据逆代码
TempData[10]= Tab[IRcord[3]% 16];
LCD_Write_String(5,1,TempData);
IR pro _ ok = 0;//处理完成标志
红外代码值处理
– */
Void Ircordpro(void)//红外代码值处理函数
{
无符号字符I,j,k;
无符号充电线,值;
k = 1;
for(I = 0;我& lt4;++)//处理4个字节
{
for(j = 1;j & lt=8;++)//用8位处理1个字节
{
cord = IR data[k];
if(cord & gt;7)//大于某个值为1,这绝对与晶振有关。这里用12M来计算,这个值会有一些误差。
value | = 0x80
if(j & lt;8)
{
值& gt& gt=1;
}
k++;
}
IRcord[I]= value;
值= 0;
}
IR pro _ ok = 1;//已处理的标志位置1
主要功能
– */
无效总管(无效)
{
EX0init//初始化外部中断
TIM0init//初始化计时器
LCD _ Init//初始化液晶
戴莱姆斯(20);//延迟帮助稳定
LCD _ Clear//清除屏幕
LCD_Write_String(0,0,” www . do flye . net “);
LCD_Write_String(0,1,” Code:”);
While(1)//主循环
{
If(irok) //如果收到,执行红外处理。
{
Ircordpro
irok = 0;
}
If(irpro_ok) //如果被处理,对其进行处理,比如按下相应的键,显示相应的数字。
{
Ir _ work
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/188543.html