📄 ir.c
字号:
void delayIR(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++);
}
}
void IR_ini()
{
IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
TCON|= 0x01; //触发方式为脉冲负边沿触发
}
void INT_0() interrupt 0 using 0
{
unsigned char IRCOM[4];
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (!IRIN) break;
if (i==3) {goto IRERR;}
}
delayIR(20);
if (IRIN) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delayIR(1);}
for (j=0;j<4;j++)
{
for (k=8;k>0;k--)
{
while (IRIN) //等 IR 变为低电平
{
delayIR(1);
}
while (!IRIN) //等 IR 变为高电平
{
delayIR(1);
}
while (IRIN) //计算IR高电平时长
{
delayIR(1);
N++;
if (N>=30) {goto IRERR;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8)
IRCOM[j] = IRCOM[j] | 0x80;
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {goto IRERR;}
IR_data=IRCOM[2]; //将红外接收到的值放入IR_data中
IROK=1;
IRERR:EA = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -