请教各位大虾我用mega8如何测量红外脉冲的时间?
测量红外脉冲的高低电平的时间?问题是我在读取低电平的时间时对高电平的时间会有影响我应该怎么做呢? 说清楚些,要解码还是测电平宽度? 是解码,主要是做学习型的,能读大部分的遥控器的编码,并存储转发.我想用测量高低电平的宽度办法解决,请问如何解决呢? “用测量高低电平的宽度办法解决”这种方法可以呀。 大虾们,本人是很喜欢单片机(业余的,非本专业),在广东工业大学读书,目前还不会AVR,正在学呢!不过用8051我懂一点点,只懂一点点!不知道是否对你有所帮助?
本人的Email:89S53@163.com
8051方法如下:
/*
说明:本模块用于对6122编码格式的红外线遥控器进行解码,方法是可行的,
本人用此法成功解出了一只34键的VCD遥控器,但在发这个贴的时候只Copy
了其中的一部分代码,可能出错,自己找吧!很乱哦!没时间去做成一个像样的文档,莫怪!!
*******************************************
INT0接红外一体化接收头的DATA脚,可以用T0,T1对电平的持续的时间进行计时,用于启动和关闭定时器.
___ ____
| | |
|____| |___________
|<T0>|
|<--T1--->|
由于高电平的宽度都一样0.56ms,可以不理会T0的值。
注意:本模式没有处理代码尾部的波形,可以在第35次出现低电平时就不进行保存,否则结果不对!!!
|0x6f---------------------long型变量result---------------------0x72|
result1 result2 result3 result4
0x6f; 0x70 0x71 0x72
用户码低8位 用户码高8位 键码 键码反码
如:0000 0000 1111 1111 1000 0000 0111 1111
*/
#include <absacc.h>
#include "Atmel\REGX52.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
data uint T1_Count; //保存T1的计数值,也就是第N个低电平到第N+1个低电平的时间,为高低电平之和
//data uint T0_Count; //T0的计数值,这里没有用到
data ulong result _at_ 0x6f; //保存32位码,16+8+8,和下面的地址重复
data uchar result1 _at_ 0x6f; //用户码低8位
data uchar result2 _at_ 0x70; //用户码高8位
data uchar result3 _at_ 0x71; //键码
data uchar result4 _at_ 0x72; //键码反码
uchar int_0_times=0; //用来记录第?次从高电平到低电平,记住按完一次健就应该清零哦!!!!!
void main(void)
{//初始化设置如下:
TMOD=0x19; //0001 1001B 门控位GATE设为1
IT0=1; //INT0为边缘触发方式
TH0=0;TL0=0;TH1=0;TL1=0; //T0,T1设初值
IE=0x93; //1001 0011
while(1)
{
//....
}
}
INT0中断服务函数如下:
void int_0() interrupt 0 using 3
{
EA=0;
TR0=0;TR1=0;
int_0_times++; //记录中断次数
if (int_0_times==1)
{
result=0;
}
else if(int_0_times>??)
//这里??是你要从第几个下降沿开始保存T0记数值,自己根据编码来确定,本人试过6122编码格式从第3个开始保存
//由于高电平的宽度都一样0.56ms,可以不理会T0的值,下面就省了,^_^
{
T1_Count=TH1; //读T1的高8位
T1_Count<<=8; //左移8位
T1_Count=T1_Count+TL1;//加上T1的低8位
if (T1_Count>1750) //这个1750是本人的经验值,下面那个1350也是,
{//是"1"
result*=2;
/* result*=2;相当于将32位的二进制码左移一位
本人试过用result<<1,发现结果是错的,
这个long型的变量占用四个字节的空间,执行几次result<<1后,
发现只在低16位移位,为什么呀??谁能告诉我(89S53@163.com)?
我刚学的C,不懂!
*/
result=result+1;//在最低位加上1
}
else if (T1_Count<1350)
{//是"0"
result*=2;//同上
}
}
TH0=0;TL0=0;TH1=0;TL1=0;
TR0=1;TR1=1;
EA=1;
} 我的要求是:接收的红外编码的引导码的时间不一定,而且接收到后在还原发射,自学习型遥控器. M8的速度一定能做得到的,但是我没有做过。
但是按照你上次所说的思路应该可以实现,你多试验一下。 这跟速度没关系。8051的最大计数频率是XTAL/24,红外遥控也只有三四十KHz,完全够了 高电平和低电平的宽度都知道了,还有什么难啊?就是编程了!
方法应该和MCU的种类没有多大关系。
学习型的嘛,需要EEPROM来保存编码。
你要对各种编码形式分析。
你如果对各类编码不熟悉,谈所解码??
改用解码IC,一一对应遥控器算了! 哪位好人能给个原代码让我参考一下(avr)?急!!!!!!!!!!!!!!!!!!! 7楼的“这跟速度没关系。8051的最大计数频率是XTAL/24,红外遥控也只有三四十KHz,完全够了”
“三四十KHz”的周期是多少?难道速度很低的也能采集到数据吗? 38KHz只是载波。
红外接收头会自动去除载波,输出的是mS级的编码脉冲信号。
无论是AVR还是51来解码,速度都是够的。 如果是用滤除载波的红外接收头,输出的脉冲信号宽度还是比较大的,也有一些厂家的是400us与200us的脉冲。
所以如果用到的是普通的红外接收头,可能首先就要算载波频率,那就要求速度了。
HJJourAVR,不知我说的对不对? 提高抗干扰能力。
很少有直接接红外管的------红外干扰很多:太阳,日光灯,其他遥控器。
一般的红外遥控都是采用成品的红外接收头,提高抗干扰能力,滤除载波是同时完成的。
即便是自动水龙头,采用红外检测,也得自己调制解调----LM567集成。 “提高抗干扰能力”这我就能理解了。
多谢HJJourAVR的讲解。 参照4楼的吧, 稍微变通就可以. 有没有谁有学习型遥控器的解码程序呢(AVR,ATMEGA8)?我也要学习学习。 楼主我觉得你的这个问题已经得到解决了,这不算是技术支持差吧?
能解决的问题,不一定要马老师帮你解决吧?
所以你在别的帖子说那样的话,让我觉得…… c51的红外接收解码我有全系列遥控的原代码,我现在要知道的是avr的定时器的捕获功能具体的用法,而不是要在发一次的51的代码,4楼的原代码我早就有了.而是我发贴等好几天才能见到一个有用的帖子.真是气人呀. yu-ming,既然你C51的解码都有了,那你应该参考别人的代码自己多做实验试试看。我才初学,实在没有办法帮上忙,不好意思了,呵呵。各位高手多帮帮忙吧。 mark
页:
[1]