|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-4-26 23:54:47
|
显示全部楼层
HeP028 发表于 2012-4-26 22:23 ![](static/image/common/back.gif)
那你把中断最后的EA = 1先去掉测试嘛!先干一次看对不对塞!
另外把你红外读取的函数展览出来塞!指不定问 ...
这个是拿的别人的程序改的。这个是源代码。
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0
{
EA=0;
for(k=0;k<10;k++)
{
Delay0_9ms();
if (IRDATA==1) //如果0.9ms后IRDATA=1,说明不是引导码
{k=10;break;}
else if(k==9) //如果持续了10×0.9ms=9ms的低电平,说明是引导码
{
while(IRDATA==0);
Delay4_5ms(); //跳过持续4.5ms的高电平
for(i=0;i<4;i++) //分别读取4个字节
{for(j=1;j<=8;j++) //每个字节8个bit的判断
{
while(IRDATA==0); //等待上升沿
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms,再判断IRDATA
if(IRDATA==1) //如果IRDATA是"1",则向右移入一位"1"
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else if(j<8)
CodeTemp=CodeTemp>>1;//如果IRDATA是"0",则向右移一位,自动补"0"
}
hongwaicode=CodeTemp;
CodeTemp=0;
}
}
}
recodehigh=hongwaicode[0]<<8|hongwaicode[1];
recodelow=hongwaicode[2]<<8|hongwaicode[3];
recode=recodehigh;
recode=recode<<16;
recode=recode|recodelow;
//显示出读出的数据
// printf("%#X\n",hongwaicode);
// printf("%#X\n",recodehigh);
// printf("%#X\n",recodelow);
// printf("%#X\n",recode);
//LCD12864S_WSTR(1,0,hongwaicode);
IRDA_DISP();
EA=1;
}
再附上 全部的延时函数:
/**************************延时50us子程序**********************/
void Delay_50us(INT16U t)
{
INT8U j;
for(;t>0;t--)
for(j=20;j>0;j--);
}
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{INT8U j,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{INT8U i,j;
for(i=2;i>0;i--)
for(j=240;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{INT8U i,j;
for(i=10;i>0;i--)
for(j=230;j>0;j--) ;
}
说明:此程序来源于 长沙太阳人”杯红外波形显示单片机设计大赛 制作人:小杨(杨再兴) <2010.7.5> |
|