PT2262软件解码程序

PT2262软件解码程序

我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。


(原文件名:2272.JPG) 

#include <iom8v.h>
#include <macros.h>

void delay_ms(void)                         //毫秒延时 
{    
     unsigned int i;
     for (i=0;i<140;i++) 
          {
          }
}

void delay_nms(unsigned int n)              //延时周期
{
     unsigned int i;
     for (i=0;i<n;i++)
          {
           delay_ms();
          }
}

void spaz(void)                             //响蜂鸣器
{
     PORTC|=(1<<5);                         
         delay_nms(50);                         
         PORTC&=~(1<<5);                          
}  

unsigned long decode(void)                 //无线解码
{
     unsigned long DATA;                    //记录数据
     unsigned char count,i;                 //暂时计数
         
/*一共接收三字节*/        
    
     DATA=0;                                //  
     for (count=0;count<24;count++)         //开始收集
          {
           
/*测量高电平宽度*/        

       i=0;                                 //宽度计数
           while (PINC&(1<<4))           //高位计数
            {       
                 asm("nop");           //
                 i++;                  //计数增加 
                                       
                 if (i>192) goto end;  //限时解码
                }                                   
                
/*分辨出电平高低*/                
       
          DATA*=2;                       //数据左移
                 
      if (i<64)                             //分辨高低 
           {    
            if (!((56>i)&(i>24))) goto end;     //电平合法                                
            DATA+=0;                            //记低电平
           }
           
          else
           {     
            if (!((168>i)&(i>72))) goto end;    //电平合法                                
            DATA+=1;                            //记高电平
           }
           
/*测量低电平宽度*/        
   
           while (!(PINC&(1<<4)))               //低位计数
            {       
                 asm("nop");                 //
                 i++;                        //计数增加 
                                       
                 if (i>224) goto end;        //限时解码
                }          
                
/*低电平是否过窄*/                
                 
           if (i<96) goto end;                  //对比宽度                                 
      }
         
/*解码成功返结果*/        
                                      
         return  DATA;                          //成功返回 
         
/*有误码结束解码*/         
         
     end:         
         return 0;                              //误码结束
}  

void main(void)
{
     unsigned long DATA;                    //
         unsigned char D[3];             // 
         signed char i;                  //  
    
     DDRB =0B00000000;                      //定义输入
     PORTB=0B11111111;                      //上拉使能
         
     DDRC =0B11101111;                      //输入通道
         PORTC=0B11011111;               //上拉选择
     
     DDRD =0B11111111;                      //定义输出
         PORTD=0B00000000;               //输出显示 
         
         while (1)
          {
           DATA =decode();                      //解码程序
           
           if (DATA>0)                          //
            {
             spaz();                            //解码成功
                 
                 for (i=2;i>=0;i--)                 //数据转换
                  { 
                   D=DATA;                       //
                   DATA>>=8;                        // 
                  }
                 
                 i=0;                               //转换完毕  
                 while (1)                          //输出显示   
                  {
                   if (!(PINB&(1<<0)))              //按键检查
                    {
                         delay_nms(20);                 //防误处理
                         if (!(PINB&(1<<0)))            //
                          {
                           i++;                         //显示值加
                           spaz();
                          }
                         while (!(PINB&(1<<0)))         //按键弹起
                          {
                           delay_nms(20);               //防误处理
                          }
                         } 
                   if (i>2) break;                  //
                   PORTD=D;                      //输出显示   
                  }
                }
          }
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值