本帖最后由 hfd999 于 2010-1-20 20:22 编辑
我知道这样做不是很好,但我应经我知道这样做不是很好,但我应经调了两天了,才迫不得已上来问,根据51的红外接收程序移植到mega16,调了两天都没调通,具体表现为一直显示0,但是用示波器能看到接收的波形,是不是没有进入中断?论坛的高手们,请帮我分析一下,程序有点乱,将就着看吧。万分感谢!!
调制波形
全部代码
10-01-20-3.rar
(4.29 KB)
//ICC-AVR application builder : 2010-1-15 1:20:47
// Target : M16
// Crystal: 8.0000Mhz
#include "iom16v.h"
#include "macros.h"
#include "declare.h"
#include "define.h"
extern uchar key_code;//遥控键值
void main(void)
{
CLI();
init_devices();//MCU初始化
LCD1602_init();//液晶初始化
SEI();
LCD1602_set_xy( 0,1 );
LCD1602_write_data(1+0x30);
while(1)
{
LCD1602_set_xy( 0, 0);
LCD1602_write_data(key_code/100+0x30);
LCD1602_write_data(key_code%100/10+0x30);
LCD1602_write_data(key_code%100%10+0x30);
//delay_nms(250);
}
}
#include "iom16v.h"
#include "macros.h"
#include "declare.h"
#include "define.h"
uchar key_code=0;//遥控键值
uchar buf_key_code=0;//键值暂存
uint key_bit_count=0;//键编码脉冲计数
uint count=0;//定时中断次数计数
uint buf_count=0;//定时中断计数暂存
uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:数据编码接收区
uchar buf_INT0_PIN;//INT0的管脚状态
void init_devices(void)
{
//INT0_port |= INT0_EN; //上拉
INT0_DDR &= ~INT0_EN; //输入
//INT0_DDR |= INT0_EN;
TCCR1B = 0x00; //停止
TCNT1H = 0xFF; //10uSec,
TCNT1L = 0xF6;
//TCCR1B = 0x02; //8分频
MCUCR = 0x02;//下降沿触发
GICR = 0x40;//INT0使能
TIMSK = 0x80; //T1中断使能
}
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)//2
{
TCNT1H = 0xFF;
TCNT1L = 0xF6;
count++;//定时器中断次数累加
}
#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)//6
{
TCCR1B = 0x02;//开定时器中断
if(count>60 && count<450)//如果信号合法
{
buf_count = count;//则放入buf_count,count清0,对下一个脉冲信号计时
count = 0;
}
delay_nus(108); //延时100us以消除下降沿跳变抖动
buf_INT0_PIN = INT0_PIN & INT0_EN;
if(buf_INT0_PIN == 0)//INT0引脚稳定为低电平,则表法确实是信号
{
count=10; //count重新计时,因上面延时了100us,故要补偿10次TO中断
}
if(buf_count>60 && buf_count<450)//若收到的信号合法,则再进行信号分析
{
if(ir_status == 0)//如果之前未收到引导码
{
if(buf_count>350 && buf_count<450)//判断是否引导码4ms
{
ir_status=1;//系统标记
buf_count=0;
}
}
else if(ir_status == 1)//进入数据编码接收
{
if(key_bit_count < 8)//收到数据少于8位,则将收到的数据写入buf_key_code
{
if(buf_count>150 && buf_count<250)
{
buf_count = 0;
buf_key_code |= 0x01;//收到1
buf_key_code <<= 1;
key_bit_count++;//数据脉冲累加
}
else if(buf_count>60 && buf_count<150)//收到0
{
buf_count=0;
buf_key_code <<= 1;//收到0
key_bit_count++;
}
}
else //若收完8位数据则做以下处理
{
ir_status=0;//接收状态返回到空闲
key_code=buf_key_code;
key_bit_count=0;
buf_key_code=0;
buf_count=0;
TCCR1B = 0x00;
}
}
}
} |