📄 7461.c
字号:
/*----------------------------------------------------------------------------
红外一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,
跟着引导码是系统码13位,系统反码13位,按键码8位,按键反码8位,
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0",
以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
晶振用的是11.0592M的。
-----------------------------------------------------------------------------*/
#include <at89x52.h>
#include <stdio.h>
#define uchar unsigned char
sbit p32=P3^2;
bit flag7461;
uchar data Custom_Code[4],Key_Date[2]; //定义2个数组,用来存储代码coustom code 和 key date
uchar Rec7461_xbit(uchar x);
void ds0_9ms(void)
{
uchar j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
void ds1ms(void)
{
uchar i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
void ds4_5ms(void)
{
uchar i,j;
for(i=10;i>0;i--)
for(j=225;j>0;j--) ;
}
void ds2s(void)
{
uchar i,j,k;
for(i=200;i>0;i--)
for(j=200;j>0;j--)
for(k=10;k>0;k--) ;
}
void inter_7461 (void) interrupt 0 using 2 //外部中断0的函数
{
uchar k;
EA=0;
for(k=0;k<10;k++) //重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
{
ds0_9ms();
if (p32==1)
{
k=10;
break;
}
else if(k==9)
{
while(p32==0); //等待高电平避开9毫秒低电平引导脉冲
ds4_5ms();
/*---------------开始接收42位编码---------------------*/
Custom_Code[0]=Rec7461_xbit(6); //接收6位Pin-selectable code C0~C5
Custom_Code[1]=Rec7461_xbit(7); // 接收7位Mask ROM code C6~C7
Custom_Code[2]=Rec7461_xbit(6); // 接收6位相反的 Pin-selectable code
Custom_Code[3]=Rec7461_xbit(7); // 接收7位相反的Mask ROM code
Key_Date[0]=Rec7461_xbit(8); // 接收8位 key date
Key_Date[1]=Rec7461_xbit(8); // 接收8位相反的key date
if (Custom_Code[0]!=~Custom_Code[2])
flag7461=0; // 解码失败
else if ( Key_Date[0]!=~Key_Date[1])
flag7461=0; // 解码失败
else flag7461=1; // 解码成功
}
}
EA=1;
}
uchar Rec7461_xbit(uchar x)
{
uchar j,dm=0;
for(j=1;j<=x;j++)
{
while(p32==0); // 等待地址码第一位的高电平信号
ds0_9ms(); // 高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
if(p32==1)
{ // 检测到高电平1的话延时1毫秒等待脉冲高电平结束
ds1ms();
dm=dm|0x80;
if(j<x) dm=dm>>1;
}
else if(j<x)dm=dm>>1;
}
dm=dm>>(8-x);
return dm;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -