baogmwiqpl 发表于 2009-9-3 08:24:01

以后肯定会用

yxlcarter 发表于 2009-9-7 08:54:44

mark,刚好要用到。以后参考一下,再评论。

ivws 发表于 2009-9-7 09:38:56

to

【97楼】 kanprin
积分:793
派别:
等级:------
来自:闽c
if (i>192) goto end;//限时解码
if (!((56>i)&(i>24))) goto end;   //电平合法
if (!((168>i)&(i>72))) goto end;    //电平合法   
if (i>224) goto end;      //限时解码
if (i<96) goto end;                  //对比宽度   


while (PIND&(1<<PD2))         //高位计数
{      
asm("nop");         //
i++;                  //计数增加
   
if (i>192) goto end;//限时解码
}
这个循环周期应该是5,在1M的时钟频率下,一个周期应该是1us,也就是一个循环5us,5*192=960us
在3.3M的电阻下,基本频率是f=10K,也就是100us,那么高电平时间为4*100=400us或12*100=1200us
不知道楼主那些常数是如何得来的? 根据什么来估算正确的范围呢 ? 也望知情的兄弟解答一下,谢谢。

********************************************************************************************

我是用示波器测量得出的,你这是理论上的计算.实际上会随着电变化而变化的..

jetlzd 发表于 2009-9-8 16:48:09

To:ivws

你好,我用示波器看到的波形的确也是宽波为960us,窄波的为320us。

但现在我用AVR Sudio对COF文件进行调试时,我的程序一直没往解码函数跑,因为我已经将while (PINC&(1<<4))改成while(1)了。

这和老大的程序没有关系,只是希望老大顺便指导一下。当然,程序在ICCAVR上是可以解到码的.

   还有就是我将以上的程序移植到CVAVR上时,竟然解不到码。

   希望老大看看我遇到的是啥子问题!感谢!

jetlzd 发表于 2009-9-8 16:50:06

对了,我用的芯片是Atmega48来的。
用的是8M,然后内部8分频这样的。

ivws 发表于 2009-9-8 16:55:23

我没有用CVAVR....

有可能是有些被优化...

liang_work 发表于 2009-9-8 18:58:44

顺便晒一下我的PT2262解码吧,如果版主觉不好的,请删了吧.
本PT2262万能解码器有以下的一些特点:
1.集合了315M及433M两种标准频率,工作前时,手动切换一下即可.
2.扫描出来的8位编码地址,4位数据位及工作振荡电阻直接在LCD上显示出来.这样更直观.
3.可以自动扫描工作.当自动扫描工作时,可以自动扫描及保存10组信号的编码资料.直到扫描满10组数据后,自动停下.过后可以手动查询已保存的资料.
有了上面的强大功能,就为我们平时调试设备带来了更多的方便.更高的效率.
顺便上个原理图,反正关键的部份是软件:
点击此处下载 ourdev_479025.pdf(文件大小:37K) (原文件名:2262.pdf)
大家可以到我的淘宝上看看
http://item.taobao.com/auction/item_detail-0db1-d361d8dfc5ad88a2b5d47708af6c8eb6.htm
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479020.jpg
1.开机画面 (原文件名:1.开机画面.jpg)

http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479021.jpg
2.自动扫描画面 (原文件名:2.自动扫描画面.jpg)

http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479022.jpg
3.查阅收录数据 (原文件名:3.查阅收录数据.jpg)

