cqgxh 发表于 2009-7-10 11:27:29

用PIC对PT2262进行三态解码(6561个地址),地址码设置方便。

通常的单片机软件解码地址码为0或1,没有悬空(高阻)状态,地址只有256个,

解码原理:使用PIC单片机的电平变化中断功能来捕捉功能判断脉冲宽度,
          三态地址共6561个地址设置;
特点:    解码稳定可靠,抗干扰强。

cqgxh 发表于 2009-7-10 11:28:18

已经删除

zhxzhx 发表于 2009-7-19 20:15:04

为什么删除?

cqgxh 发表于 2009-7-27 13:55:08

//************************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;          //清中断标志,过早清除易产生错误
   }            //电平变化中断处理结束
}

32446975 发表于 2009-8-11 08:56:43

正是我需要的,收下了。谢谢!打算移植到类似PIC10F222的小体积芯片上。解码器的整体体积就可以做的很小。

better_maker 发表于 2009-8-13 19:34:50

请问你在电平变化中断中,为什么要用t2data=TMR0;
这一句勒?还有为什么程序一开始就调用
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
}

cqgxh 发表于 2009-8-14 17:21:09

t2data=TMR0
脉冲宽度记录用的TMR0;
void add_3()
{
uchar i;
for(i=0;i<8;i++)
{
add_set=add_set*3+add_Tab;
}
}
是设置的地址码三进制计算,对应PT2262的设置;

可以修改以下地址码表对应PT2262的设置
const uchar add_Tab={2,2,2,2,2,2,2,2} ;   //设置地址码;0==低电平;1==高电平;2==悬空(高阻);
                                             //共计6561个地址状态
                                             //

liupeng9181 发表于 2009-9-8 16:03:04

谢谢

zyw19987 发表于 2010-12-15 11:50:52

amity 发表于 2010-12-16 08:13:29

好吔

heero 发表于 2010-12-16 08:20:08

好吔

anxiangbo 发表于 2010-12-16 08:41:39

记号

cwl0580 发表于 2010-12-17 15:02:21

更正你的注释:
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;
         }

Xuedong 发表于 2010-12-23 16:44:04

标记备用!

hubeilcsun3 发表于 2010-12-24 16:14:00

标记

muzheyun 发表于 2011-1-24 21:50:32

mark

zgmzgm 发表于 2011-9-5 00:14:15

谢谢,正需要这个!

yoyobbs 发表于 2011-9-5 11:18:50

mark

dfzcx 发表于 2013-9-30 17:42:58

谢谢,正在学习2262解码

wsm80828 发表于 2013-9-30 19:44:06

这个可以有

qqliyunpeng 发表于 2013-10-1 22:37:32

用的 是哪款单片机呢

n0831 发表于 2013-11-12 20:36:11

标记,备用

ndust 发表于 2013-11-13 09:25:14

不错不错,学习了。
页: [1]
查看完整版本: 用PIC对PT2262进行三态解码(6561个地址),地址码设置方便。