6656|1

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

最精尖的PT2262解码程序与大家共享 [复制链接]

我看过很多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
此帖出自单片机论坛

最新回复

谢谢楼主分享  详情 回复 发表于 2011-7-17 17:12
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

非常感谢

谢谢楼主分享
此帖出自单片机论坛
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表