搜索
bottom↓
楼主: ivws

最精间的PT2262解码程序与大家共享

  [复制链接]

出0入0汤圆

发表于 2009-9-3 08:24:01 | 显示全部楼层
以后肯定会用

出0入0汤圆

发表于 2009-9-7 08:54:44 | 显示全部楼层
mark,刚好要用到。以后参考一下,再评论。

出0入0汤圆

 楼主| 发表于 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
不知道楼主那些常数是如何得来的? 根据什么来估算正确的范围呢 ? 也望知情的兄弟解答一下,谢谢。  

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

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

出0入0汤圆

发表于 2009-9-8 16:48:09 | 显示全部楼层
To:ivws

  你好,我用示波器看到的波形的确也是宽波为960us,窄波的为320us。
  
  但现在我用AVR Sudio对COF文件进行调试时,我的程序一直没往解码函数跑,因为我已经将while (PINC&(1<<4))改成while(1)了。

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

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

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

出0入0汤圆

发表于 2009-9-8 16:50:06 | 显示全部楼层
对了,我用的芯片是Atmega48来的。
  用的是8M,然后内部8分频这样的。

出0入0汤圆

 楼主| 发表于 2009-9-8 16:55:23 | 显示全部楼层
我没有用CVAVR....

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

出0入0汤圆

发表于 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

1.开机画面 (原文件名:1.开机画面.jpg)


2.自动扫描画面 (原文件名:2.自动扫描画面.jpg)


3.查阅收录数据 (原文件名:3.查阅收录数据.jpg)


4.内部结构 (原文件名:4.内部结构1.jpg)


(原文件名:4.内部结构.jpg)

出0入0汤圆

发表于 2009-9-8 19:27:02 | 显示全部楼层
2262解码非常容易的,在产品程序中,仅仅等同于按键程序

出0入0汤圆

发表于 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

出0入0汤圆

发表于 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 单片机的接口设计(广州周立功单片机);

出0入0汤圆

发表于 2009-9-8 22:52:49 | 显示全部楼层
谁能不能发个带学习功能的贴子?

出0入0汤圆

发表于 2009-9-9 09:06:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-9 11:30:43 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-9-9 18:01:56 | 显示全部楼层
好好看看,认真学习一下

出0入0汤圆

发表于 2009-9-9 21:46:35 | 显示全部楼层
认真看看

出0入0汤圆

发表于 2009-9-9 22:01:15 | 显示全部楼层
先顶再看

出0入0汤圆

发表于 2009-9-9 22:20:50 | 显示全部楼层
看看

出0入0汤圆

发表于 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没问题,那么请把你的版本告诉我,
我去下个再试试。感谢!

出0入0汤圆

发表于 2009-9-10 17:10:40 | 显示全部楼层
mark

出0入0汤圆

 楼主| 发表于 2009-9-10 17:11:20 | 显示全部楼层
这是是完整的项目文件! ICCAVR 的

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

出0入0汤圆

发表于 2009-9-11 08:49:37 | 显示全部楼层

出0入0汤圆

发表于 2009-9-11 09:24:33 | 显示全部楼层
楼主的项目在我这打不开啊。
而且我看了你的PT2272.c,好像是一样的啊。
实在不解!

项目打不开 (原文件名:Snap2.jpg)

出0入0汤圆

发表于 2009-9-11 09:27:39 | 显示全部楼层
这是我的项目包。

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

出0入0汤圆

发表于 2009-9-18 15:28:47 | 显示全部楼层
楼主可不可以把你的那个RF的发射与接收模块电路共享一下!?
jetlzd@126.com

出0入0汤圆

发表于 2009-9-20 13:42:05 | 显示全部楼层
mark1

出0入0汤圆

发表于 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    bit  lock;
bank2  uchar  OUT;
bank2  uint   add_set;
bank2  uchar  i,k,j,t2data;
bank2  uchar  irdata;
bank2  uint   iradd;                                                                                                            
bank2  uchar  a[24];  