http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479023.jpg
4.内部结构 (原文件名:4.内部结构1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479024.jpg
(原文件名:4.内部结构.jpg)

coody 发表于 2009-9-8 19:27:02

2262解码非常容易的,在产品程序中,仅仅等同于按键程序

hzyhscm 发表于 2009-9-8 21:10:37

;软件解码程序(仿真PT2272)            
;晶体频率为11.0592Mhz
;本程序中的时间定位关系只适用于接3.3M振荡电阻的PT2262解码
;使用其它阻值电阻时,应将定位时间按电阻比例缩放
;下面的程序中 REM 为信号输入端
;RECEIVE      检测到有效信号标志位
;ENABLE_DETE    连续按键标志
;3AH,3BH用作定时器                     
;PT2262共12根地址线                     
;31H,32H:接收的前8 位地址编码         
;33H,30H:接收的后4 位地址编码(若最后4位用作数据端,则只须读第33H单元的内容即可)
;当用作数据端时,PT2262对应脚悬空被认为是低电平。
;地址数据说明                           
;以31H.0 和32H.0 为例                  
;悬空 : 31H.0=0 32H.0=1               
;    1: 31H.0=1 32H.0=1               
;    0: 31H.0=0 32H.0=0               
;出错   31H.0=1 32H.0=0               
;
;说明:为了能可靠检测到有效信号,建议每次接收至少检测3次,然后比较3次检测值
;3次值相同才认为收到了正确信号。可在主程序中如下处理:第1次检测时调用REMOTE
;第2、3次检测时调用REMOTES,请注意必需连续调用,否则得不到正确的数据
;
;注意:将T1设定为16位定时器,允许中断,否则将导致接收数据错误
;---------------------------------------;
REMOTE:                                 
      CLR   RECEIVE               
;检测50ms 内有没有编码接收            
      MOV   3AH,#55               
REMOTEA:                              
      MOV   3BH,#250               
REMOTEB:                              
      JB      REM,REMOTE0             ;有码发送则跳转
      DJNZ    3BH,REMOTEB            
      DJNZ    3AH,REMOTEA            
REMOTE_END_1:                           
      CLR   ENABLE_DETE            
REMOTE_END:                           
      CLR   REMOTING                ;清除探头检测标志
      RET                           
REMOTE0:                              
      JB      ENABLE_DETE,REMOTE_END_1;按键没有放开则返回
REMOTES:
      MOV   34H,#12               ;接收12位编码
;解码                                 ;
;先找出接收码的开头即10ms 左右的高电平;
;设置高电平时间为8~12ms               ;
;检测和等待8ms 的低电平,70ms门限      ;
      CLR   T_OVER                  
      MOV   TH1,#00H               
      MOV   TL1,#00H               
      SETB    TR1                     
REMOTE1:                              
      MOV   3AH,#50               
REMOTE2:                              
      MOV   3BH,#25               
REMOTE3:                              
      JB      REM,REMOTE1            
      JB      T_OVER,REMOTE_END      
      DJNZ    3BH,REMOTE3            
      DJNZ    3AH,REMOTE2            
                                       
;等待在4ms 内接收到的高电平            
      CLR   T_OVER                  
      MOV   TH1,#0F1H               
      MOV   TL1,#0F0H               
      SETB    TR1                     
REMOTE_4:                              
      JB      T_OVER,REMOTE_5         
      JNB   REM,REMOTE_4            
      CLR   TR1                     
      AJMP    REMOTE6               
;超出12ms 接收错误返回                  
REMOTE_5:                              
      AJMP    REMOTE_END            
REMOTE6:                              
;等待550us 后采集接收信号               
      MOV   3AH,#00               
      DJNZ    3AH,$                  
;采集接收信号并记录                     
      MOV   C,REM                  
      MOV   A,33H                  
      RLC   A                     
      MOV   33H,A                  
      MOV   A,31H                  
      RLC   A                     
      MOV   31H,A                  
;等待第二个上升沿,限时1.5ms             ;
      CLR   T_OVER                  
      MOV   TH1,#0FAH               
      MOV   TL1,#099H               
      SETB    TR1                     
RM1:    JB      T_OVER,REMOTE_END      
      JB      REM,RM1               
      CLR   TR1                     
                                       
      CLR   T_OVER                  
      MOV   TH1,#0FAH               
      MOV   TL1,#099H               
      SETB    TR1                  
RM2:    JB      T_OVER,REMOTE_END      
      JNB   REM,RM2               
      CLR   TR1                     
;等待550us 后采集接收信号            
      MOV   3AH,#00               
      DJNZ    3AH,$                  
      MOV   C,REM                  
      MOV   A,30H                  
      RLC   A                     
      MOV   30H,A                  
      MOV   A,32H                  
      RLC   A                     
      MOV   32H,A                  
;等待第二个码值的上升沿               
      CLR   T_OVER                  
      MOV   TH1,#0FAH               
      MOV   TL1,#099H               
      SETB    TR1                     
RM3:    JB      T_OVER,RM5            
      JB      REM,RM3               
      CLR   TR1                     
                                       
      CLR   T_OVER                  
      MOV   TH1,#0FAH               
      MOV   TL1,#099H               
      SETB    TR1                     
RM4:    JB      T_OVER,RM5            
      JNB   REM,RM4               
      CLR   TR1                     
      DJNZ    34H,REMOTE6            
;把接收的编码左移4 位将8 位密码放在同一字节上
      MOV   34H,#4                  
      AJMP    REMOTE7               
RM5:    AJMP    REMOTE_END            
REMOTE7:                              
      CLR   C                     
      MOV   A,33H                  
      RLC   A                     
      MOV   33H,A                  
      MOV   A,31H                  
      RLC   A                     
      MOV   31H,A                  
      CLR   C                     
      MOV   A,30H                  
      RLC   A                     
      MOV   30H,A                  
      MOV   A,32H                  
      RLC   A                     
      MOV   32H,A                  
      DJNZ    34H,REMOTE7            
;把4 位数据编码由高4 位移到低4 位上   ;
      MOV   A,33H                  
      SWAP    A                     
      MOV   33H,A                  
      MOV   A,30H                  
      SWAP    A                     
      MOV   30H,A                  
      SETB    ENABLE_DETE            
      SETB    RECEIVE               
                                       
      AJMP    REMOTE_END_1

hzyhscm 发表于 2009-9-8 21:15:22

PT2272参考解码软件2007-01-06 10:11三、参考解码软件



    说明:ADD1,ADD2中为8位地址,DAT0中为4位数据





REMOTE: CLR   TR2                     ;探头信号检测子程序



      CLR   RECEIVE               ;



      MOV   DETE_LOOP,#12         ;接收12位编码



REMO0:CLR   DETE_T_OVER             ;



      MOV   TH2,#0FEH               ;测第1位电平宽度



      MOV   TL2,#041H               ;      



      SETB    TR2                     ;



REMO1:JB      REM,REMO2               ;等待出现高电平



      JB      DETE_T_OVER,REMO3       ;限时1500us,超时则认为误码



      AJMP    REMO1                   ;



REMO2:MOV   A,TH2                   ;测低电平宽度,0FF为宽脉冲,0FE为窄脉冲



      CJNE    A,#0FFH,REMO4         ;



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#098H,$+3             ;



      JNC   REMO3                   ;电平过宽(超过1150us),退出



      CLR   C                     ;



      CJNE    A,#020H,$+3             ;



      JC      REMO3                   ;电平过窄(小于780us),退出



      SETB    C                     ;



      AJMP    REMO5                   ;



REMO3:AJMP    REMOTE_END            ;



REMO4:CJNE    A,#0FEH,REMO3         ;



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#0C7H,$+3             ;



      JNC   REMO3                   ;电平过宽(超过450us),退出



      CLR   C                     ;



      CJNE    A,#060H,$+3             ;



      JC      REMO3                   ;电平过窄(小于210us),退出



      CLR   C                     ;



REMO5:MOV   A,DAT0                  ;存储电平值



      RLC   A                     ;



      MOV   DAT0,A                  ;



      MOV   A,ADD1                  ;



      RLC   A                     ;



      MOV   ADD1,A                   ;



REMO6:JNB   REM,REMO7               ;等待出现低电平



      JB      DETE_T_OVER,REMO3      ;脉冲下降沿间隔限时1500us,超时则认为误码



      AJMP    REMO6                   ;



REMO7:CLR   TR2                     ;



      CLR   DETE_T_OVER             ;



      MOV   A,TH2                   ;



      CJNE    A,#0FFH,REM13         ;脉冲间隔过小



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#050H,$+3             ;



      JC      REM13                   ;电平过窄(小于1200us),退出



      MOV   TH2,#0FEH               ;测第2位电平宽度



      MOV   TL2,#041H               ;      



      SETB    TR2                     ;



REM11:JB      REM,REM12               ;等待出现高电平



      JB      DETE_T_OVER,REM13       ;限时1500us,超时则认为误码



      AJMP    REM11                   ;



REM12:MOV   A,TH2                   ;测低电平宽度,0FE为宽脉冲,0FF为窄脉冲



      CJNE    A,#0FFH,REM14         ;



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#098H,$+3             ;



      JNC   REM13                   ;电平过宽(超过1100us),退出



      CLR   C                     ;



      CJNE    A,#020H,$+3             ;



      JC      REM13                   ;电平过窄(小于1000us),退出



      SETB    C                     ;



      AJMP    REM15                   ;



REM13:AJMP    REMOTE_END            ;



REM14:CJNE    A,#0FEH,REM13         ;



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#0C7H,$+3             ;



      JNC   REM13                   ;电平过宽(超过450us),退出



      CLR   C                     ;



      CJNE    A,#060H,$+3             ;



      JC      REM13                   ;电平过窄(小于210us),退出



      CLR   C                     ;



REM15:MOV   A,TEMP                  ;存储电平值



      RLC   A                     ;



      MOV   TEMP,A                  ;



      MOV   A,ADD2                  ;



      RLC   A                     ;



      MOV   ADD2,A                  ;



REM16:JNB   REM,REM18               ;等待出现低电平



      JB      DETE_T_OVER,REM13      ;脉冲下降沿间隔限时1500us,超时则认为误码



      AJMP    REM16                   ;   



REM17:AJMP    REMO0



REM18:CLR   TR2                     ;



      CLR   DETE_T_OVER             ;



      MOV   A,TH2



      CJNE    A,#0FFH,REM13         ;脉冲间隔过小



      MOV   A,TL2                   ;



      CLR   C                     ;



      CJNE    A,#050H,$+3             ;



      JC      REM13                   ;电平过窄(小于1200us),退出



      DJNZ    DETE_LOOP,REM17         ;



REM19:MOV   DETE_LOOP,#4            ;把接收的编码左移4位



REM20:CLR   C                     ;将8位密码放在同一字节上



      MOV   A,DAT0                  ;



      RLC   A                     ;



      MOV   DAT0,A                  ;



      MOV   A,ADD1                  ;



      RLC   A                     ;



      MOV   ADD1,A                  ;



      CLR   C                     ;



      MOV   A,TEMP                  ;



      RLC   A                     ;



      MOV   TEMP,A                  ;



      MOV   A,ADD2                  ;



      RLC   A                     ;



      MOV   ADD2,A                  ;



      DJNZ    DETE_LOOP,REM20         ;



;把4 位数据编码由高4 位移到低4 位上   ;



      MOV   A,DAT0                  ;



      SWAP    A                     ;



      MOV   DAT0,A                  ;



      MOV   A,TEMP                  ;



      SWAP    A                     ;



      MOV   TEMP,A                  ;



      ANL   DAT0,#0FH               ;



      SETB    RECEIVE               ;



REMOTE_END:                           ;



      CLR   TR2



      CLR   REMOTING                ;



      RET                           ;

四、硬件抗干扰

   在无线通讯中使用单片机会对通讯系统造成严重的干扰,相信许多技术人员一定有过同样的苦恼。如果硬件设计不当,会造成原先硬件解码时通讯距离为200米,而用软件解码后可能只有十几米,因此解决硬件抗干扰问题在很大程度上可减少软件解码的误码率。

    1、收发模块:早期常用的频率为47MHz,在这种频率下,很难有好的解决方法;建议采用目前国家允许无线遥控使用的频率315 MHz;

    2、单片机振荡频率:大量的MCS51教材中推荐大家使用的是12 MHz及11.0592 MHz的晶体,这些晶体在一般场合使用没有问题,但在此却不可以,它们在300 MHz左右仍然能够产生较大的干扰,为解决单片机运行速度与电磁干扰的矛盾,建议采用频率为4 MHz或3.58 MHz的晶体。

    3、隔离:为了有效抑制单片机对接收模块的电磁干扰,建议采用①电源隔离;②端口隔离;端口隔离可采用三极管或比较器。实践表明,采用隔离的效果非常明显。

五、结束语

PT2262的软件解码在实际应用中有较好的用武之地。采用软件解码的系统,厂家再也无须对收发设备进行配套,以利于生产于保管;对客户来说,使用软件解码无须求助,厂家只须再软件中加入自动学习功能,用户可自行使用该功能,只须轻按学习键即可学习新的通讯设备,如遥控器等。

目前,该软件解码已经在某无线报警设备中采用,客户反映使用简便,效果良好。

参考:1、PT2262 PT2272 和P87LPC764 单片机的接口设计(广州周立功单片机);

fanren 发表于 2009-9-8 22:52:49

谁能不能发个带学习功能的贴子?

googse 发表于 2009-9-9 09:06:42

mark

deepin 发表于 2009-9-9 11:30:43

MARK

wfbaaa 发表于 2009-9-9 18:01:56

好好看看,认真学习一下

fuliaokai 发表于 2009-9-9 21:46:35

认真看看

yu_studio 发表于 2009-9-9 22:01:15

先顶再看

shangxf 发表于 2009-9-9 22:20:50

看看

jetlzd 发表于 2009-9-10 16:53:04

To ivws:

    你好,将PT2262的码采用0或1,用ICCAVR编译解码是成功的,但还有一些小问题不清楚。
    之前楼主也说是通过示波器确定宽脉冲为960us左右的,从而定义对各个合法波形的时间计数。在估算这个计数时,不知道楼主是不是用
AVR Studio进行调试的!?我在用AVR Studio V4.16 对COF文件调试时,发现程序跑得不对。程序整个是上面的,调试时F11一下下按,
在下面循环;   
(1) PORTD=0B00000000;               //输出显示
(2) 倒数第二个括号(即主函数的while(1)的收括号)
(3) DATA =decode();                      //解码程序
(4) unsigned long decode(void)               //无线解码
(5) void main(void)
   ...
(1) PORTD=0B00000000;               //输出显示   
从(1)回到(5),一直循环。好像根本没跑decode函数。但直接将程序上硬件却一点问题没有。
无论是我将decode()中的"while (PINC&(1<<4))"改成"while(1)"也一样不成。
希望ivws老大在AVR Studio上再跑跑这段程序的COF,看看是啥子原因整成这样的。如果你用的AVR Studio没问题,那么请把你的版本告诉我,
我去下个再试试。感谢!

tianyuwei 发表于 2009-9-10 17:10:40

mark

ivws 发表于 2009-9-10 17:11:20

这是是完整的项目文件! ICCAVR 的

点击此处下载 ourdev_479491.rar(文件大小:22K) (原文件名:PT2272.rar)

psocfans 发表于 2009-9-11 08:49:37

jetlzd 发表于 2009-9-11 09:24:33

楼主的项目在我这打不开啊。
而且我看了你的PT2272.c,好像是一样的啊。
实在不解!
http://cache.amobbs.com/bbs_upload782111/files_18/ourdev_479627.jpg
项目打不开 (原文件名:Snap2.jpg)

jetlzd 发表于 2009-9-11 09:27:39

这是我的项目包。

点击此处下载 ourdev_479629.rar(文件大小:19K) (原文件名:ivws.rar)

jetlzd 发表于 2009-9-18 15:28:47

楼主可不可以把你的那个RF的发射与接收模块电路共享一下!?
jetlzd@126.com

51hubao 发表于 2009-9-20 13:42:05

mark1

shamork 发表于 2009-10-13 00:21:44

http://www.dianyuan.com/bbs/d/58/198344.html
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3447443&bbs_page_no=1&search_mode=4&search_text=cqgxh&bbs_id=9999
mark
//************************PT2262三态解码程序****************************//                  

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//同步头引导低电平4mS~5mS;即震荡电阻为150K;                           //
//三态地址共6561个地址设置;                                             //
//通常的单片机软件解码地址码为0或1,没有悬空(高阻)状态,地址只有256个;//
//解码原理:使用PIC单片机的电平变化中断功能来捕捉功能判断脉冲宽度;      //
//特点:解码稳定可靠,抗干扰强。                                        //
//作者:   cqgxh@163.com   2009-7-10 于重庆                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


/**************************************************************************************
   
      16F690
                                    __   __
                     +5V      VDD||_||VSS       GND    (地 )
                     osc20M    OSC1|       |AN0                  
                     osc20M    OSC2|       |AN1                  
                           RA3/MCLR|       |AN2       IR   (遥控)
                               PORTC5|       |PORTC0               
                               PORTC4|       |PORTC1               
                               PORTC3|       |PORTC2               
                               PORTC6|       |RB4                  
                               PORTC7|       |RB5/RX               
                               RB7/TX|_______|RB6                  
                                       
      2009-7-10 10:05:55   CQGXH@163.COM

***************************************************************************************/
                                                                                                         
#include <pic.h>
#include <stdio.h>
                                                                                          
__CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTDIS);                                             
                                                                                                         
                                                                                                         
#define IR RA2                               //定义遥控信号输入端

                                                                                                         
#define uchar unsigned char                  //缩写                                                                     
#define uint unsigned int                  //缩写                                                            

bank2    bitlock;
bank2ucharOUT;
bank2uint   add_set;
bank2uchari,k,j,t2data;
bank2ucharirdata;
bank2uint   iradd;                                                                                                            
bank2uchara;

const uchar add_Tab={2,2,2,2,2,2,2,2} ;   //设置地址码;0==低电平;1==高电平;2==悬空(高阻);
                                             //共计6561个地址状态
                                             //                                                            
                                                                  
//函数声明                                                                                                

void cos_js();
void add_3();            
void interrupt IRQ(void);                  //中断处理
                                                                                                         
main(void)                                                                                                
{                                                                                                         
    TRISA0=0;
    TRISA2=1;
    ANSEL=0x00;                      //关闭模拟量输入                                          
    ANSELH=0x00;
   
    RABPU=0x00;                      //全局上拉使能
    WPUA=0x04;                     //RA2上拉
    //Timer0初始化设置
    PSA=0;                           //Timer0 使用预分频器
    PS0=0;PS1=1;PS2=1;               //Timer0选择分频率为1:128                  
    T0CS=0;                        //外部时钟定时方式

    IOCA2=1;                     //开启RA2电平中断
    RABIE=1;                     //开启RAB口电平变化中断                                                                                                
    PEIE   =1;                     //PEIE:外设中断允许位1 = 允许所有未屏蔽的外设中断 0 = 禁止所有的外设中断   
    GIE    =1;                     //GIE:全局中断允许位 1 = 允许所有未屏蔽的中断 0 = 禁止所有中断         

    add_3();                         //计算设置的地址码
         
    while(1)                         //循环等待中断                                                      
      {                                                                                                   
       NOP();
       ;                                                                              
      }                                                                                             
}         


//解码地址3进制计算
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
}
                                                                                                                                                                                                                                                                                                                     
void interrupt IRQ(void)      //中断函数                                                   
{                                                                                                         
   
if(RABIF&&RABIE&&IOCA2)   //RA2电平变化中断解码PT2262;
   {   
//    RABIF=0;
    t2data=TMR0;
    TMR0=0X00;
   
   if((lock==0)&&IR)
    {
      if(t2data>0x9f)    //0x9f大于4.08mS;实际同步头低电平脉宽4280uS ( 25.6uS*0xa7) ;3.2mS(0x7D)
       {
          if(t2data<0xc5)//0xaf小于4.48mS;0xc5=5043US
            {
             j=0;
             k=0;         
             lock=1;
            }
      }
    }

    if(lock&&(IR==0))
      {
       if(t2data<0x09)          //窄脉冲识别
                              //0x6小于153.6uS ;实际脉宽135uS~144US
         {                                 
         if(t2data>0x02)      //0x4大于102.4uS
             {
             a=0;
             j++;
             }
         else j=0;            
          }
      if(t2data>0x0d)         //宽脉冲识别
                              //0x0f大于384uS ;实际脉宽405uS 或0x11=432US
      {                                 
          if(t2data<0x18)       //0x12小于460.8uS;0x14=512uS;
         {
             a=1;j++;
          }
         else j=0;
      }
      
   if(j==24)               //数据接收完毕,进行译码处理   
       {
      lock=0;
      j=0;
            
      for(i=0;i<24;i+=2)
          {
          if((a==0)&(a==0)){a=0;j++;}    //两个都是窄脉冲为0
          else if(a&a){a=1;j++;}         //前窄后宽为1
          else if((a==0)&a){a=2;j++;}    //前宽后窄为2
          else break;
         }
         
         for(iradd=0,i=0;i<8;i++)
         {
            iradd=iradd*3+a;
         }
         
         for(irdata=0,i=8;i<12;i++)
         {
            irdata=(irdata<<1)+a;
         }

         if(iradd==add_set)
         {
            OUT=irdata;

         }      
         else if(iradd==0)
         {                              
             OUT=irdata^0x0f;
         }
         else OUT=0;      
       }
    }
    RABIF=0;   //清中断标志,过早清除易产生错误
   }            //电平变化中断处理结束
}

