遥控器波形:
这个是1组波形,按键一次连发3次
程序很简单,但是开始的时候忘了设置INT0的触发方式。调了半天
#include <REGX52.H>
typedef unsigned char uchar;
/*硬件引脚定义*/
sbit IR="P3"^2; //红外口
/*全局变更定义*/
bit NewCode="0"; //新红外数据标志
bit IR_Decodeing=0; //解码中标志
uchar IRCode; //红外数据
uchar IRbits="0";
uchar LastCode; //3次比较用
uchar IRCount="0";
/*函数申明*/
void init(void);
main()
{
init();
while(1)
{
if(NewCode)
{
P0=IRCode;
SBUF=IRCode;
while(!TI);
TI=0;
NewCode=0;
}
}
}
/************************************************************
*Function:初始化
*************************************************************/
void init(void)
{
TMOD="0x21"; //定时器1模式1
TH1=0xfd;
TL1=0xfd;
TR1=1;
EX0=1;
ET0=1;
IT0=1; //INT0下降沿触发
SCON=0x50;
EA=1; /* 开中断 */
}
/************************************************************
*Function:INT0中断
*************************************************************/
void int0(void) interrupt 0
{
if(IR_Decodeing)
{
TH0=0xFC; //定时1ms
TL0=0x66;
}
else //前导判断
{
TH0=0xFA; //1.5ms
TL0=0x99;
}
TR0=1;
}
/************************************************************
*Function:TIMER0中断
*************************************************************/
void timer0(void) interrupt 1
{
if(IR_Decodeing)
{
IRbits++;
IRCode>>=1;
if(IR==0)
{
IRCode+=0x80;//低电平代表1
}
if(IRbits==8)
{
if(LastCode==IRCode)
IRCount++;
else
{
IRCount=0;
LastCode=IRCode;
}
if(IRCount==2) //3次数据一样
{
NewCode=1;
IRCount=0;
LastCode=0xff;
}
IR_Decodeing=0;
}
}
else //判断是否是前导
{
if(IR)
{
return;
}
else //低电平是前导
{
IR_Decodeing=1;
IRbits=0;
}
}
}
文章评论(0条评论)
登录后参与讨论