PT2264解码心得

  最近闲暇时间在琢磨无线RF解码程序,正好在数码之家论坛中翻出大佬的解码程序(http://bbs.mydigit.cn/read.php?tid=245739),于是乎,慢慢学习2264解码程序,正好用上之前买的逻辑分析仪,带看波形,带看程序,琢磨了两天,程序已可完美解码,在此来总结下心得。

一、管脚如下图所示:

OSC1和OSC2为振荡电阻管脚,常用有4.7M、3.3M等,A0-A7位2264地址位管脚,可设置为悬空(F)、高(1)、低(0)三态;D0-D3为四位数据位;

振荡频率 f=2x1000x16/Rosc(KΩ) ,Rosc为振荡电阻阻值,单位为KΩ;例:Rosc=4.7MΩ;则,f=6.8KHz,则振荡周期为Trosc=1/f=147us;

二、PT2264编码格式如下:

1.位值格式(1、0、F)(长脉冲(3A)是短脉冲(A)的3倍)

窄高+宽低+窄高+宽低=0        宽高+窄低+宽高+窄低=1             窄高+宽低+宽高+窄低=F

2.时序图

              同步码低电平(L)是窄脉冲(A)的31倍,即,A=L/31

            上图中OSC表示振荡电阻周期 Trosc,则上图时序T=2XTrosc

3.数据结构

三、解码思路

1、首先识别出帧与帧,依据同步码区分开来,同步码低电平时长为31T;

2、再依据识别出的同步码,判断计算出窄电平时间T,则宽电平时间为3T;(判断窄电平思路,窄电平的误差范围为正(T+T/4)负(T-T/4)一个振荡周期A=T/4;宽电平的误差范围为正(T * 3 + T / 2)负(T * 3 - T / 2) 两个振荡周期2A=T/2)

3.依据宽窄电平组合即可解出遥控器码值。

四、程序如下所示,借鉴数码之家各位大佬程序再结合自己理解

 //自适应频率的2262解码代码 晶振11.0592
#include <STC15F2K60S2.H> //STC15F104W头文件
#include <intrins.h> //左移右移函数头文件
#define uchar unsigned char
#define uint unsigned int
sbit WuXian_IN =P3^; //外部中断1,RF模块DATA信号输入管脚
sbit OK_LED =P3^; //解码成功
sbit D0=P3^; //数据位1000
sbit D1=P3^; //数据位0100
sbit D2=P3^; //数据位0010
sbit D3=P3^; //数据位0001
void Init()
{
TMOD = 0x01; //定时器T0,工作模式1,16位定时,不自动重装,TL0、TH0全用
TR0=; //(可位寻址)关闭定时器T0运行
// ET0=0; //(可位寻址)T0的溢出中断允许控制位,ET0=1允许T0中断; ET0=0禁止T0中断; EX1 =; //允许外部中断1中断
IT1=; //IT1=0 --上升沿和下降沿均可触发中断; IT1=1 ----下降沿触发
EA=; //(可位寻址)开启总中断 } void main()
{
Init();
OK_LED=;
D0=;
D1=;
D2=;
D3=;
while();
} void ex0(void) interrupt //外部中断1入口函数
{ //PT2262发码为窄高+宽低+窄高+宽低=0 /宽高+窄低+宽高+窄低=1 /窄高+宽低+宽高+窄低=F
//数值表示: 00 = 0 / 11 = 1 / 01 = F
//反码表示: 11 = 0 / 00 = 1 / 10 = F(本例所用)
bit err = ;
uchar I = ; //用来记录位数,正常会收到24位
uchar TL,TH; //用来记录每位的低电平总时长
uchar MA1,MA2,MA3; //用来记录地址码(占16位)和键码(占8位)(MA1、MA2、MA3各8个bit位)
uchar TimeCount;
uint L,M; EX1 = ; //暂停外部中断
TR0 = ; //启动定时器计数器0
if(TimeCount > ) //当按键按下释放后该值不在赋值就同通过递减直到该值等于0
{
TimeCount--; //等于0后表示按键释放
}
while(WuXian_IN == ); //如果为0一直等待,等待高电平出现
while(I < ) //共接收24位
{
while(WuXian_IN == ); //等待高电平到来
TL = TL0;
TH = TH0;
TH0 = TL0 = ; //记录低电平长度
L = TH;
L = ((L << ) + TL); //将计时器的高低8位合并
if(I == ) //处理同步位
{
if(L > ) //确认是引导头(判断同步位低电平时长31a)
{
M = L / ; //M即4a亦即是窄电平的时长
}
else //不符合规则(出错)
{
I = TR0 = TH0 = TL0 = ;
err = ;
break;
}
}
else
{
//短555 长1666
//4.7M的振荡电阻时同步位的低电平时长为L=15378uS;即31a
//4.7M的振荡电阻时窄电平时长为M=492uS;即4a
//4.7M的振荡电阻时宽电平时长为1488uS即12a
//以下语句即判断窄电平与宽电平的宽度是否合格
/*
窄电平时长为M即 M=4a;a为一个振荡频率, fosc=(2x1000x16/Rosc(KΩ))KHz,fosc单位为KHz, (Rosc为振荡电阻,单位为KΩ),则一个振荡周期T=1/fosc 例如常用振荡电阻为4.7M;则振荡频率a=fosc=1/(2x1000x16/4700)=6.8KHz ,则振荡周期T=1/6.8K=147uS,即窄电平M=a=4T=588us;则宽电平3xM=3a=1764us; 程序中窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4; 程序中宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2; */
if(((L < M - M / ) && (L > M + M / )) || ((L < M * - M / ) && (L > M * + M / ))) //如果窄电平小于4a与大小4a或宽电平小于12a与大小12a则表示出错
{ //窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;
I = TR0 = TH0 = TL0 = ; //宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
err = ;
break;
}
}
while(WuXian_IN == ); //等待低电平到来
TH = TH0;
TL = TL0;
TH0 = TL0 = ;
L = TH;
L = ((L << ) + TL); //将计时器的高低8位合并
/*以下语句即判断是窄电平是否合格(4.7M的振荡电阻时窄电平时长为492uS即4a) */
if(((L > (M - M / )) && (L < (M + M / ))))//如果此时为4a则本位为0 短492uS
{ //窄电平的误差范围为正(M+M/4)负(M-M/4)一个振荡周期a=M/4;
I++;
MA1 <<= ; //本位置0
}
/*以下语句即判断宽电平是否合格(4.7M的振荡电阻时宽电平时长为1488uS即12a) */
else if(((L > (M * - M / )) && (L < (M * + M / ))))////如果此时为12a则本位为1 长1488uS
{ //宽电平的误差范围为正(M * 3 + M / 2)负(M * 3 - M / 2) 两个振荡周期2a=M/2;
I++;
MA1 <<= ;
MA1++; //本位置1
}
else //已不是4a也不是12a则不符合规表示出错
{
I = ;
TR0 = TH0 = TL0 = ;
err = ;
break;
}
if(I == )
{
MA3 = MA1; //每二位对应PT2262的一个引脚,bit7/bit6二位对应PT2262的1脚,类推对应PT2262的1~4脚 / 11 = 接+ / 00 = 接地 / 01 = 悬空
//P1 = MA3; //送P1口显示方便调试
}
if(I == )
{
MA2 = MA1; //每二位对应PT2262的一个引脚,bit7/bit6二位对应PT2262的5脚,类推
//对应PT2262的5~8脚 / 11 = 接+ / 00 = 接地 / 01 = 悬空
//P0 = MA2; //送P1口显示方便调试
}
if(I == ) //24位已收完则解码结束
{
if(TimeCount == ) //为0表示是新的一次按下对其进行处理,如过该值大于0表示已经按下不在处理
{
switch(MA1)
{
case 0xC0: //PT2262的10脚按键按下时
D0 = ~D0;
break;
case 0x30: //PT2262的11脚按键按下时
D1 = ~D1;
break;
case 0x0C: //PT2262的12脚按键按下时
D2 = ~D2;
break;
case 0x03: //PT2262的13脚按键按下时
D3 = ~D3;
break;
}
}
OK_LED = !OK_LED; //解码正确后取反一次
TimeCount =; //PT2262每按一次会发出4组相同的编码防止按键没放开直在取反,保证按1次只做1次处理
}
}
TR0 = TH0 = TL0 = ; //关闭定时器T0,并重置TH0、TL0
EX1 = ; //开启外部中断1
} //void timer0(void) interrupt 1 //***********定时器T0中断子函数**************
//{
//TH0=(65536-5000)/256;
//TL0=(65536-5000)%256;
// i++;
//}

PT2264解码心得的更多相关文章

  1. 【并行计算与CUDA开发】基于NVIDIA显卡的硬编解码的一点心得 (完结)

    原文:基于NVIDIA显卡的硬编解码的一点心得 (完结) 1.硬解码软编码方法:大体流程,先用ffmpeg来读取视频文件的包,接着开启两个线程,一个用于硬解码,一个用于软编码,然后将读取的包传给解码器 ...

  2. ilbc编解码

    针对国内的博客或者技术论坛对 ILBC的论述都是把文章抄来抄去, 本人在此对 ILBC的具体代码实现详细列出代码. ILBC是由Global IP Sound公司提出的一种专为包交换网络通信设计的编解 ...

  3. WGZX:javaScript 学习心得--2

    转贴javascript心得(二) 标签: javascriptajaxweb开发htmlfirefox框架 2008-09-11 10:56 636人阅读 评论(0) 收藏 举报  分类: UI(2 ...

  4. android bitmap out of memory总结、心得

    setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,这些函数在完成decode后,最终都是通过java层的creat ...

  5. Python字符串的encode与decode研究心得——解决乱码问题

    转~Python字符串的encode与decode研究心得——解决乱码问题 为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“/xe4/xb8/xad/xe6/x96/x8 ...

  6. webstorm激活破解码+++使用技巧

    Webstorm激活破解码 2017-06-15更新 之前都是使用2017.2.27的方法,版本是2017.1.1,还没提示过期,但是根据评论说这个链接已经失效了,评论也给出了个新地址:http:// ...

  7. BUG心得

    在<程序员,你会从 Bug 中学习么?>一文中,我写了我是怎样追踪这些年遇到的最有趣 bug 的.最近我重新浏览了这所有的 194 个条目(历时 13 年),看看我从这些 bug 中学到了 ...

  8. 编码 解码 python

    之前一直对python文件中编码解码糊里糊涂,今天看到一篇文章,觉得把我讲的有点明白了.写个心得吧. 1.编码解码是怎么一回事? Python 里面的编码和解码也就是 unicode 和 str 这两 ...

  9. python读取文件解码失败

    python2.7 urllib2 抓取新浪乱码 中的: 报错的异常是 UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2 ...

随机推荐

  1. 使用Java绘制验证码

    效果图: JDemo.java import java.io.File; import java.io.IOException; import static java.lang.System.out; ...

  2. Java 内存区域与内存溢出异常

    一.Java虚拟机内存划分 1.程序计数器 线程私有 可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令. Java虚拟机是通过多 ...

  3. Spring Boot 整合Servlet

    冷知识,几乎用不到 在spring boot中使用Servlet有两种实现方法: 方法一: 正常创建servlet,然后只用注解@ServletComponentScan package clc.us ...

  4. ref 与 $refs 如何关联

    先问大家一个简单的问题: 还有人记得 jquery 里面的 data 方法是如何让 DOM 节点绑定对应的数据对象的吗 有时候我们做节点关联设计的思路其实有一点类似,但是在 vue 里面多了很多概念, ...

  5. vue中手机号,邮箱正则验证以及60s发送验证码

    今天写了一个简单的验证,本来前面用的组件,但是感觉写的组件在此项目不是很好用,由于用到的地方比较少,所以直接写在了页面中.页面展示如图   <div>   <p class=&quo ...

  6. 让 SyntaxHighlighter 3.x 支持 Lua 语法着色

    1. [代码]shBrushLua.js /** * SyntaxHighlighter * http://alexgorbatchev.com/SyntaxHighlighter * * Synta ...

  7. 每次rand出来都是41?说好的随机数呢?!

    rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个"伪随机"整数,理论上可以产生的最大数值为2^16-1,即32767. rand()函数不接 ...

  8. I.MX6 MAC地址修改

    /*********************************************************************** * I.MX6 MAC地址修改 * 说明: * I.M ...

  9. 【USACO 2857】 Steady Cow Assignment

    [题目链接] 点击打开链接 [算法] 二分答案,check的时候跑最大流,即可 [代码] #include<bits/stdc++.h> using namespace std; #def ...

  10. 【扬中集训Day6T1】 白日梦

    [题目描述] 白日梦 (daydream.c/cpp/pas) 时间限制: 1 s  空间限制: 256 MB 题目描述 SR需要相当大的睡眠量 某日,他做了一个奇怪的梦,他梦见自己成为了怪物猎人,为 ...