找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8812|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

基于STM32F103平臺PT2262解碼程序-親測可用

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:244587 發(fā)表于 2017-11-15 16:50 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
附件是基于STM32F103平臺PT2262解碼程序,采用定時器精確定時,不使用中斷,親測有效,并且集成了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個信號,1個信號2高2低*/
  23.     unsigned long sign_buffer[48]={0};  /*信號緩存4*12*/
  24.    
  25.     if( ReadPt2262PinState()==0 ) /*低電平*/
  26.     {
  27.         while( !ReadPt2262PinState() )
  28.         {
  29.             /*計(jì)算低電平持續(xù)時間*/
  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ù)時間*/
  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ù)時間*/
  58.                     i++;
  59.                 }
  60.                
  61.                 if( !ReadPt2262PinState() ) /*低電平*/
  62.                 {
  63.                     count=0;
  64.                     while( !ReadPt2262PinState() )
  65.                     {
  66.                         /*計(jì)算低電平持續(xù)時間*/
  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ù)時間*/
  78.                     i++;
  79.                 }
  80.                
  81.                 if(i>47) /*當(dāng)i=48時,表明已連續(xù)記錄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黑下載附件…………
復(fù)制代碼

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


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:244587 發(fā)表于 2017-11-16 08:30 | 只看該作者
注意,發(fā)送的時候有個bug,需要在for循環(huán)到最后一個的時候,發(fā)送一個高脈沖即可,增加的代碼如下
if(i==11)
{
            CODING_SET_HIGN();
            Delayus(380);
            CODING_SET_LOW();
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:270049 發(fā)表于 2018-1-2 10:58 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:250777 發(fā)表于 2018-8-3 12:37 | 只看該作者
有沒有更詳細(xì)的使用方法或者完整的工程文件?
回復(fù)

使用道具 舉報(bào)

5#
ID:231092 發(fā)表于 2018-10-26 20:14 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:220853 發(fā)表于 2019-3-13 15:16 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

7#
ID:170675 發(fā)表于 2019-8-10 10:45 | 只看該作者
請假,如何將數(shù)據(jù)傳遞給Pt2262CodingHandle( PT2262_SIGN *p_code ,int length ); 比如我I想發(fā)送0xAA
回復(fù)

使用道具 舉報(bào)

8#
ID:75737 發(fā)表于 2020-11-19 20:31 | 只看該作者
哈哈,找到了這么老的帖子!
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表