社区导航

 

搜索
查看: 5887|回复: 1

[讨论] 最精尖的PT2262解码程序与大家共享

[复制链接]

6108

TA的帖子

19

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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


  1. #include
  2. #include

  3. void delay_ms(void)                         //毫秒延时  
  4. {     
  5.      unsigned int i;
  6.      for (i=0;i<140;i++)  
  7.   {
  8.   }
  9. }

  10. void delay_nms(unsigned int n)              //延时周期
  11. {
  12.      unsigned int i;
  13.      for (i=0;i
  14.   {
  15.    delay_ms();
  16.   }
  17. }
  18.   
  19. void spaz(void)                             //响蜂鸣器
  20. {
  21.      PORTC|=(1<<5);                          
  22. delay_nms(50);                          
  23. PORTC&=~(1<<5);                           
  24. }   
  25.   
  26. unsigned long decode(void)                 //无线解码
  27. {
  28.      unsigned long DATA;                    //记录数据
  29.      unsigned char count,i;                 //暂时计数
  30.   
  31. /*一共接收三字节*/
  32.      
  33.      DATA=0;                                //   
  34.      for (count=0;count<24;count++)         //开始收集
  35.   {
  36.    
  37. /*测量高电平宽度*/

  38.        i=0;                                 //宽度计数
  39.    while (PINC&(1<<4))           //高位计数
  40.     {        
  41. asm("nop");           //
  42. i++;                  //计数增加  
  43.                         
  44. if (i>192) goto end;  //限时解码
  45. }                                    

  46. /*分辨出电平高低*/
  47.         
  48.   DATA*=2;                       //数据左移
  49.   
  50.       if (i<64)                             //分辨高低  
  51.    {     
  52.     if (!((56>i)&(i>24))) goto end;     //电平合法                                 
  53.     DATA+=0;                            //记低电平
  54.    }
  55.    
  56.   else
  57.    {      
  58.     if (!((168>i)&(i>72))) goto end;    //电平合法                                 
  59.     DATA+=1;                            //记高电平
  60.    }
  61.    
  62. /*测量低电平宽度*/
  63.    
  64.    while (!(PINC&(1<<4)))               //低位计数
  65.     {        
  66. asm("nop");                 //
  67. i++;                        //计数增加  
  68.                         
  69. if (i>224) goto end;        //限时解码
  70. }           

  71. /*低电平是否过窄*/
  72.   
  73.    if (i<96) goto end;                  //对比宽度                           
  74.       }
  75.          
  76. /*解码成功返结果*/
  77.                                        
  78. return  DATA;                          //成功返回  
  79.   
  80. /*有误码结束解码*/   
  81.   
  82.      end:   
  83. return 0;                              //误码结束
  84. }   
  85.   
  86. void main(void)
  87. {
  88.      unsigned long DATA;                    //
  89. unsigned char D[3];             //  
  90. signed char i;                  //   
  91.      
  92.      DDRB =0B00000000;                      //定义输入
  93.      PORTB=0B11111111;                      //上拉使能
  94.   
  95.      DDRC =0B11101111;                      //输入通道
  96. PORTC=0B11011111;               //上拉选择
  97.       
  98.      DDRD =0B11111111;                      //定义输出
  99. PORTD=0B00000000;               //输出显示  
  100.   
  101. while (1)
  102.   {
  103.    DATA =decode();                      //解码程序
  104.    
  105.    if (DATA>0)                          //
  106.     {
  107.      spaz();                            //解码成功
  108.   
  109. for (i=2;i>=0;i--)                 //数据转换
  110.   {  
  111.    D=DATA;                       //
  112.    DATA>>=8;                        //  
  113.   }
  114.   
  115. i=0;                               //转换完毕   
  116. while (1)                          //输出显示   
  117.   {
  118.    if (!(PINB&(1<<0)))              //按键检查
  119.     {
  120. delay_nms(20);                 //防误处理
  121. if (!(PINB&(1<<0)))            //
  122.   {
  123.    i++;                         //显示值加
  124.    spaz();
  125.   }
  126. while (!(PINB&(1<<0)))         //按键弹起
  127.   {
  128.    delay_nms(20);               //防误处理
  129.   }
  130. }  
  131.    if (i>2) break;                  //
  132.    PORTD=D;                      //输出显示   
  133.   }
  134. }
  135.   }
  136. }
复制代码


该解码程序流程我已用于量产的商业产品上,从没有出现过误码。如用PIC单片机解码距离和PT2272一样远。上面只解码成功后输出编码显示。其它功能可以扩展。

来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=959411&;bbs_page_no=1&bbs_id=9999
此帖出自单片机论坛

3

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-7-17 17:12 | 显示全部楼层

非常感谢

谢谢楼主分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-2-23 02:47 , Processed in 0.096733 second(s), 17 queries , Gzip On, MemCache On.

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