laolu 发表于 2009-10-13 00:38:02

楼主用的什么接收模块?没杂波吗?
我现在用的接收模块一直收到好多杂波,不知道怎么下手了。(发射是EV1527,跟2262差不多的东东)

lin135 发表于 2009-10-13 08:39:16

相信我这个是最短的接收程序了吧。不过不是2262的格式。是红外遥控器NEC的格式
;;----------------------------------------------;;
ir_receive:                                     ;;
      add8    pcl,ir_receive_count
      jmp   ir_receive_begin
      jmp   ir_receive_low_9ms
      jmp   ir_receive_high_4m5s
      jmp   ir_receive_data_start_560us   
      jmp   ir_receive_data_bit_time   
      jmp   ir_receive_data_stop_bit_560us
      jmp   ir_receive_long_test_108ms
      jmp   ir_receive_long_low_9ms
      jmp   ir_receive_long_high_2m5s
      jmp   ir_receive_data_stop_bit_560us
;;----------------------------------------------;;
ir_receive_begin:                               ;;
      b0bts0io_rf_in                        ;;
      ret
      clr   ir_receive_32bit_count
      clr   ir_receive_tim
      incms   ir_receive_count
      ret
;;----------------------------------------------;;
ir_receive_low_9ms:
      bts1    io_rf_in
      ret
      dayu8   ir_receive_tim,#7000/50
      jmp   ir_receive_erro
      siaoyu8 ir_receive_tim,#11000/50
      jmp   ir_receive_erro
      clr   ir_receive_tim
      incms   ir_receive_count
      ret
