找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7452|回复: 7
收起左侧

基于STM32F103平台PT2262解码程序-亲测可用

  [复制链接]
ID:244587 发表于 2017-11-15 16:50 | 显示全部楼层 |阅读模式
附件是基于STM32F103平台PT2262解码程序,采用定时器精确定时,不使用中断,亲测有效,并且集成了PT2262组帧程序,调用即可发送。使用逻辑分析仪对比波形,发送波形与标准波形基本一致!
0.png

单片机源程序如下:
  1. #include "includes.h"

  2. /*******************************************************************************
  3. * 结构体
  4. *******************************************************************************/
  5. typedef struct  
  6. {
  7.     unsigned char high1;
  8.     unsigned char low1;
  9.     unsigned char high2;
  10.     unsigned char low2;
  11. }PT2262_LEVEL; /*PT2262电平脉冲*/

  12. /*******************************************************************************
  13. * 局部变量
  14. *******************************************************************************/
  15. PT2262_SIGN   pt2262_sign[12];

  16. /*******************************************************************************
  17. * 程序
  18. *******************************************************************************/
  19. bool Pt2262DecodeHandle(void)
  20. {
  21.     int i=0,count=0;
  22.     PT2262_LEVEL  pt2262_level[12];     /*pt2262一组12个信号,1个信号2高2低*/
  23.     unsigned long sign_buffer[48]={0};  /*信号缓存4*12*/
  24.    
  25.     if( ReadPt2262PinState()==0 ) /*低电平*/
  26.     {
  27.         while( !ReadPt2262PinState() )
  28.         {
  29.             /*计算低电平持续时间*/
  30.             Delayus(1);/*实际延迟3.5us左右*/
  31.             if( (count++)>5800 )
  32.             {
  33.                 return false;
  34.             }
  35.         }
  36.         
  37.         if( count>1715&&count<4286 )/*找到同步码*/
  38.         {
  39.             while(1)
  40.             {
  41.                 if( ReadPt2262PinState() )/*高电平*/
  42.                 {
  43.                     count=0;
  44.                     while( ReadPt2262PinState() )
  45.                     {
  46.                         /*计算高电平持续时间*/
  47.                         Delayus(1);
  48.                         if( (count++)>514 )
  49.                         {
  50.                             return false;
  51.                         }
  52.                     }
  53.                     if(count<28) /*高电平太短*/
  54.                     {
  55.                         return false;
  56.                     }
  57.                     sign_buffer[i]=count; /*记录电平持续时间*/
  58.                     i++;
  59.                 }
  60.                
  61.                 if( !ReadPt2262PinState() ) /*低电平*/
  62.                 {
  63.                     count=0;
  64.                     while( !ReadPt2262PinState() )
  65.                     {
  66.                         /*计算低电平持续时间*/
  67.                         Delayus(1);
  68.                         if( (count++)>514 )
  69.                         {
  70.                             return false;
  71.                         }
  72.                     }
  73.                     if(count<28) /*低电平太短*/
  74.                     {
  75.                         return false;
  76.                     }
  77.                     sign_buffer[i]=count; /*记录电平持续时间*/
  78.                     i++;
  79.                 }
  80.                
  81.                 if(i>47) /*当i=48时,表明已连续记录48个有效脉冲*/
  82.                 {
  83.                     for(i=0;i<12;i++)
  84.                     {
  85.                         /*窄电平记为0 宽电平记为1*/
  86.                         if(sign_buffer[i*4]<114)
  87.                         {
  88.                             pt2262_level[i].high1=0;
  89.                         }
  90.                         else
  91.                         {
  92.                             pt2262_level[i].high1=1;
  93.                         }
  94.                         
  95.                         if(sign_buffer[i*4+1]<114)
  96.                         {
  97.                             pt2262_level[i].low1=0;
  98.                         }
  99.                         else
  100.                         {
  101.                             pt2262_level[i].low1=1;
  102.                         }
  103.                         
  104.                         if(sign_buffer[i*4+2]<114)
  105.                         {
  106.                             pt2262_level[i].high2=0;
  107.                         }
  108.                         else
  109.                         {
  110.                             pt2262_level[i].high2=1;
  111.                         }
  112.                         
  113.                         if(sign_buffer[i*4+3]<114)
  114.                         {
  115.                             pt2262_level[i].low2=0;
  116.                         }
  117.                         else
  118.                         {
  119.                             pt2262_level[i].low2=1;
  120.                         }
  121.                         
  122.                         if( pt2262_level[i].high1==0&&pt2262_level[i].low1==1&&\
  123.                             pt2262_level[i].high2==0&&pt2262_level[i].low2==1)
  124.                         {
  125.                             pt2262_sign[i]=PT2262_SIGN_LOW;
  126.                         }
  127.                         else if( pt2262_level[i].high1==1&&pt2262_level[i].low1==0&&\
  128.                             pt2262_level[i].high2==1&&pt2262_level[i].low2==0)
  129.                         {
  130.                             pt2262_sign[i]=PT2262_SIGN_HIGH;       
  131.                         }
  132.                         else if( pt2262_level[i].high1==0&&pt2262_level[i].low1==1&&\
  133.                             pt2262_level[i].high2==1&&pt2262_level[i].low2==0)
  134.                         {
  135.                             pt2262_sign[i]=PT2262_SIGN_IDLE;
  136.                         }
  137.                         else
  138.                         {
  139.                             return false;
  140.                         }
  141.                     }
  142.                     /*解码成功*/
  143.                     return true;
  144.                 }
  145.             }
  146.         }
  147.     }
  148.     return false;       
  149. }

  150. void Pt2262CodingHandle( PT2262_SIGN *p_code ,int length )
  151. {
  152.     int i;
  153.    
  154.     /*起始码*/
  155.     CODING_SET_LOW();
  156.     Delayus(12000);
  157.     CODING_SET_HIGN();
  158.    
  159.     for(i=0;i<length;i++)
  160.     {
  161.         switch(p_code[i])
  162.         {
  163.         case PT2262_SIGN_LOW:
  164.             /*0码*/
  165.             CODING_SET_HIGN();
  166.             Delayus(380);
  167.             CODING_SET_LOW();
  168.             Delayus(1200);
  169.             CODING_SET_HIGN();
  170.             Delayus(380);
  171.             CODING_SET_LOW();
  172.             Delayus(1200);
  173.             break;
  174.         case PT2262_SIGN_HIGH:
  175.             /*1码*/
  176.             CODING_SET_HIGN();
  177.             Delayus(1200);
  178.             CODING_SET_LOW();
  179. ……………………

  180. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于STM32F103平台PT2262解码及编码程序.zip (1.64 KB, 下载次数: 184)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:244587 发表于 2017-11-16 08:30 | 显示全部楼层
注意,发送的时候有个bug,需要在for循环到最后一个的时候,发送一个高脉冲即可,增加的代码如下
if(i==11)
{
            CODING_SET_HIGN();
            Delayus(380);
            CODING_SET_LOW();
}
回复

使用道具 举报

ID:270049 发表于 2018-1-2 10:58 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:250777 发表于 2018-8-3 12:37 | 显示全部楼层
有没有更详细的使用方法或者完整的工程文件?
回复

使用道具 举报

ID:231092 发表于 2018-10-26 20:14 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:220853 发表于 2019-3-13 15:16 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:170675 发表于 2019-8-10 10:45 | 显示全部楼层
请假,如何将数据传递给Pt2262CodingHandle( PT2262_SIGN *p_code ,int length ); 比如我I想发送0xAA
回复

使用道具 举报

ID:75737 发表于 2020-11-19 20:31 | 显示全部楼层
哈哈,找到了这么老的帖子!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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