您的位置 首页 开关

一文教会你红外线遥控器软件解码程序

一文教会你红外线遥控器软件解码程序-红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。

红外线一开端发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码是体系码,体系反码,按键码,按键反码,假如按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。

#include“at89x52.h”

#defineNULL0x00//数据无效

#defineRESET0X01//程序复位

#defineREQUEST0X02//恳求信号

#defineACK0x03//应对信号,在接纳数据后发送ACK信号标明数据接纳正确,

也位恳求信号的应对信号

#defineNACK0x04//应对信号,标明接纳数据过错

#defineBUSY0x05//忙信号,标明正在忙

#defineFREE0x06//闲暇信号,标明处于闲暇状况

#defineREAD_IR0x0b//读取红外

#defineSTORE_IR0x0c//保存数据

#defineREAD_KEY0x0d//读取键值

#defineRECEIVE0Xf400//接纳缓冲开端地址

#defineSEND0xfa00//发送缓冲开端地址

#defineIR0x50//红外接纳缓冲开端地址

#defineHEAD0xaa//数据帧头

#defineTAIL0x55//数据帧尾

#defineSDAP1_7

#defineSCLP1_6

unsigned char xdata *buf1;//承受数据缓冲

unsigned intbuf1_length;//接纳到的数据实践长度

unsigned char xdata *buf2;//发送数据缓冲

unsigned intbuf2_length;//要发送的数据实践长度

bit buf1_flag;//接纳标志,1标明承受到一个数据帧,0标明没有承受到数据帧或数据

帧为空

bit buf2_flag;//发送标志,1标明需求发送或没发送结束,0标明没有要发送的数据或

发送结束

unsigned char state1,state2;//用来标志接纳字符的状况,state1用来标明接

收状况,state2用来标明发送状况

unsigned char data *ir;

union{

unsigned char a[2];

unsigned int b;

unsigned char data *p1[2];

unsigned int data *p2[2];

unsigned char xdata *p3;//红外缓冲的指针

unsigned int xdata *p4;

}p;

//union{//

//unsigned char a[2];//

//unsigned int b;

//unsigned char data *p1[2];

//unsigned int data *p2[2];

//unsigned char xdata *p3;

//unsigned int xdata *p4;//地址指针

//}q;//

union{

unsigned char a[2];

unsigned int b;

}count;

union{

unsigned char a[2];

unsigned int b;

}temp;

union{

unsigned char a[4];

unsigned int b[2];

unsigned long c;

}ir_code;

union{

unsigned char a[4];

unsigned int b[2];

unsigned long c;

unsigned char data *p1[4];

unsigned int data *p2[4];

unsigned char xdata *p3[2];

unsigned int xdata *p4[2];

}I;

unsigned char ir_key;

bit ir_flag;//红外接纳标志,0为缓冲区空,1为接纳成功,2为缓冲溢出

void sub(void);

void delay(void);

void ie_0(void);

void tf_0(void);

void ie_1(void);

void tf_1(void);

void tf_2(void);

void read_ir(void);

void ir_jiema(void);

void ir_init(void);

void ir_exit(void);

void store_ir(void);

void read_key(void);

void reset_iIC(void);

unsigned char read_byte_ack_iic(void);

unsigned char read_byte_nack_iic(void);

bit write_byte_iic(unsigned char a);

void send_ack_iic(void);

void send_nack_iic(void);

bit receive_ack_iic(void);

void start_iic(void);

void stop_iic(void);

void write_key_data(unsigned char a);

unsigned int read_key_data(unsigned char a);

void ie0(void)interrupt 0{ie_0();}

void tf0(void)interrupt 1{tf_0();}

void ie1(void)interrupt 2{ie_1();}

void tf1(void)interrupt 3{tf_1();tf_2();}

void tf2(void)interrupt 5{//选用中止方法跟查询方法相结合的方法解码

EA=0;//制止中止

if(TF2){//判别是否是溢出仍是电平改变发生的中止

TF2=0;//假如是溢出发生的中止则铲除溢出位,从头敞开中止退出

EA=1;

goto end;

}

EXF2=0;//铲除电平改变发生的中止位

*ir=RCAP2H;//把捕捉的数保存起来

ir++;

*ir=RCAP2L;

*ir++;

F0=1;

TR0=1;//敞开计数器0

loop:

TL0=0;//将计数器0从头置为零

TH0=0;

while(!EXF2){//查询等候EXF2变为1

if(TF0)goto exit;//查看有没超时,假如超时则退出

};

EXF2=0;//将EXF2清零

if(!TH0)//判别是否是长低电平脉冲过来了

{//不是长低电平脉冲而是短低电平

if(F0)count.b++;//短脉冲数加一

temp.a[0]=RCAP2H;//将捕捉数暂时寄存起来

temp.a[1]=RCAP2L;

goto loop;//回来持续查询

}

else{//是低电平脉冲,则进行处理

F0=0;

*ir=temp.a[0];//把接连的短脉冲总时刻记录下来

ir++;

*ir=temp.a[1];

ir++;

*ir=RCAP2H;//把长电平脉冲时刻记录下来

ir++;

*ir=RCAP2L;

ir++;

if(ir》=0xda) {

goto exit;//判别是否溢出缓冲,假如溢出则失利退出

}

goto loop;//回来持续查询

}

exit:

ir_flag=1;//置ir_flag为1标明接纳成功

end:

;

}