;;----------------------------------------------;;
ir_receive_high_4m5s:
      bts0    io_rf_in
      ret
      dayu8   ir_receive_tim,#3500/50
      jmp   ir_receive_erro
      siaoyu8 ir_receive_tim,#5500/50
      jmp   ir_receive_erro
      clr   ir_receive_tim
      incms   ir_receive_count
      ret
;;----------------------------------------------;;
ir_receive_data_start_560us:
      bts1    io_rf_in
      ret
      clr   ir_receive_tim
      incms   ir_receive_count
      ret
;;----------------------------------------------;;
ir_receive_data_bit_time:
      bts0    io_rf_in
      ret
      dayu8   ir_receive_tim,#100/50         ;;大于300us
      jmp   ir_receive_erro         
      siaoyu8 ir_receive_tim,#2500/50      ;;小于2000us
      jmp   ir_receive_erro

      mov   a,ir_receive_tim
      sub   a,#1000/50
      rrcm    ir_receive_data_n
      rrcm    ir_receive_data_p
      rrcm    ir_receive_addr_l               ;;将结果移入接收数据寄存器
      rrcm    ir_receive_addr_h

      decms   ir_receive_count
;;----------------------------------------------;;
      into    ir_receive_32bit_count,#32
      ret      
      mov   a,ir_receive_data_n             ;;
      xor   a,#11111111b                  ;;取反数据
      cmprs   a,ir_receive_data_p             ;;比较反码
      jmp   ir_receive_erro               ;;反码不对跳去错误码处理
      
      mov8    ir_receive_code,ir_receive_data_p
      bset    f_ir_receive_first_ok         ;;置上第1次(短按)成功
      clr   ir_receive_tim
      add8    ir_receive_count,#2
      ret
;;----------------------------------------------;;
ir_receive_data_stop_bit_560us:
      bts1    io_rf_in
      ret
      clr   ir_receive_tim
      incms   ir_receive_count
      ret
;;----------------------------------------------;;
ir_receive_long_test_108ms:
      bts1    io_rf_in
      jmp   @f
      dayu8   ir_receive_tim,#120             ;;间隔小于120ms
      ret
      jmp   ir_receive_erro
@@:
      dayu8   ir_receive_long_tim,#25         ;;间隔大于25ms
      jmp   ir_receive_erro
      incms   ir_receive_count
      clr   ir_receive_tim
      ret

michael757 发表于 2009-10-13 09:43:28

mark!

hy317 发表于 2009-10-13 09:47:14

mark!