const uchar add_Tab[8]={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[j]=0;
             j++;
             }
           else j=0;            
          }  
      if(t2data>0x0d)           //宽脉冲识别
                                //0x0f大于384uS ;实际脉宽405uS 或0x11=432US
        {                                 
          if(t2data<0x18)       //0x12小于460.8uS;  0x14=512uS;
           {
             a[j]=1;j++;
          }
         else j=0;
        }
      
     if(j==24)                 //数据接收完毕,进行译码处理     
       {
        lock=0;
        j=0;
              
        for(i=0;i<24;i+=2)
          {
          if((a==0)&(a[i+1]==0)){a[j]=0;j++;}    //两个都是窄脉冲为0
          else if(a&a[i+1]){a[j]=1;j++;}         //前窄后宽为1
          else if((a==0)&a[i+1]){a[j]=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;     //清中断标志,过早清除易产生错误
   }              //电平变化中断处理结束
}

出0入0汤圆

发表于 2009-10-13 00:38:02 | 显示全部楼层
楼主用的什么接收模块?没杂波吗?
我现在用的接收模块一直收到好多杂波,不知道怎么下手了。(发射是EV1527,跟2262差不多的东东)

出0入0汤圆

发表于 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:                               ;;
        b0bts0  io_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

出0入0汤圆

发表于 2009-10-13 09:43:28 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-10-13 09:47:14 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-10-15 13:55:41 | 显示全部楼层
收藏学习

出0入0汤圆

发表于 2009-10-27 09:21:42 | 显示全部楼层
绝对收藏

出0入0汤圆

发表于 2009-10-27 10:57:37 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2009-11-29 18:18:14 | 显示全部楼层
请问楼主  我要用c51单片机来解码怎样写???

出0入0汤圆

发表于 2009-11-29 20:45:34 | 显示全部楼层
顶..收藏了.

出0入0汤圆

发表于 2009-11-30 21:06:06 | 显示全部楼层
我用安阳新世纪的2款超外差接收模块,做无线数据接收,每一次是发送8字节数据,显示是数码管扫描显示

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


(原文件名: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的芯片,都是梯形波,而且都没这款识接收效果好。。

<
(原文件名:4.JPG)

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

接收无需等待,即发即收

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

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



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

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



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

出0入0汤圆

发表于 2009-11-30 21:17:28 | 显示全部楼层
这贴子不错,以后好好看看。

出0入0汤圆

发表于 2009-12-1 10:30:34 | 显示全部楼层
标记

出0入0汤圆

发表于 2009-12-1 11:35:26 | 显示全部楼层
我照上面的方法做了一块,接收距离很不理想,不带天线,也就半米之内,不知道那里可能出错

出0入0汤圆

发表于 2009-12-1 19:57:21 | 显示全部楼层
请问楼主,,,怎样用8051单片机解码???

出0入0汤圆

发表于 2009-12-3 18:31:42 | 显示全部楼层
【140楼】 Mr HU 胡~~
积分:18
派别:
等级:------
来自:广东中山
请问楼主,,,怎样用8051单片机解码???  
------------------------------------------------------------------------------------------------

同问

出0入0汤圆

发表于 2009-12-6 19:13:29 | 显示全部楼层
请教楼主~~~怎样将他转成c51

出0入0汤圆

发表于 2009-12-7 09:31:04 | 显示全部楼层
记下

出0入0汤圆

发表于 2009-12-13 00:02:52 | 显示全部楼层
我的解码程序是用汇编写的,也没有用中断,C我看不懂。

出0入0汤圆

发表于 2009-12-13 12:59:36 | 显示全部楼层
不错,标记一下

出0入0汤圆

发表于 2009-12-13 17:09:40 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-1-12 03:08:49 | 显示全部楼层
mark.

出0入0汤圆

发表于 2010-1-26 11:12:15 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-1-26 16:31:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-26 16:43:40 | 显示全部楼层
mark

出0入0汤圆

发表于 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

出0入0汤圆

发表于 2010-2-27 11:33:56 | 显示全部楼层
LZ程序在第二个WHile(1)里面可以出来吗?????

出0入0汤圆

发表于 2010-2-27 12:11:23 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-2-27 12:36:36 | 显示全部楼层
神奇

出0入0汤圆

发表于 2010-2-27 13:42:31 | 显示全部楼层
haio

出0入0汤圆

 楼主| 发表于 2010-4-1 23:00:45 | 显示全部楼层
回复【152楼】hnhxk2983
LZ程序在第二个WHile(1)里面可以出来吗?????
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-4-1 23:37:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-2 15:42:54 | 显示全部楼层
make

出0入0汤圆

发表于 2010-4-2 17:36:14 | 显示全部楼层
SDM顶

出0入0汤圆

发表于 2010-4-3 20:34:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-4 14:00:02 | 显示全部楼层
这个有意思

出0入0汤圆

发表于 2010-4-4 14:16:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-4 14:29:51 | 显示全部楼层
用定时中断,绝对比你这个省资源。程序也不复杂,主要是逻辑比较复杂。

出0入0汤圆

发表于 2010-4-4 14:30:40 | 显示全部楼层
怎么可能专门用一个单片机去做遥控接收呢?

出0入0汤圆

发表于 2010-5-3 12:14:55 | 显示全部楼层
将他移植到PIC后,距离变的只有十来米!!!

出0入0汤圆

发表于 2010-7-8 22:57:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-8 23:55:59 | 显示全部楼层
jihao

出0入0汤圆

发表于 2010-7-9 14:49:39 | 显示全部楼层
做个记号,不错

出0入0汤圆

发表于 2010-8-11 20:55:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-12 00:25:40 | 显示全部楼层
假如用这个收码,然后用串口发到计算机用软件高速解码的话,有没有可能实现无线码万能破解器?破解的范围只限制于计算机的速度和软件的好坏?

出0入0汤圆

发表于 2010-8-12 00:32:33 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-8-12 09:05:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-12 09:20:41 | 显示全部楼层
我看过楼主的文章,但是综合所有的应用,觉得准确度不够,容易误码,所以最终还是选择了定时器解码。

出0入0汤圆

发表于 2010-8-13 17:09:49 | 显示全部楼层
顶,收藏研究一下再说

出0入0汤圆

发表于 2010-8-30 15:15:49 | 显示全部楼层
标记了。。。

出0入0汤圆

发表于 2010-9-2 09:27:28 | 显示全部楼层
标记备用

出0入0汤圆

发表于 2010-9-3 23:08:49 | 显示全部楼层
学习了,谢谢!

出0入0汤圆

发表于 2010-9-3 23:29:22 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-9-4 09:13:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-4 21:05:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-13 16:00:26 | 显示全部楼层
顶!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2010-9-29 20:24:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-29 21:03:22 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-9-30 09:43:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-7 13:26:33 | 显示全部楼层
标记学习

出0入0汤圆

发表于 2010-10-15 12:41:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-9 14:55:24 | 显示全部楼层
LZ,顶死你,哈哈.
正好有个连定时器都没有的MCU, 您的出现给予偶莫大的信心!

出0入0汤圆

发表于 2010-11-9 15:38:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-10 21:44:26 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2010-12-6 20:52:44 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-12-6 21:51:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-14 17:13:27 | 显示全部楼层
正要用,呵呵谢谢楼主,谢谢阿莫,谢谢党和人民。

出0入0汤圆

发表于 2010-12-23 22:18:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-29 16:27:27 | 显示全部楼层
楼主大哥还在不,,我正在移植你的程序到atmega48上,,但你的程序我有点看不懂

能指点一下吗

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

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

波形图如下:


(原文件名:照片1767.jpg)

出0入0汤圆

发表于 2011-2-13 21:52:15 | 显示全部楼层
楼主能否改为89S52上面用的程序呀?谢谢

出0入0汤圆

发表于 2011-4-21 17:02:32 | 显示全部楼层
这个帖必须顶!

出0入0汤圆

发表于 2011-5-10 00:49:18 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-5-13 10:30:24 | 显示全部楼层
先mark一下啊,抽空看看

出0入0汤圆

发表于 2011-5-13 11:42:03 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-5-13 11:47:40 | 显示全部楼层
不错的贴子,一定要顶!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 06:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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