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语句,目的就是使计时的起点一致!为什么还是错误呢!难不成我这样用定时器也有问题 展开
晶振内部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语句,目的就是使计时的起点一致!为什么还是错误呢!难不成我这样用定时器也有问题 展开
3个回答
全测科技
2024-12-19 广告
2024-12-19 广告
SMW200A是罗德与施瓦茨生产的一款高性能矢量信号发生器,频率范围高达67 GHz(双通道最高44 GHz),具备2 GHz的调制带宽和高达800 MHz的集成式衰落带宽,支持8x8 MIMO。其内部基带能满足第四代标准(如LTE-Adv...
点击进入详情页
本回答由全测科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询