找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

我知道这样做不是很好,但我应经调了一天了,才迫不得已上来问,

[复制链接]
admin 发表于 2012-9-2 19:41:06 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
我知道这样做不是很好,但我应经调了一天了,才迫不得已上来问。根据一线工人的红外接收程序移植到mega16,调了一天都没调通,具体表现为一直显示0,但是用示波器能看到接收的波形。论坛的高手们,请帮我分析一下,程序有点乱,将就着看吧。万分感谢!!

发射码的格式

5_75477_1a826ebeb00177d.jpg


5_75477_ee664fe0494c992.jpg

源程序

10-01-20-3.rar (4.7 KB, 下载次数: 0)



//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;
}
}
}


}
[ 此贴被hfd999在2010-01-20 15:02重新编辑 ]
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-29 08:04 , Processed in 0.057666 second(s), 14 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表