单片机实现遥控编码器PT2262的软件解码
基于单片机实现遥控编码器PT2262的软件解码
1 引言
PT2262是红外遥控编码器,PT2272是其接收解码器,两者常常配对使用,现已广泛用于汽车
门控、遥控门锁、门禁管理等领域,也可用于传送数字信息。PT2262具有19位二进制编码功能;PT2272的解码只有4~6位,这就限制了数据传输的应用。在此从PT2262接收的信号特征入手,利用8051F330单片机直接对接收到的信号进行解码,解释出PT2262发出的全部19位数据,从而使其应用于数字通信、智能化控制等领域。
2 硬件电路
图1是发射装置的原理图,PT2262作为编码器,当按下按键时,设定的地址码和数据码从17引脚串行输出,经红外发射元件IRED发出信号。通过电阻Rosc凋节发射频率,适当提高PT2262工作电压(2.6 V~15 V),以增大发射距离。其中A0~A12可设置为高电平、低电平、悬空三种状态,
因此可以发送531441种编码组合,完全满足
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
需求。
接收装置采用集红外线接收、放大、整形于一体的集成电路TL0038,无需任何外接元件,就能
完成从红外线接收到输出与TTL电平信号兼容的所有工作,故适用于各种红外线遥控和红外线数据
传输。译码采用8051F330D单片机,11.0592MHz晶体振荡器,接收信号送至I/O端口P1.0进行软件解码。接收和译码电路如图2所示。
3 解码原理
编码器PT2262发送的编码信号是由:地址码、数据码、同步码组成的一个完整码字,最多可以
有12位(A0~A11)三态地址端引脚(悬空、高电平、低电平),任意组合可提供531 441个地址码。将编码器PT2262的A8拉高,D3拉高,D0拉高,D1拉低,其余悬空。截取一段接收模块信号输
出波形如图3所示,PT2262每发射一次,至少发送4组相同编码字码。每组字码间隔(低电平)约14
ms。
将其截获波形每组字码放大,如图4所示,一组字码有12位A/D码,每个A/D位是由2个脉冲
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示:2个窄脉冲则表示“0”;2个宽脉冲表示“1”;1个窄脉冲和1个宽脉冲表示“F”即地址码“悬空”;除此之外,每组字码之间还有1个同步码隔开,所以每组字码共计有25个宽度不同的脉冲。窄脉冲宽为200μs,宽脉冲宽为1 200μs;两个窄脉冲之间宽l 200μs;两个宽脉冲问宽200μs;宽窄
脉冲间宽为200μs;在4组字码中,每组的字码间隔为14 000μs。因此,采用单片机软件解码时,只要判断出起始码,并且识别其后面的字码脉冲宽度即可。
4 抗干扰措施
常用抗干扰措施,是在硬件电路中采用电源滤波、电源稳压、数字地与模拟地隔离。在设计中,
除采用上述方法外,还根据干扰信号与有效信号波形特征异同点,采用软件识别干扰信号和有效信号,
从而实现“抗干扰”目的。
当遥控器不发射时,由于空气中各杂波干扰,接收模块的信号输出端仍然会有干扰信号,截获波
形如图5所示。
观察其特征,低电平最长为3 000 μs,最短数十微秒;高电平最长500μs,最短数微秒。与发射时接收到的规则波形(即非有效信号)相比较,低电平为1 400μs的信号,是有效信号,而不是干扰
信号。
并将A0~A34个地址焊接到高电平上作为发射编码信号的帧前码,可解决误码率和十扰问题。
5 软件解码
步骤1:单片机循环记录接收模块信号电平脉冲的长度,高低电平都记录。
步骤2:从记录高低电平组成的波形中,找出连续8个1200μs时长的脉冲信号为特征波形段,
即帧前码。
步骤3:确认帧前码之前是否存在一个时长为14000μs的低电平,如果有(则说明不是干扰码),将解码并存储结果,然后根据指令码执行相应控制功能。如没有,则放弃记录的数据,重复步骤1,直到满足条件为止。
以下给出了相关软件解码的程序代码:
6 结束语
该软件解码部分已在8051F330D单片机(11.059 2 MHz晶体振荡器)上通过现场测试,设计方
案可应用于门禁管理系统。实践表明,应用方便、可靠性好、代码识别准确。
在无线遥控领域,PT2262/2272是目前最常用的芯片之一,但由于芯片
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
配对使用,在很大程度上
影响了该芯片的使用,笔者从PT2262波形特征入手,结合应用实际,提出软件解码的方法和具体措施。
PT2262 软件解码 电平
PT2262/2272是一种CMOS工艺制造的低功耗低价位通用编解码电路,是目前在无线通讯电路中作地址编
码识别最常用的芯片之一。PT2262/2272最多可有12位(A0-A11)三态地址端管脚(悬空,接高电平,接低电平),
任意组合可提供531441地址码,PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚串
行输出。
PT2262/2272必须用相同地址码配对使用,当需要增加一个通讯机时,用户不得不求助于技术人员或厂家
来设置相同地址码,客户自己设置相对比较麻烦,尤其对不懂电子的人来说。随着人们对操作的要求越来
越高,PT2262/2272的这种配对使用严重制约着使用的方便性,人们不断地要求使用一种无须请教专业人
士,无须使用特殊工具,任何人都可以操作的方便的手段来弥补PT2262/2272的缺陷,这就是PT2262软件
解码。
上面是PT2262的一段波形,可以看到一组一组的字码,每组字码之间有同步码隔开,所以我们如果用
单片机软件解码时,程序只要判断出同步码,然后对后面的字码进行脉冲宽度识别即可。 2262每次发射时至少发射4组字码,2272只有在连续两次检测到相同的地址码加数据码时才会把数据码中
的“1”驱动相应的数据输出端为高电平和驱动VT端同步为高电平。因为无线发射的特点,第一组字码非常
容易受零电平干扰,往往会产生误码,所以程序可以丢弃处理。
下面我们来仔细看一下PT2262的波形特征:
振荡频率f=2*1000*16/Rosc(kΩ) kHz 其中Rosc为振荡电阻
这里我们选用的是一种比较常用的频率f?10 kHz, Rosc=3.3MΩ(以下同)。 下图是振荡频率与码位波形的对应关系:
同步码头波形:
PT2262有三种编码:0,1,和悬空(表示为f)。
有了以上具体的波形,我们就可以进行软件解码了。T2262每次至少发送4次编码,首先我们可以通过检
测11ms宽度的同步码头,有码头才开始进行编码解码,无码头则继续等待。当收到码头时,还要检测是
否已经收到过码头,若无,则丢弃第一次编码的信号,以防止误码。
从编码图中可以看出,每一位码字都是从低电平开始到高电平,到低电平,再到高电平。为了检测方便,
在接收端我们把编码信号进行了180?倒相,使码位开始的上升沿转化为下降沿,这样当我们使用MCS51系列单片机解码时可使用中断方式及时截获编码。从编码图中还可以看出,每一位码字都可以分成两段,
我们以每段中的电平宽度来描述码位:
码位 第一段 第二段 数值表示 反码表示
0 窄 窄 00 11
1 宽 宽 11 00
f 窄 宽 01 10
无效码 宽 窄 10 01
1()
从第一个下降沿开始延时700us左右,检测电平高低,记为A1,再检测第二个下降沿,延时700us左右,检测电平高低,记为A2,这样一个码位就可以译出来了,连续检测12个码位。
2()
从第一个下降沿开始记时,并不断检测电平变化,一有电平变化,立即记录电平宽度B1,再继续记时直至出现第二个下降沿,记录两个下降沿的间隔B2,重复以上步骤,得到B3,B4,判断B1,B2,B3,B4是否在各自允许的误差范围内,是则保存B1,B3,译出一个码位,否则认为误码,丢弃。连续正确检测12个码位。
两种解码方式各有优缺点如下:
解码方式 优点 缺点
1 程序简单,CPU开销少 解码精度差
2 程序复杂,CPU开销大 解码精度较高 为了获得较高的解码精度,我们推荐
使用方法
消防栓的使用方法指针万用表的使用方法84消毒液使用方法消防灭火器使用方法铁材计算器使用方法
2,以避免大量的干扰信号的误解码。
说明:ADD1,ADD2中为8位地址,DAT0中为4位数据
REMOTE: CLR TR2 ;探头信号检测子程序
CLR RECEIVE ;
MOV DETE_LOOP,#12 ;接收12位编码
REMO0: CLR DETE_T_OVER ;
MOV TH2,#0FEH ;测第1位电平宽度
MOV TL2,#041H ;
SETB TR2 ;
REMO1: JB REM,REMO2 ;等待出现高电平
JB DETE_T_OVER,REMO3 ;限时1500us,超时则认为误码
AJMP REMO1 ;
REMO2: MOV A,TH2 ;测低电平宽度,0FF为宽脉冲,0FE为窄脉冲
CJNE A,#0FFH,REMO4 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#098H,$+3 ;
JNC REMO3 ;电平过宽(超过1150us),退出
CLR C ;
CJNE A,#020H,$+3 ;
JC REMO3 ;电平过窄(小于780us),退出
SETB C ;
AJMP REMO5 ;
REMO3: AJMP REMOTE_END ;
REMO4: CJNE A,#0FEH,REMO3 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#0C7H,$+3 ;
JNC REMO3 ;电平过宽(超过450us),退出
CLR C ;
CJNE A,#060H,$+3 ;
JC REMO3 ;电平过窄(小于210us),退出
CLR C ;
REMO5: MOV A,DAT0 ;存储电平值
RLC A ;
MOV DAT0,A ;
MOV A,ADD1 ;
RLC A ;
MOV ADD1,A ;
REMO6: JNB REM,REMO7 ;等待出现低电平
JB DETE_T_OVER,REMO3 ;脉冲下降沿间隔限时1500us,超时则认为误码
AJMP REMO6 ;
REMO7: CLR TR2 ;
CLR DETE_T_OVER ;
MOV A,TH2 ;
CJNE A,#0FFH,REM13 ;脉冲间隔过小
MOV A,TL2 ;
CLR C ;
CJNE A,#050H,$+3 ;
JC REM13 ;电平过窄(小于1200us),退出
MOV TH2,#0FEH ;测第2位电平宽度
MOV TL2,#041H ;
SETB TR2 ;
REM11: JB REM,REM12 ;等待出现高电平
JB DETE_T_OVER,REM13 ;限时1500us,超时则认为误码
AJMP REM11 ;
REM12: MOV A,TH2 ;测低电平宽度,0FE为宽脉冲,0FF为窄脉冲
CJNE A,#0FFH,REM14 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#098H,$+3 ;
JNC REM13 ;电平过宽(超过1100us),退出
CLR C ;
CJNE A,#020H,$+3 ;
JC REM13 ;电平过窄(小于1000us),退出
SETB C ;
AJMP REM15 ;
REM13: AJMP REMOTE_END ;
REM14: CJNE A,#0FEH,REM13 ;
MOV A,TL2 ;
CLR C ;
CJNE A,#0C7H,$+3 ;
JNC REM13 ;电平过宽(超过450us),退出
CLR C ;
CJNE A,#060H,$+3 ;
JC REM13 ;电平过窄(小于210us),退出
CLR C ;
REM15: MOV A,TEMP ;存储电平值
RLC A ;
MOV TEMP,A ;
MOV A,ADD2 ;
RLC A ;
MOV ADD2,A ;
REM16: JNB REM,REM18 ;等待出现低电平
JB DETE_T_OVER,REM13 ;脉冲下降沿间隔限时1500us,超时则认为误码
AJMP REM16 ;
REM17: AJMP REMO0
REM18: CLR TR2 ;
CLR DETE_T_OVER ;
MOV A,TH2
CJNE A,#0FFH,REM13 ;脉冲间隔过小
MOV A,TL2 ;
CLR C ;
CJNE A,#050H,$+3 ;
JC REM13 ;电平过窄(小于1200us),退出
DJNZ DETE_LOOP,REM17 ;
REM19: MOV DETE_LOOP,#4 ;把接收的编码左移4位
REM20: CLR C ;将8位密码放在同一字节上
MOV A,DAT0 ;
RLC A ;
MOV DAT0,A ;
MOV A,ADD1 ;
RLC A ;
MOV ADD1,A ;
CLR C ;
MOV A,TEMP ;
RLC A ;
MOV TEMP,A ;
MOV A,ADD2 ;
RLC A ;
MOV ADD2,A ;
DJNZ DETE_LOOP,REM20 ;
;把4 位数据编码由高4 位移到低4 位上 ;
MOV A,DAT0 ;
SWAP A ;
MOV DAT0,A ;
MOV A,TEMP ;
SWAP A ;
MOV TEMP,A ;
ANL DAT0,#0FH ;
SETB RECEIVE ;
REMOTE_END: ;
CLR TR2
CLR REMOTING ;
RET ;
在无线通讯中使用单片机会对通讯系统造成严重的干扰,相信许多技术人员一定有过同样的苦恼。如果
硬件设计不当,会造成原先硬件解码时通讯距离为200米,而用软件解码后可能只有十几米,因此解决硬件抗干扰问题在很大程度上可减少软件解码的误码率。
1、收发模块:早期常用的频率为47MHz,在这种频率下,很难有好的解决方法;建议采用目前国家允
许无线遥控使用的频率315 MHz;
2、单片机振荡频率:大量的MCS51教材中推荐大家使用的是12 MHz及11.0592 MHz的晶体,这些晶
体在一般场合使用没有问题,但在此却不可以,它们在300 MHz左右仍然能够产生较大的干扰,为解决单片机运行速度与电磁干扰的矛盾,建议采用频率为4 MHz或3.58 MHz的晶体。
3、隔离:为了有效抑制单片机对接收模块的电磁干扰,建议采用?电源隔离;?端口隔离;端口隔离
可采用三极管或比较器。实践表明,采用隔离的效果非常明显。
PT2262的软件解码在实际应用中有较好的用武之地。采用软件解码的系统,厂家再也无须对收发设备进行
配套,以利于生产于保管;对客户来说,使用软件解码无须求助,厂家只须再软件中加入自动学习功能,
用户可自行使用该功能,只须轻按学习键即可学习新的通讯设备,如遥控器等。
目前,该软件解码已经在某无线报警设备中采用,客户反映使用简便,效果良好。
参考:1、PT2262 PT2272 和P87LPC764 单片机的接口设计(广州周立功单片机);
基于AVR单片机的PT2262软件解码程序
2008-12-31 14:12
很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不
用定时器,不用中断,代码最少。但耗CPU,发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC
振荡。解码成功后输出D口显示。编译软件为 ICCAVR。 #include
#include
void delay_ms(void) //毫秒延时 {
unsigned int i;
for (i=0;i<140;i++)
{
}
}
void delay_nms(unsigned int n) //延时周期 {
unsigned int i;
for (i=0;i192) goto end; //限时解码
}
/*分辨出电平高低*/
DATA*=2; //数据左移
if (i<64) //分辨高低
{
if (!((56>i)&(i>24))) goto end; //电平合法
DATA+=0; //记低电平
}
else
{
if (!((168>i)&(i>72))) goto end; //电平合法
DATA+=1; //记高电平
}
/*测量低电平宽度*/
while (!(PINC&(1<<4))) //低位计数
{
asm("nop"); //
i++; //计数增加
if (i>224) goto end; //限时解码
}
/*低电平是否过窄*/
if (i<96) goto end; //对比宽度
}
/*解码成功返结果*/
return DATA; //成功返回
/*有误码结束解码*/
end:
return 0; //误码结束 }
void main(void)
{
unsigned long DATA; //
unsigned char D[3]; //
signed char i; //
DDRB =0B00000000; //定义输入
PORTB=0B11111111; //上拉使能
DDRC =0B11101111; //输入通道
PORTC=0B11011111; //上拉选择
DDRD =0B11111111; //定义输出
PORTD=0B00000000; //输出显示
while (1)
{
DATA =decode(); //解码程序
if (DATA>0) //
{
spaz(); //解码成功
for (i=2;i>=0;i--) //数据转换
{
D[i]=DATA; //
DATA>>=8; //
}
i=0; //转换完毕
while (1) //输出显示
{
if (!(PINB&(1<<0))) //按键检查
{
delay_nms(20); //防误处理
if (!(PINB&(1<<0))) //
{
i++; //显示值加
spaz();
}
while (!(PINB&(1<<0))) //按键弹起
{
delay_nms(20); //防误处理
}
}
if (i>2) break; //
PORTD=D[i]; //输出显示
}
}
}
}
C编程:用AT89S51单片机软件解码PT2262,编码芯片PT2262发出的编码由:
地址码、数据码、同步码组成。地址码和数据码都用宽度不同的脉冲来表示,两
个窄脉冲表示“0”;两个宽脉冲表示“1”;一个窄脉冲和一个宽脉冲表示“F”,
也就是地址码的“悬空”;同步码为时间较长的低电平间隔,下图为PT2262编
码图:
从图中可以看出,发送码的周期是相等的,只是脉冲宽度不同(宽脉冲与窄脉冲之比为3:1)。而同步码的低电平时间约为这个周期的8倍.
解码的关键是识别同步码,然后对后面的字码的脉冲宽度进行识别,就可以解出
这个编码。pt2262每次发射时至少发射4组字码,每组字码由25个脉冲组成,前24个脉冲为地址和数据,最后一个脉冲和一低电平间隔组成同步码。下面我
们来说说如何用51单片机对其进行解码。由于程序结构不复杂,就不再画
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图,首先我们让Timer0工作在定时状态,初始化值使其能在同步码未结束时溢
出,利用Timer0的溢出中断来初始化,准备接收后来数据,同时将Timer0设为门控定时,也就是TMOD的GATE0位为1,此模式下,只有TR0=1并且INT0=1才计数,此模式可以用来测量脉冲宽度.这样就识别出了同步码.数据由INT0输入,INT0设为跳变触发,每中断一次就取TH0和TL0之和,这个和就是前一个的脉冲宽度.判断出是宽脉冲还是窄脉冲.由于上述的同步码周期与地址数据周期都远小于定
时器0的定时时间,所在定时器0正常工作时,是不会溢出的.以下为程序,程序的功能是分别解出地址码与按键码(也就是数据码),然后用串口输出.解码时宽脉冲为1,窄脉冲为0.低位放到接收码的最高位,也就是解码结果与原数据位颠倒
了.至于想要什么结果,可以做相应的处理,当然包括变换成地址的三进制格式.因为宽脉冲的脉宽与低脉冲的脉宽相差很大,所以解码很容易,下面为振荡电阻为1M时的程序,同样可用来解码振荡电阻为1.2M的编码.振荡电阻决定脉冲的宽
度,可以修改程序来适应不同的震荡电阻,下面是c程序代码: //测试条件:单片机为AT89S51,晶振12M,振荡电阻1MΩ
#include< AT89X51.h>
#include< stdio.h>
unsigned int addr,key;
unsigned char cntint;//外部中断0计数
void eint0(void) interrupt 0//外部中断0
{
static unsigned int tempaddr;//接收地址缓存
static unsigned int tempkey;//接收数据缓存
unsigned int timecnt;
timecnt=TH0*256+TL0;
TH0=0;
TL0=0;
if(cntint<16)//接收地址码
{
tempaddr=tempaddr<<1;//将接收的到最低位移到最高位
if(timecnt>210)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为
110uS,宽脉冲为320uS
{
tempaddr|=1;//宽脉冲为1
}
cntint++;//中断次数加1
}
else if(cntint<24)//接收数据码 {
tempkey=tempkey<<1;
if(timecnt>120)
{
tempkey|=1;
}
cntint++;
}
else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码
{
TMOD&=0xf0;//设定时器0为定时方式 TMOD|=0x01;
TH0=0xf9;
TL0=0x66;
cntint=0;
EX0=0;//关外部中断0
addr=tempaddr;
key=tempkey;
tempaddr=0;
tempkey=0;
}
}
void timer0(void) interrupt 1//定时器0中断,只有初始化时,空闲时和同步
码到来时才中断
{
TMOD&=0xf0;//将定时器0的工作方式设为门控定时,用以检测脉宽。
TMOD|=0x09;
cntint=0;//外部中断0中断次数设为0 TH0=0;//设定时器0定时初值为0 TL0=0;
EX0=1;//允许外部中断0
IE0=0;//清除外部中断0标志
}
void main(void)
{
void sendd(unsigned int intnum);
unsigned int i;
TMOD=0x21;//设定定时器0和定时器1,定时器1用来驱动串口
TH0=0xf9;//设定定时器的初始值,这个值必小于同步码
TL0=0x66;
TH1=243;//12M晶振时,串口波特率为2400 TL1=243;
SCON=0x50;//设定串口工作方式
TI=1;//要用printf就将其设为1
EA=1;//开所有中断
ET0=1;//开定时器0中断
EX0=0;//关外部中断0,在Timer0中断里面将其打开 IT0=1;//外部中断0设为跳变触发
TR0=1;//定时器0启动
TR1=1;//定时器1启动
while(1)
{
printf("%u\n",addr);//输出解码地址 printf("%u\n\n",key);//输出解码数据 for(i=0;i<3000;i++);//这个用来防止串口不同步 }
}
当然上面的程序只是简单的解出了PT2262的编码,至于要做如何处理,以及可靠
性等,要通过读者自己来设计与完善。