void rs232(void)interrupt4{

staTIc unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2;//sbuf1,sbuf2用来接纳

发送暂时用,rsbuf1,rsbuf2用来别离用来寄存接纳发送的半字节

EA=0;//制止中止

if(RI){

RI=0;//铲除接纳中止标志位

sbuf1=SBUF;//将接纳缓冲的字符复制到sbuf1

if(sbuf1==HEAD){//判别是否帧最初

state1=10;//是则把state赋值为10

buf1=RECEIVE;//初始化接纳地址

}

else{

switch(state1){

case 10:sbuf2=sbuf1》》4;//把高半字节右移到的半字节

sbuf2=~sbuf2;//把低半字节取反

if((sbuf2&0x0f)!=(sbuf1&0x0f))//判别接纳是否正确

{//接纳过错,有或许接纳的是数据帧尾,也有或许是接纳过错

if(sbuf1==TAIL)//判别是否接纳到数据帧尾

{//是接纳到数据帧尾

buf1=RECEIVE;//初始化接纳的地址

if(*buf1==RESET)//判别是否为复位指令

{

ES=0;

sbuf2=SP+1;

for(p.p1[0]=SP-0x10;p.p1[0]《=sbuf2;p.p1

[0]++)*p.p1[0]=0;

}

state1=0;//将接纳状况标志置为零,接纳下一个数据帧

buf1_flag=1;//置接纳标志为1,标明现已接纳到一个数据帧

REN=0;//制止接纳

}

else

{//不是承受到数据帧尾,标明接纳过错

state1=0;// 将接纳状况标志置为零,从头接纳

buf1=RECEIVE;//初始化发送的地址

*buf1=NACK;//把NACK信号存入接纳缓冲里

buf1_flag=1;//置标志位为1,使主程序能对接纳过错进行处理

REN=0;//制止接纳

}

}

else

{//接纳正确

rsbuf1=~sbuf1;//按位取反,使高半字节变原码

rsbuf1&=0xf0;//仅保存高半字节,低半字节去掉

state1=20;//将状况标志置为20,预备接纳低半字节

}

break;

case 20:sbuf2=sbuf1》》4;//把高半字节右移到的半字节

sbuf2=~sbuf2;//将低半字节取反

if((sbuf2&0x0f)!=(sbuf1&0x0f))//判别接纳是否正确

{//承受过错

state1=0;// 将接纳状况标志置为零,从头接纳

buf1=RECEIVE;//初始化接纳的地址

*buf1=NACK;//把NACK信号存入发送缓冲里

buf1_flag=1;//置标志位为1,使主程序能对接纳过错进行处理

REN=0;//制止接纳

}

else

{

sbuf1&=0x0f;//仅保存低半字节,去掉高半字节

rsbuf1“=sbuf1;//凹凸半字节兼并

*buf1++=rsbuf1;//将接纳的数据保存至接纳缓冲里,而且数据指针加一

buf1_length++;//接纳数据长度加一

state1=10;//将state1置为10,预备接纳下个字节的高半字节

}

break;

}

}

}

else{

TI=0;//铲除发送中止标志

if(buf2_length)//判别发送长度是否为零

{//发送长度不为零

if(state2==0)//判别是否发送高半字节

{//发送高半字节

sbuf2=*buf2;//即将发送的字节送到sbuf2

rsbuf2=~sbuf2;//取反,使高半字节变为反码

sbuf2》》=4;//将高半字节右移到低半字节

rsbuf2&=0xf0;//保存高半字节,去掉低半字节

sbuf2&=0x0f;//保存低半字节,去掉高半字节

rsbuf2|=sbuf2;//兼并凹凸半字节

SBUF=rsbuf2;//发送出去

state2=10;//将state2置为10预备发送下半字节

}

else

{//发送低半字节

sbuf2=*buf2;//即将发送的字节送到sbuf2

buf2++;//指针加一

buf2_length–;//发送数据长度减一

rsbuf2=~sbuf2;//取反,使低半字节变为反码

rsbuf2《《=4;//将低半字节反码左移到高半字节

rsbuf2&=0xf0;//保存高半字节,去掉低半字节

sbuf2&=0x0f;//保存低半字节,去掉高半字节

rsbuf2|=sbuf2;//兼并凹凸半字节

SBUF=rsbuf2;//发送出

state2=0;

}

}

else

{//假如发送数据长度为零则发送数据帧尾

if(buf2_flag){//判别是否发过数据帧尾

SBUF=TAIL;//将数据帧尾发送出去

while(TI==0);

TI=0;

buf2_flag=0;//置发送标志为零,标明发送结束

}

}

}

EA=1;//敞开中止

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/kaiguan/347781.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部