beipan1982 发表于 2009-10-15 13:55:41

收藏学习

yangdilove 发表于 2009-10-27 09:21:42

绝对收藏

jydq 发表于 2009-10-27 10:57:37

学习了。

Mr_HU 发表于 2009-11-29 18:18:14

请问楼主我要用c51单片机来解码怎样写???

cnzhy88 发表于 2009-11-29 20:45:34

顶..收藏了.

118139 发表于 2009-11-30 21:06:06

我用安阳新世纪的2款超外差接收模块,做无线数据接收,每一次是发送8字节数据,显示是数码管扫描显示

第一款是无噪声接收模块--J05R ,接收端还原的信号是方波,但是,是不够正的方波,边缘有点歪斜。。

http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_509219.jpg
(原文件名:1a.jpg)


板上带有滤波芯片,无噪声输出,无信号时,输出口保持低电平,无干扰信号

不影响数码管扫描显示,显示非常稳定 ,只是带滤波后该模块接收响应速度比较慢,操作说明书写着该模块的接收开启时间是10ms

相当于起始码就要不断发送10ms以后 才开始切入正题。。否则就接收不正确。而且每位高低电平的宽度也要设得长一些,我是曼码发送,每位

电平时间是高350us低350us ,如果再快一点比如200us,接收距离就会短一些,一次8字节64位数据加上起始10ms,同码码1ms,

再加上一些系统延时,接收到一次数据差不多要55-60ms,传输距离还可以,空旷地发射机放在地上,间隔2秒发送一次8节字数据,
估计有200米接收距离
如果发射机是放在1层楼的高度,那接收离稳定到400-500多米空旷地,发射机7V-8v供电..

缺点:灵敏度不是非常非常的高,接收开启时间要等很久,每位曼码发送的脉宽间隔要设得长一些些。。





第二款:灵敏度超高---J05P,有噪声,但是接收到的信号还原后是真正的90度直角方波,最适合单片机做时间计算识别,不像其它模块很多都是梯形波,
也买了20多元的那些超外差3300,3400的芯片,都是梯形波,而且都没这款识接收效果好。。

<http://cache.amobbs.com/bbs_upload782111/files_22/ourdev_509220.JPG
(原文件名:4.JPG)

无信号时,噪声不断,但就因为这样才让接收信号有超高的灵敏度

接收无需等待,即发即收

曼码发送每位100us高电平,100us低电平 高速度,也能够灵敏接收到全部数据

最后也改成每位 高350us低350us发送 ,接收距离更远,每隔2秒发送一次,接收端几乎没有错过接收



在空旷地做测试,同样的把发射机放在1层楼的高度2米多高发射,由这台来接收

结果接收距离,我也不知道有多远,超出目测范围,远了看不到人了。。



最后选用这款,缺点是噪声太多,会影响数码码显示,使数码管8个段脚的亮度会出现有明有暗不均匀的显示
而且显示明暗不稳定,最后把每位数码显示扫描时间由3ms改为 900us后,基本达到使用要求,亮度不再不均匀
只是比较暗一点。。
但是如果噪声太大的话,还是会影响到数码管显示,不过只要一会儿就会恢复稳定。

hebj 发表于 2009-11-30 21:17:28

这贴子不错,以后好好看看。

yunqian09 发表于 2009-12-1 10:30:34

标记

zenglong 发表于 2009-12-1 11:35:26

我照上面的方法做了一块,接收距离很不理想,不带天线,也就半米之内,不知道那里可能出错

Mr_HU 发表于 2009-12-1 19:57:21

请问楼主,,,怎样用8051单片机解码???

chengpiaopiao 发表于 2009-12-3 18:31:42

【140楼】 Mr HU 胡~~
积分:18
派别:
等级:------
来自:广东中山
请问楼主,,,怎样用8051单片机解码???
------------------------------------------------------------------------------------------------

同问

Mr_HU 发表于 2009-12-6 19:13:29

请教楼主~~~怎样将他转成c51

aduc812 发表于 2009-12-7 09:31:04

记下

51dz 发表于 2009-12-13 00:02:52

我的解码程序是用汇编写的,也没有用中断,C我看不懂。

maomaofu 发表于 2009-12-13 12:59:36

不错,标记一下

zhangjw 发表于 2009-12-13 17:09:40

mark.

fxhfxh 发表于 2010-1-12 03:08:49

mark.

10086 发表于 2010-1-26 11:12:15

标记

wkxu 发表于 2010-1-26 16:31:49

mark

gxy508 发表于 2010-1-26 16:43:40

mark

yishuangwu 发表于 2010-2-4 14:43:42

楼主,你好!
我想问下能否用51的单片机实现解码,我用的晶振是500K的。
i=0;                                 //宽度计数
while (PINC&(1<<4))         //高位计数
{      
asm("nop");         //
i++;                  //计数增加                        
if (i>192) goto end;//限时解码
}

while里面的时间应该怎么去计算,这个就是由于指令周期的执行时间来决定的。
能留下你邮箱吗?我的邮箱是ysw925@163.com

