由于最近在使用AS6122这个芯片,所以,就写了一个小小的程序。程序如下呢。最近要做国赛的题目,所以比较累比较忙(更多的文章请到http://microac13xb.bokee.com/,让我们共同学习,求知若渴,虚心若愚!我要忙了)~~~~
;===================================================================
;Source program
/*---------------------------------------------
Instruction:due to un-clear PPM but knowing
delay(1)'s times(N) >= 8 data=1 or data=0;
----------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IRIN=P3^3; //红外接收
uchar User=0,Dat=0; //只做简单的数据显示
uchar User_Dat[4]={0,0,0,0};
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i ) {}
}
}
/**********************************************************/
//寄存器初始化
void Reg_Init(void)
{
IRIN=1;
EA=1; //开总中断
IE1=1; //下降沿触发
EX1=1; //外部中断1启动
}
//中断处理函数-红外接收
void Ir_In () interrupt 2 using 2
{
uchar i=0,j=0;
uchar N=0,t=0;
EX1=0; //close
delay(15);
if(IRIN==1)
{
EX1=1;
return ;
}
while(!IRIN) //跳过9ms前导低电平
{
delay(1);
}
for(i=4;i>0;i--)
{
while(IRIN)
{
delay(1); //跳过4.5ms高电平
}
while(!IRIN)
{
delay(1); //跳过4.5ms低电平
}
for(j=8;j>0;j--) //开始读数据
{
while(IRIN) //计算高脉冲的宽度
{
delay(1);
N ;
if(N>=30) //计数过长
{
EX1=1;
return ;
}
}
User_Dat[i]>>=1; //右移一位高位清零
if(N>=8) User_Dat[i]|=0x80; //高位置一
N=0;
}//end for j
} //end for i
if( (User_Dat[0]!=~ User_Dat[1])|| (User_Dat[2]!=~ User_Dat[3]))
{
//数据出错
EX1=1;
return;
}
else
{
User=User_Dat[0];
Dat=User_Dat[2];
EX1=1;
return;
}
}
void main(void)
{
Reg_Init();
while(1)
{
P0=User; //用户码
P2=Dat; //数据码
}
}