您的位置:首页 > 其它

外部中断(红外通信)

2015-12-07 15:15 134 查看
以前用来红外通信控制小车的程序

typedef unsigned char UCHAR8;
/*
初始化 指定下降沿触发
1 产生外部中断
2 IRTime 对下降沿计数 将脉冲时序信号转为长度
接收完成(irok==1)后,进行红外处理 Ircordpro() 将脉冲的长度转为编码值 >7 0 <7 1.一共32位四字节。
3 码值处理
红外处理好(irpro_ok==1)后,把遥控器按下的编码转换为对应的数字 如 fd03(fd前03后互补fd+03=256) 代表遥控器的暂停播放
4 键值处理
*/
sbit IR=P3^2; //红外接口标志 外部中断
bit irpro_ok,irok;
UCHAR8 IRcord[4];
UCHAR8 irdata[33];
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等 如 fd03(fd前03后互补fd+03=256) 代表遥控器的暂停播放
{
Ir_work();
}
}
/*-----外部中断0初始化----------*/
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
void tim0_isr (void) interrupt 1 using 1
{
irtime++; //用于计数2个下降沿之间的时间
}
/*------外部中断0中断处理----------*/

void EX0_ISR (void) interrupt 0 //外部中断0服务函数 interrupt 2 外部中断1
{
static UCHAR8 i; //接收红外信号处理
static bit startflag; //是否开始处理标志位

if(startflag)
{
if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}

}
/*------键值处理----------*/

void Ir_work(void)
{
switch(IRcord[2])
{
case 0x45:direct(0);break;//停止
case 0x40:direct(1);break;//向前
case 0x19:direct(2);break;//向后
case 0x07:direct(3);break;//左转
case 0x09:direct(4);break;//右转
case 0x0C:PWMper=10;LCD_Write_String(9,1,"1");break;//PWM : 10%
case 0x18:PWMper=20;LCD_Write_String(9,1,"2");break;//PWM : 20%
case 0x5E:PWMper=30;LCD_Write_String(9,1,"3");break;//PWM : 30%
case 0x08:PWMper=40;LCD_Write_String(9,1,"4");break;//PWM : 40%
case 0x1C:PWMper=50;LCD_Write_String(9,1,"5");break;//PWM : 50%
case 0x5A:PWMper=60;LCD_Write_String(9,1,"6");break;//PWM : 60%
case 0x42:PWMper=70;LCD_Write_String(9,1,"7");break;//PWM : 70%
case 0x52:PWMper=80;LCD_Write_String(9,1,"8");break;//PWM : 80%
case 0x4A:PWMper=90;LCD_Write_String(9,1,"9");break;//PWM : 90%
default:break;
};

irpro_ok=0;//处理完成标志

}
/*-----红外码值处理--------*/

void Ircordpro(void)//红外码值处理函数
{
UCHAR8 i, j, k;
UCHAR8 cord,value;

k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单片机 红外通信