hnhxk2983 发表于 2010-2-27 11:33:56

LZ程序在第二个WHile(1)里面可以出来吗?????

zd305 发表于 2010-2-27 12:11:23

mark!

tangwei039 发表于 2010-2-27 12:36:36

神奇

hongyancl 发表于 2010-2-27 13:42:31

haio

ivws 发表于 2010-4-1 23:00:45

回复【152楼】hnhxk2983
LZ程序在第二个WHile(1)里面可以出来吗?????
-----------------------------------------------------------------------

可以的,量产的产品就是用这个方法解码的!

hjian508 发表于 2010-4-1 23:37:01

mark

whlx622 发表于 2010-4-2 15:42:54

make

gdmfq 发表于 2010-4-2 17:36:14

SDM顶

xiaolei0428 发表于 2010-4-3 20:34:02

mark

dgdjfw 发表于 2010-4-4 14:00:02

这个有意思

hongyao 发表于 2010-4-4 14:16:47

mark

ripplexu 发表于 2010-4-4 14:29:51

用定时中断,绝对比你这个省资源。程序也不复杂,主要是逻辑比较复杂。

ripplexu 发表于 2010-4-4 14:30:40

怎么可能专门用一个单片机去做遥控接收呢?

a13736925316 发表于 2010-5-3 12:14:55

将他移植到PIC后,距离变的只有十来米!!!

guxingganyue 发表于 2010-7-8 22:57:18

mark

kangar0065 发表于 2010-7-8 23:55:59

jihao

zlj2008 发表于 2010-7-9 14:49:39

做个记号,不错

afrapei 发表于 2010-8-11 20:55:04

mark

netport 发表于 2010-8-12 00:25:40

假如用这个收码,然后用串口发到计算机用软件高速解码的话,有没有可能实现无线码万能破解器?破解的范围只限制于计算机的速度和软件的好坏?

jack_yu 发表于 2010-8-12 00:32:33

mark!

lghtjpu 发表于 2010-8-12 09:05:46

mark

xidongs 发表于 2010-8-12 09:20:41

我看过楼主的文章,但是综合所有的应用,觉得准确度不够,容易误码,所以最终还是选择了定时器解码。

dgdjfw 发表于 2010-8-13 17:09:49

顶,收藏研究一下再说

wt19891211 发表于 2010-8-30 15:15:49

标记了。。。

icer1 发表于 2010-9-2 09:27:28

标记备用

xxsc118 发表于 2010-9-3 23:08:49

学习了,谢谢!

adszmc 发表于 2010-9-3 23:29:22

标记

guxingganyue 发表于 2010-9-4 09:13:05

mark

forever_wzx 发表于 2010-9-4 21:05:16

mark

shanyao 发表于 2010-9-13 16:00:26

顶!!!!!!!!!!!!!!!

xtaens 发表于 2010-9-29 20:24:09

mark

oldmen 发表于 2010-9-29 21:03:22

标记

pjdu 发表于 2010-9-30 09:43:23

mark

bondxie3 发表于 2010-10-7 13:26:33

标记学习

haowei236 发表于 2010-10-15 12:41:59

mark

SeaSun 发表于 2010-11-9 14:55:24

LZ,顶死你,哈哈.
正好有个连定时器都没有的MCU, 您的出现给予偶莫大的信心!

jackielau 发表于 2010-11-9 15:38:25

mark

zlj2008 发表于 2010-11-10 21:44:26

做个记号

muzheyun 发表于 2010-12-6 20:52:44

mark!

castlehu 发表于 2010-12-6 21:51:00

mark

zyw19987 发表于 2010-12-14 17:13:27

正要用,呵呵谢谢楼主,谢谢阿莫,谢谢党和人民。

lyr0710 发表于 2010-12-23 22:18:07

mark

guxingganyue 发表于 2010-12-29 16:27:27

楼主大哥还在不,,我正在移植你的程序到atmega48上,,但你的程序我有点看不懂

能指点一下吗

1、同步头检测的语句在那里呢,,怎么保证按一次按键,只解码一次呢

2、那里面的常数怎么确定呢,,即使用示波器看后,也不好确定啊,,我用的是7.3728m的外部晶振

波形图如下:

http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_607889A1EV00.jpg
(原文件名:照片1767.jpg)

LBQ691477940 发表于 2011-2-13 21:52:15

楼主能否改为89S52上面用的程序呀?谢谢

udc577 发表于 2011-4-21 17:02:32

这个帖必须顶!

zxs115523805 发表于 2011-5-10 00:49:18

MARK

Automaticc 发表于 2011-5-13 10:30:24

先mark一下啊,抽空看看

ledatou 发表于 2011-5-13 11:42:03

学习了!

iam35200 发表于 2011-5-13 11:47:40

不错的贴子,一定要顶!!
页: 1 [2] 3
查看完整版本: 最精间的PT2262解码程序与大家共享