标题:
基于STM32F103平台PT2262解码程序-亲测可用
[打印本页]
作者:
苏州单片机项目
时间:
2017-11-15 16:50
标题:
基于STM32F103平台PT2262解码程序-亲测可用
附件是基于STM32F103平台PT2262解码程序,采用定时器精确定时,不使用中断,亲测有效,并且集成了PT2262组帧程序,调用即可发送。使用逻辑分析仪对比波形,发送波形与标准波形基本一致!
0.png
(6.98 KB, 下载次数: 97)
下载附件
2017-11-15 20:30 上传
单片机源程序如下:
#include "includes.h"
/*******************************************************************************
* 结构体
*******************************************************************************/
typedef struct
{
unsigned char high1;
unsigned char low1;
unsigned char high2;
unsigned char low2;
}PT2262_LEVEL; /*PT2262电平脉冲*/
/*******************************************************************************
* 局部变量
*******************************************************************************/
PT2262_SIGN pt2262_sign[12];
/*******************************************************************************
* 程序
*******************************************************************************/
bool Pt2262DecodeHandle(void)
{
int i=0,count=0;
PT2262_LEVEL pt2262_level[12]; /*pt2262一组12个信号,1个信号2高2低*/
unsigned long sign_buffer[48]={0}; /*信号缓存4*12*/
if( ReadPt2262PinState()==0 ) /*低电平*/
{
while( !ReadPt2262PinState() )
{
/*计算低电平持续时间*/
Delayus(1);/*实际延迟3.5us左右*/
if( (count++)>5800 )
{
return false;
}
}
if( count>1715&&count<4286 )/*找到同步码*/
{
while(1)
{
if( ReadPt2262PinState() )/*高电平*/
{
count=0;
while( ReadPt2262PinState() )
{
/*计算高电平持续时间*/
Delayus(1);
if( (count++)>514 )
{
return false;
}
}
if(count<28) /*高电平太短*/
{
return false;
}
sign_buffer[i]=count; /*记录电平持续时间*/
i++;
}
if( !ReadPt2262PinState() ) /*低电平*/
{
count=0;
while( !ReadPt2262PinState() )
{
/*计算低电平持续时间*/
Delayus(1);
if( (count++)>514 )
{
return false;
}
}
if(count<28) /*低电平太短*/
{
return false;
}
sign_buffer[i]=count; /*记录电平持续时间*/
i++;
}
if(i>47) /*当i=48时,表明已连续记录48个有效脉冲*/
{
for(i=0;i<12;i++)
{
/*窄电平记为0 宽电平记为1*/
if(sign_buffer[i*4]<114)
{
pt2262_level[i].high1=0;
}
else
{
pt2262_level[i].high1=1;
}
if(sign_buffer[i*4+1]<114)
{
pt2262_level[i].low1=0;
}
else
{
pt2262_level[i].low1=1;
}
if(sign_buffer[i*4+2]<114)
{
pt2262_level[i].high2=0;
}
else
{
pt2262_level[i].high2=1;
}
if(sign_buffer[i*4+3]<114)
{
pt2262_level[i].low2=0;
}
else
{
pt2262_level[i].low2=1;
}
if( pt2262_level[i].high1==0&&pt2262_level[i].low1==1&&\
pt2262_level[i].high2==0&&pt2262_level[i].low2==1)
{
pt2262_sign[i]=PT2262_SIGN_LOW;
}
else if( pt2262_level[i].high1==1&&pt2262_level[i].low1==0&&\
pt2262_level[i].high2==1&&pt2262_level[i].low2==0)
{
pt2262_sign[i]=PT2262_SIGN_HIGH;
}
else if( pt2262_level[i].high1==0&&pt2262_level[i].low1==1&&\
pt2262_level[i].high2==1&&pt2262_level[i].low2==0)
{
pt2262_sign[i]=PT2262_SIGN_IDLE;
}
else
{
return false;
}
}
/*解码成功*/
return true;
}
}
}
}
return false;
}
void Pt2262CodingHandle( PT2262_SIGN *p_code ,int length )
{
int i;
/*起始码*/
CODING_SET_LOW();
Delayus(12000);
CODING_SET_HIGN();
for(i=0;i<length;i++)
{
switch(p_code[i])
{
case PT2262_SIGN_LOW:
/*0码*/
CODING_SET_HIGN();
Delayus(380);
CODING_SET_LOW();
Delayus(1200);
CODING_SET_HIGN();
Delayus(380);
CODING_SET_LOW();
Delayus(1200);
break;
case PT2262_SIGN_HIGH:
/*1码*/
CODING_SET_HIGN();
Delayus(1200);
CODING_SET_LOW();
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于STM32F103平台PT2262解码及编码程序.zip
(1.64 KB, 下载次数: 189)
2017-11-15 16:45 上传
点击文件名下载附件
基于STM32F103平台PT2262解码程序
下载积分: 黑币 -5
作者:
苏州单片机项目
时间:
2017-11-16 08:30
注意,发送的时候有个bug,需要在for循环到最后一个的时候,发送一个高脉冲即可,增加的代码如下
if(i==11)
{
CODING_SET_HIGN();
Delayus(380);
CODING_SET_LOW();
}
作者:
lzyscgy
时间:
2018-1-2 10:58
感谢分享!
作者:
碧空痕
时间:
2018-8-3 12:37
有没有更详细的使用方法或者完整的工程文件?
作者:
qsj_ic
时间:
2018-10-26 20:14
感谢分享
作者:
li121788501
时间:
2019-3-13 15:16
感谢楼主分享
作者:
nicole.088
时间:
2019-8-10 10:45
请假,如何将数据传递给Pt2262CodingHandle( PT2262_SIGN *p_code ,int length ); 比如我I想发送0xAA
作者:
vince
时间:
2020-11-19 20:31
哈哈,找到了这么老的帖子!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1