📄 红外线遥控器解码.txt
字号:
EA=0; //禁止中断
ES=0; //禁止串行中断
ET2=1; //允许T2中断
ir=IR; //初始化红外数据指针
TR0=0; //禁止计数
TH0=0; //将计数器置为0
TL0=0;
TF0=0; //清除溢出标志
count.b=1; //初始化为零
init:
TR2=0;
TL2=0x00;
TH2=0xdc; //给T2赋一个初值,当计数器溢出时正好为6毫秒
T2CON=0x0d; //EXEN2=1,TR2=1,C/T2=0,CP/RL2=1,工作于捕捉方式
while(!TF2); //查询计数器是否溢出
TF2=0; //清除溢出位
if(EXF2) //判断在此期间又没发生过电平变化
{ //如果发生过变化则重新计数
goto init; //等待下一次按键
}
else
{ //计数器溢出并且电平没有发生过变化,则开启中断开始解码
EA=1;
}
}
void ir_exit(void) //红外接收恢复程序,恢复到红外接收前的状态
{
TR2=0; //停止计数以便修改计数器2寄存器
TR0=0;
ET2=0; //禁止计数器2中断
TL2=0xfb; //重新设置波特率为115.2kbps
TH2=0xff;
RCAP2H=0xff;
RCAP2L=0xfb;
T2CON=0x34;
ES=1; //允许串行中断
EA=1; //开放全局中断
}
void ir_jiema(void){ //解码程序,放在ir_code中,高十六位表示接收频率
//如果解码失败则为,如果是重复码则为1
//低八位表示载波频率,以KHz为单位
//低十六位的高八位表示系统码,低八位为按键码
p.p2[0]=IR;
p.p2[1]=p.p2[0]+1;
i.b[0]=*p.p2[0];
i.b[1]=*p.p2[1];
for(;i.b[1]!=0;){
if(i.b[0]>i.b[1]){
i.b[0]=0xffff-i.b[0];
i.b[0]+=i.b[1];
i.b[0]++;
}
else{
i.b[0]=i.b[1]-i.b[0];
}
*p.p2[0]=i.b[0];
p.p2[0]++;
i.b[0]=*p.p2[0];
p.p2[1]++;
i.b[1]=*p.p2[1];
}
*p.p2[0]=0;
p.p2[0]=IR;
temp.b=*p.p2[0];
ir_code.c=count.b;
ir_code.b[0]=(ir_code.c*1536000)/temp.b;
for(;temp.b!=0;){
*p.p2[0]=temp.b/154;
p.p2[0]++;
temp.b=*p.p2[0];
}
ir_code.b[1]=0;
if(p.p2[0]==IR+132){
p.p2[0]=IR;
p.p2[0]+=3;
i.c=0;
temp.b=*p.p2[0];
for(;temp.b!=0;){
i.c<<=1;
if(temp.b>=11){
i.a[3]++;
}
p.p2[0]+=2;
temp.b=*p.p2[0];
}
if(i.a[0]==(~i.a[1])&&i.a[2]==(~i.a[3])){
ir_code.a[2]=i.a[0];
ir_code.a[3]=i.a[2];
}
else ir_code.b[0]=0;
}
else{
if(p.p2[0]==IR+4){
p.p2[0]=IR;
p.p2[0]++;
temp.b=*p.p2[0];
if(temp.b<=30){
ir_code.b[0]=1;
}
else ir_code.b[0]=0;
}
else ir_code.b[0]=2;
}
//if(ir_flag==2)ir_code.b[0]=3;
}
void read_ir(void){
buf1_flag=0;
REN=1;
buf2_length=4;
while(buf2_flag);
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
*buf2++=ir_code.a[0];
*buf2++=ir_code.a[1];
*buf2++=ir_code.a[2];
*buf2=ir_code.a[3];
buf2=SEND;
buf2_flag=1;
SBUF=HEAD;
}
void delay(void){}
void start_iic(void){
SCL=0;
SDA=1;
delay();
delay();
SCL=1;
delay();
SDA=0;
delay();
SCL=0;
delay();
}
void stop_iic(void){
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
SCL=0;
delay();
delay();
SCL=1;
delay();
}
void send_ack_iic(void){
SDA=0;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
void send_nack_iic(void){
SDA=1;
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
}
bit receive_ack_iic(void){
bit a;
SDA=1;
delay();
SCL=1;
delay();
if(SDA) a=1;
else a=0;
delay();
SCL=0;
delay();
return a;
}
unsigned char read_byte_ack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_ack_iic();
return a;
}
unsigned char read_byte_nack_iic(void){
unsigned char a;
SDA=1;
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
a<<=1;
delay();
SCL=1;
delay();
if(SDA) a++;
delay();
SCL=0;
delay();
}
send_nack_iic();
return a;
}
void reset_iic(void){
SDA=1;
for(p.a[0]=0;p.a[0]<10;p.a[0]++){
SCL=0;
delay();
delay();
SCL=1;
delay();
delay();
}
}
bit write_byte_iic(unsigned char a){
for(p.a[0]=0;p.a[0]<8;p.a[0]++){
if(a&0x80){
SDA=1;
}
else{
SDA=0;
}
delay();
SCL=1;
delay();
delay();
SCL=0;
delay();
a<<=1;
}
return receive_ack_iic();
}
unsigned int read_key_data(unsigned char a){
union{
unsigned char a[2];
unsigned int b;
}key_data;
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
start_iic();
write_byte_iic(0xa1);
key_data.a[0]=read_byte_ack_iic();
key_data.a[1]=read_byte_nack_iic();
stop_iic();
return key_data.b;
}
void write_key_data(unsigned char a){
reset_iic();
start_iic();
write_byte_iic(0xa0);
write_byte_iic(a);
write_byte_iic(ir_code.a[2]);
write_byte_iic(ir_code.a[3]);
stop_iic();
}
void store_ir(void){
buf1_flag=0;
REN=1;
buf1=RECEIVE+1;
*buf1=(*buf1)<<1;
write_key_data(*buf1);
}
unsigned char yima(void){
unsigned char a;
for(a=0;a<100;){
if(ir_code.b[1]==read_key_data(a)){
break;
}
a++;
a++;
}
a>>=1;
return a;
}
void read_key(){
unsigned char a;
buf1_flag=0;
REN=1;
ir_init();
while(!ir_flag);
ir_exit();
ir_jiema();
buf2=SEND;
a=yima();
if(a==50){
*buf2=0xff;
}
else *buf2=a;
buf2_length=1;
buf2_flag=1;
SBUF=HEAD;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -