|
发表于 2005-8-27 15:43:40
|
显示全部楼层
大虾们,本人是很喜欢单片机(业余的,非本专业),在广东工业大学读书,目前还不会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;
} |
|