標(biāo)題: 基于STM32F103平臺(tái)PT2262解碼程序-親測可用 [打印本頁]

作者: 蘇州單片機(jī)項(xiàng)目    時(shí)間: 2017-11-15 16:50
標(biāo)題: 基于STM32F103平臺(tái)PT2262解碼程序-親測可用
附件是基于STM32F103平臺(tái)PT2262解碼程序,采用定時(shí)器精確定時(shí),不使用中斷,親測有效,并且集成了PT2262組幀程序,調(diào)用即可發(fā)送。使用邏輯分析儀對比波形,發(fā)送波形與標(biāo)準(zhǔn)波形基本一致!


單片機(jī)源程序如下:
  1. #include "includes.h"

  2. /*******************************************************************************
  3. * 結(jié)構(gòu)體
  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個(gè)信號(hào),1個(gè)信號(hào)2高2低*/
  23.     unsigned long sign_buffer[48]={0};  /*信號(hào)緩存4*12*/
  24.    
  25.     if( ReadPt2262PinState()==0 ) /*低電平*/
  26.     {
  27.         while( !ReadPt2262PinState() )
  28.         {
  29.             /*計(jì)算低電平持續(xù)時(shí)間*/
  30.             Delayus(1);/*實(shí)際延遲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.                         /*計(jì)算高電平持續(xù)時(shí)間*/
  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; /*記錄電平持續(xù)時(shí)間*/
  58.                     i++;
  59.                 }
  60.                
  61.                 if( !ReadPt2262PinState() ) /*低電平*/
  62.                 {
  63.                     count=0;
  64.                     while( !ReadPt2262PinState() )
  65.                     {
  66.                         /*計(jì)算低電平持續(xù)時(shí)間*/
  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; /*記錄電平持續(xù)時(shí)間*/
  78.                     i++;
  79.                 }
  80.                
  81.                 if(i>47) /*當(dāng)i=48時(shí),表明已連續(xù)記錄48個(gè)有效脈沖*/
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于STM32F103平臺(tái)PT2262解碼及編碼程序.zip (1.64 KB, 下載次數(shù): 189)



作者: 蘇州單片機(jī)項(xiàng)目    時(shí)間: 2017-11-16 08:30
注意,發(fā)送的時(shí)候有個(gè)bug,需要在for循環(huán)到最后一個(gè)的時(shí)候,發(fā)送一個(gè)高脈沖即可,增加的代碼如下
if(i==11)
{
            CODING_SET_HIGN();
            Delayus(380);
            CODING_SET_LOW();
}
作者: lzyscgy    時(shí)間: 2018-1-2 10:58
感謝分享!
作者: 碧空痕    時(shí)間: 2018-8-3 12:37
有沒有更詳細(xì)的使用方法或者完整的工程文件?
作者: qsj_ic    時(shí)間: 2018-10-26 20:14
感謝分享
作者: li121788501    時(shí)間: 2019-3-13 15:16
感謝樓主分享
作者: nicole.088    時(shí)間: 2019-8-10 10:45
請假,如何將數(shù)據(jù)傳遞給Pt2262CodingHandle( PT2262_SIGN *p_code ,int length ); 比如我I想發(fā)送0xAA
作者: vince    時(shí)間: 2020-11-19 20:31
哈哈,找到了這么老的帖子!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1