writeas遥控器()

红外接收器有很多型号,比如HS0038 VS838,功能大致相同,只是引脚封装不同。红外接收有几种统一的编码方法。采样的编码方式取决于遥控器使用的芯片,接收器接

红外接收器有很多型号,比如HS0038 VS838,功能大致相同,只是引脚封装不同。

红外接收有几种统一的编码方法。采样的编码方式取决于遥控器使用的芯片,接收器接收的信号也是一样的。

电视遥控器使用专用集成发射芯片传输遥控代码,如东芝TC9012、飞利浦AA3010T等。通常,彩电遥控信号的发射是将某个按键对应的控制命令和系统码(0和1的序列)调制在38KHz载波上,然后放大驱动红外发射管发射信号。不同公司的遥控芯片,采样遥控码的格式不同。常见的有两种,一种是NEC标准,一种是飞利浦标准。

NEC标准:遥控载波频率38KHz(占空到1:3)。当按下一个键时,系统将首先传输一个完整的完整代码。如果超过108毫秒未松开按键,下一个发送的代码(突发代码)将由一个起始代码(9毫秒)和一个结束代码(2.5毫秒)组成。

一个完整的完整代码=引导代码+用户代码+用户代码+数据代码+数据代码+数据反代码。

writeas遥控器()插图开机代码高电平为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”表示。

从遥控器发送信号:

writeas遥控器()插图(1)writeas遥控器()插图(2)

需要注意的是:当一体化接收头收到38kHz红外信号时,输出端输出低电平,否则为高电平。所以一体化接收头输出的波形和发射波形是反向的需要注意的是,当集成接收头接收到38kHz红外信号时,输出端输出低电平,否则为高电平。因此,集成接收头输出的波形和发射波形是相反的。

飞利浦标准:载频38KHz:没有鼓。按下该键时,控制代码1和0将会切换。如果连续按下该键,控制代码将保持不变。

全代码=起始代码’ 11 ‘+控制代码+用户代码+用户代码

0用“低电平1.778ms+高电平1.778 ms”表示;

1数据用“高电平1.778ms+低电平1.778 ms”表示。

连续代码重复延迟为114 ms。

所谓解码就是一个区分脉冲宽度的过程。红色信号的0和1由脉冲的持续时间来区分,

我的遥控器用的是NEC标准的WD6122芯片,遥控器代码如下:

writeas遥控器()插图(3)下面是我用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

writeas遥控器()插图(4)writeas遥控器()插图(5)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/188543.html

发表回复

登录后才能评论