本帖最后由 dongjie_0000 于 2014-4-20 11:50 编辑
我写了一个红外解码的程序,调不通,调试的时候,查看ucTImeouts的数值,发现为7,不知道出现什么问题,求大神们帮忙解决
因为M058内部频率最高位50MHZ,所以我的延时程序为
/************延时程序***********/
void delay_us(void)
{
char i;
for(i = 0;i < 50;i++);
}
void delay(int n)
{
int i;
for(i = 0;i < n;i++);
delay_us();
}
/*************中断处理**************/
void EINT0_IRQHandler(void)
{
char ucIRBuf[4];
unsigned char ucTimeouts=0;
unsigned char i,j;
P3->ISRC = GPIO_ISRC_ISRC2;
// _GPIO_SET_PIN_MODE(P4, 4, GPIO_PMD_OUTPUT);
// P44=0;
/*开始判断是否为NEC波形引导码的前9MS和后4.5MS*/
ucTimeouts=0; //计数时间清0
// P3->ISRC = GPIO_ISRC_ISRC2;
while(!P32)
{
/* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
delay(100);
ucTimeouts++;
}
/*NEC引导码前9MS,ucTimeouts约等于90,给个误差值,用80-100之间来判断*/
if(ucTimeouts<80||ucTimeouts>100)
{
return;
}
ucTimeouts=0;
while(P32)
{
/* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
delay(100);
ucTimeouts++;
/*NEC引导码引导码的后4.5MS,ucTimeouts约4S*/
if(ucTimeouts>50)
{
return;
}
}
/*NEC引导码引导码的后4.5MS,ucTimeouts约4S*/
if(ucTimeouts<40)
{
return;
}
/*开始接收4字节内容*/
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(!P32);//低电平开始,等待高电平接收
ucTimeouts=0;
while(P32) //高电平开始,等待低电平接收
{
/* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
delay(100);
ucTimeouts++;
if(ucTimeouts>20)
{
return;
}
}
/* 高电平结束,判断数据1或0向变量移入 */
ucIRBuf>>=1;
if(ucTimeouts>10)
{
ucIRBuf|=0x80;
}
}
}
/* 接收数据成功 */
g_ucIRData = ucIRBuf[2];
g_bIRRecvEnd = TRUE;
// printf("P3.2 EINT0 occurred. \n");
}
|