avr单片机解码ht6221红外遥控信号问题出在哪里?

单片机mega168晶振内部rc8M我用的定时器0计时#include<avr/io.h>#include<avr/interrupt.h>#defineucharuns... 单片机mega168
晶振内部rc8M
我用的定时器0计时
#include <avr/io.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define _IR_port (PIND&(1<<3))
#define LED PORTD^=(1<<7)
uchar IR_KEY_BUF,ir_code[4]={0};
volatile char flag09,flag63,flag45,tmcnt;

void timer0_init(void)
{
TCCR0A=0;
TCCR0B=(1<<CS02)|(1<<CS00);//1024分频
TCNT0=(255-7); //896us
TIMSK0=(1<<TOIE0);
TIFR0=0;
sei();
}

SIGNAL(SIG_OVERFLOW0) //最大计数256*1024/8=32.768ms
{
TCNT0=248;
flag09=1;
tmcnt++;
if(tmcnt==4)flag45=1;
if(tmcnt==7)flag63=1;
}

//***************************
void delay882us(void) //delay 827us
{
TCNT0=248;
flag09=0;
tmcnt=0;

while(!flag09);

}

void delay45us(void) //delay 4910us
{
TCNT0=248;
flag45=0;
tmcnt=0;

while(!flag45);
}
void delay63us(void) //delay 4910us
{
TCNT0=248;
flag63=0;
tmcnt=0;

while(!flag63);
}
void delay(void)
{uchar i;
for(i=0;i<10;i++);}

//*********************
int main(void)
{
uchar TEMP,i,j;

DDRB=0XFF;
PORTB=0XFF;
DDRD&=(~(1<<3)); //irin pd3
PORTD|=(1<<3); //上拉电阻
timer0_init();

while(1)
{

if(!_IR_port) //出现低电平
{
//for(TEMP=0;TEMP<7;TEMP++) //延时等待9ms低电平
{
delay63us();
if(_IR_port)goto EXIT; //如果是高电平,不是头码,退出
}

while(!_IR_port)delay(); //等待变为高电平
delay45us(); //延时4.5ms
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
while(_IR_port)delay();
ir_code[j]=ir_code[j]>>1; //低位在前
while(!_IR_port)delay(); //等待变1
delay882us(); //延时0.88ms
if(_IR_port) ir_code[j]|=0x80; //高电平为1,否则为0

}

}

if(ir_code[2]!=~ir_code[3])goto IR_RET; //数据错误退出
LED;
PORTB=ir_code[3];//~PORTB;

IR_RET:
for(TEMP=20;TEMP!=0;TEMP--)
{
delay45us();
if(_IR_port==0X00)
{
uchar i;
for(i=4;i!=0;i--)
{
delay882us();
if(_IR_port!=0)goto EXIT;
}
while(_IR_port==0X00);
}
}
EXIT:;
}

}
}
是不是在解码数据的过程中每次计时的起点不一样的原因呢?我通过232把数据发到了PC上,但是看不出来到底是那里出现了问题,每解一个码我用了一个while语句,目的就是使计时的起点一致!为什么还是错误呢!难不成我这样用定时器也有问题
展开
 我来答
xialvfire
2010-12-09 · 超过26用户采纳过TA的回答
知道答主
回答量:51
采纳率:0%
帮助的人:65.3万
展开全部
对的,你写个串口发送程序,把你解出来的遥控器码发送到串口看看,就知道问题出在哪里了。
全测科技
2024-12-19 广告
SMW200A是罗德与施瓦茨生产的一款高性能矢量信号发生器,频率范围高达67 GHz(双通道最高44 GHz),具备2 GHz的调制带宽和高达800 MHz的集成式衰落带宽,支持8x8 MIMO。其内部基带能满足第四代标准(如LTE-Adv... 点击进入详情页
本回答由全测科技提供
百家小诸葛
2010-12-08 · TA获得超过1335个赞
知道小有建树答主
回答量:636
采纳率:0%
帮助的人:319万
展开全部
要学会联机调试 这样才能学东西 查查如何联机调试吧
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sewskg
2010-12-10 · TA获得超过1089个赞
知道小有建树答主
回答量:602
采纳率:0%
帮助的人:324万
展开全部
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式