用51单片机控制PT2262PT2272的发送与接收

用51单片机控制PT2262PT2272的发送与接收,第1张

晶振: 12MHz

说 明 ***********************************

接收到的信号为发送信号的反码因为每检测到按键有效一次PT2262 都发送四次编码我们可以

利用这一特点来解码先检测有没有接收到信息当有的时候我们就去掉第一次编码的信号检测5ms 的

高电平来检测编码的开始信号接收到5ms 的高电平后才开始解码我们可以发现每个码的长度都是1.2ms

左右每一个编桥雀码都是由低电平开始然后到高电平又到低电平又回到高电平我们从第一个高电平

的宽度可以把1 码区分出来剩下的悬空码和0 码可以从第二个高电兆拆平的宽度区分出来

具体的单片机译码方法如下

由高电平开始检测到下降沿时就延时300us 读取接收的状态记为族消枣A0 然后再检测下一个下降沿

降沿后又延时300us 读取接收的状态记为A1 这样就把一个编码给译出来了

A0 A1 和悬空1 码0 码的关系如下:

A0 A1 代码

0 0 1 码

0 1 错误

1 0 悬空

1 1 0 码

******************************************************************************/

#i nclude <STC516AD.H>

#define uchar unsigned char

#define uint unsigned int

//定义共用体

union

{

uint word

struct { //结构bytes

uchar byte_addr

uchar byte_data

}bytes

}a_0,a_1

//位定义

sbit W_REM =P3^3//遥控接收输入脚

sbit LED0 =P1^0

sbit LED2 =P1^2

bit bdata recv_flg, //接收正确位标志(1:正确 0:错误)

//因为当按住PT2262的按键不放的时候PT2262会把编码不断的送出

//设置lianji_flg位用来检测按键有没有放开过如果没有放开则不再响应

lianji_flg//按键没有放开过标志(1:连接 0:点击)

uchar

// addr_a0, //接收的8位地址编码A0

// addr_a1, //接收的8位地址编码A1

// data_a0, //接收的4位数据编码A0

// data_a1, //接收的4位数据编码A1

addr_user_a0, //设定的8位地址密码A0

addr_user_a1//设定的8位地址密码A1

// led_out//输出控制

//------------------------------------- sub functon ----------------------------------------------

//------------------------------------- sub functon ----------------------------------------------

//------------------------------------- sub functon ----------------------------------------------

//------------------------------------- sub functon ----------------------------------------------

//------------------------------------- sub functon ----------------------------------------------

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//void d1ms (uint ljh_in)/*1mS延时函数*/

//{

// uint data ljh_i

// uchar data ljh_j

// for(ljh_i=0ljh_i<ljh_inljh_i++){

// for(ljh_j=0ljh_j<108ljh_j++){

// _nop_()_nop_()

// _nop_()_nop_()

// _nop_()_nop_()

// }

// }

//}

//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void d50us(uchar n) //50uS延时

{

uchar data i,j

for(j=njj--) { //[1T+2T+(2i+2)T+1T+2T]*n+1T+2T+2T=(2i+8)*n+5T

for(i=21ii--) //延时2T+2T*i=(2i+2)T

}

}

//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

PT2272_deco() //解码

{

uchar i,cnt

if(recv_flg)

else {

//清除上次解码内容

cnt =12//接收12位编码

//解码 ------------------------------------------------------------------------

//先找出接收码的开头即5ms左右的高电平 ----------------------------------

//设置高电平时间为4~6ms

//检测和等待4ms的高电平

for(i=80ii--) { //延时4mS

if(!W_REM) i=80

else d50us(1)

}

//等待在2ms内接收到的低电平 --------------------------------------------

for(i=40ii--) { //延时4mS

if(!W_REM) break

else d50us(1)

}

//4ms到6ms内接收到下降沿则跳去解码否则返回

//超出6ms接收错误返回

if(i) {

recv_flg =0//清按键没有放开过标志

goto PT2272_deco_exit//返回 --------------------------------

}

//等待300us后采集接收信号

d50us(6)

//采集接收信号并记录

a_0.word=a_1.word=0

for(i=0i<6i++) {

if(W_REM) {

a_0.word |=0x01

}

a_0.word <<=1

// MOV C,W_REM //读A0数据

// MOV A,DATA_A0

// RLC A

// MOV DATA_A0,A //保存相应位的A0

// MOV A,ADD_A0

// RLC A

// MOV ADD_A0,A //高位转移

//等待第二个下降沿

while(!W_REM)

while(W_REM)

// JNB W_REM,$

// JB W_REM,$

//等待300us后采集接收信号

d50us(6)

// MOV 40H,#150 //2T

// DJNZ 40H,$ //2T 延时:2T+2T*150=302T

if(W_REM) {

a_1.word |=0x01

}

a_1.word <<=1

// MOV C,W_REM //读A1数据

// MOV A,DATA_A1

// RLC A

// MOV DATA_A1,A //保存相应位的A1

// MOV A,ADD_A1

// RLC A

// MOV ADD_A1,A //高位转移

//等待第二个码值的下降沿

while(!W_REM) //___wd___

while(W_REM) LED2=~LED2

// JNB W_REM,$

// JB W_REM,$

// DJNZ 34H,REMOTE6 //接收12 位编码 --------------------------------

}

//把接收的编码左移4位将8位密码放在同一字节上----------------------------

a_0.word <<=4

a_1.word <<=4

// MOV 40H,#4

//REMOTE7:

// CLR C

// MOV A,DATA_A0

// RLC A //送出低8位的bit7

// MOV DATA_A0,A //低8位的A0左移1位

// MOV A,ADD_A0

// RLC A //接收低8位的bit7

// MOV ADD_A0,A //高8位的A0左移1位

// CLR C

// MOV A,DATA_A1

// RLC A //送出低8位的bit7

// MOV DATA_A1,A //低8位的A1左移1位

// MOV A,ADD_A1

// RLC A //接收低8位的bit7

// MOV ADD_A1,A //高8位的A1左移1位

// DJNZ 40H,REMOTE7 //左移4位

// //把4位数据编码由高4位移到低4位上 ---------------------------------

// MOV A,DATA_A0

// SWAP A

// MOV DATA_A0,A //把4位数据编码A0由高4位移到低4位?

// MOV A,DATA_A1

// SWAP A

// MOV DATA_A1,A //把4位数据编码A1由高4位移到低4位?

//比较密码 --------------------------------------------------------------

if((a_0.bytes.byte_addr==addr_user_a0)&&(a_1.bytes.byte_addr==addr_user_a1)) {

recv_flg =1

lianji_flg =1

} else {

recv_flg =0

lianji_flg =0

}

// MOV A,ADD_A0

// XRL A,ADD_USER_A0

// JNZ REMOTE8 //密码不正确则跳转

//

// MOV A,ADD_A1

// XRL A,ADD_USER_A1

// JNZ REMOTE8 //密码不正确则跳转

// //置接收正确位 ---------------------------------------------------------

// SETB RECEIVE

// //置ENABLE 用于检测按键有没有放开 --------------------------------

// SETB ENABLE

// RET //接收正确返回 -----------------------------------------

//REMOTE8:

// CLR ENABLE

// CLR RECEIVE

// RET //接收不正确返回 ---------------------------------------

}

PT2272_deco_exit:

return

}

//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void remote_2272_deco() //接收遥控码(解码程序)

{

uint i

//检测50ms内有没有编码接收

for(i=1000ii--) {

if(!W_REM) {

PT2272_deco()//解码

break

}

else d50us(1)//50uS延时

}

recv_flg =0//清按键没有放开过标志

}

//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

void work() //控制输出 //把选中的LED取反

{

if(recv_flg) { //接收不正确,退出

recv_flg=0//清接收正确标志位

a_0.bytes.byte_data =~a_0.bytes.byte_data

P1 =P1^a_0.bytes.byte_data

}

//WORK:

// JNB RECEIVE,WORK_END //接收不正确,退出

// //每次按键都一次响应

// CLR RECEIVE //清接收正确标志位

// MOV A,DATA_A1

// CPL A

// ORL A,#0FH //屏蔽低4位

// MOV DATA_A1,A

// MOV A,LCD_OUT

// XRL A,DATA_A1

// ORL A,#0FH

// MOV LCD_OUT,A

// MOV P1,LCD_OUT

// NOP

//WORK_END:

// RET

// END

}

//<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<

// ==================================== main function ============================================

// ==================================== main function ============================================

// ==================================== main function ============================================

// ==================================== main function ============================================

// ==================================== main function ============================================

// ==================================== main function ============================================

void main (void)

{

//上电初始化 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

P1 =0xff

P3 =0xff

for(addr_user_a1=100addr_user_a1addr_user_a1--) d50us(200)//50uS延时

//编码设定为:A0~A7地址编码为:悬空 +++++++++++++++++++++++++++++++++++++++++++++

addr_user_a0 =0xff

addr_user_a1 =0x00

//start: //================================================================================

while(1) {

remote_2272_deco()//接收遥控码

work()//控制输出

LED0 =!LED0

}

}

编码解码芯片PT2262/PT2272芯片原理简介:

PT2262/2272是台湾普城公司生产的一种CMOS工艺制造的低功耗低价位通用编解码电路,PT2262/2272最多可有12位(A0-A11)三态地址端管脚(悬空,接高电平,接低电平),任意组合可提供531441地址码,PT2262最多可有6位(D0-D5)数据端管脚,设定的地址码和数据码从17脚串行输出,可用于无线遥控发射电路。

编码芯片PT2262发出的编码信号由:地址码、数据码、同步码组成一个完整的码字,解码芯片PT2272接收到信号后,其地址码经过两次比较核对后,VT脚才输出高电平,与此同时相应的数据脚也输出高电平,如果发送端一直按住按键,编码芯片也会连续发射。当发射机没有按键按下时,PT2262不接通电源,其17脚为低电平,所以315MHz的高频发射电路不工作,当有按键按下时,PT2262得电工作,其第17脚输出经调制的串行数据信号,当17脚为高电平期间315MHz的高频发射电路起振并发射等幅高频信号,当17脚为低平期间315MHz的高频发射电路停止振荡,所以高频发射电路完全收控于PT2262的17脚输出的数字信号,从而对高频电路完成幅度键控(ASK调制)相当于调制度为100%的调幅。

PT2262/2272特厅歼点:CMOS工艺制造,低功耗,外部元器件少,RC振荡电阻,工作电压范围宽:2.6~15v ,数据最多可达6位,地址码最多可达531441种。应用范围:车辆防盗系统、家庭防盗系统、遥控玩具、其他电器遥控。

名称  管脚 说 明

A0-A11 1-8、10-13

地址管脚,用于进行地址编码,可置为“0”,“1”,“f”(悬空),

D0-D5 7-8、10-13 数据输入端,有一个为“1”即有编码发出,内部下拉

Vcc 18 电源正端(+)

Vss 9 电源负端(-)

TE 14 编码启动端,用于多数据的编码发射,低电平有效;

OSC1 16 振荡电阻输入端,与OSC2所接电阻决定振荡频率;

OSC2 15 振荡电阻振荡器输出端;

Dout 17 编码输出端(正常时为低电平)

在具体的应用中,外接振荡电阻可根据需要进行适当的调节,阻值越大振荡频率越慢,编码的宽度越大,发码一帧的时间越长。网站上大部分产品都是用2262/1.2M=2272/200K组合的,少量产品用2262/4.7M=2272/820K。

名称  管脚 说 明

A0-A11 1-8、10-13

地址管脚,用于进行地址编码,可置为“0”,“1”,“f”(悬空),必须与2262一致,否则不解码

D0-D5 7-8、10-13 地址或数据管脚,当做为数据管脚时,只有在地址码与2262一致,数据管脚才能输出与2262数据端对应的高电平,否则输出为低电平,锁存型只有在接收到下一数据才能转换

Vcc 18 电源正端(+)

Vss 9 电源负端(-)

DIN 14 数据信号输入端,来自接收模块输出端

OSC1 16 振荡电阻输入端,与OSC2所接电阻决定振荡频率;

OSC2 15 振荡电阻振荡器输出端;

VT 17 解码有效确认 输出端(常低)解码有效变成高电平(瞬态)

地址码和数据码都用宽度不同的脉冲来表示,两个窄脉冲表示“0”;两个宽脉冲表示“1”;一个窄脉冲和一个宽脉冲表示“F”也就是地址码的“悬空”。

上面是我们从超再生接收模块信号输出脚上截获的一段波形,可以明显看到,图上半部分是一组一组的字码,每组字码之间有同步码隔开,所以我们如果用单片机软件解码时,程序只要判断出同步码握伏简,然后对后面的字码进行脉冲宽度识别即可。图下部分是放大的一组字码:一个字码由12位AD码(地址码加数据码,比如8位地址码加4位数据码)组成,每个AD位用两个脉冲来代表:两个窄脉冲表示“0”;两个宽脉冲表示“1”;一个窄脉冲和一个宽脉冲表示“F”也就是地址码的“悬空”

2262每次发射时至少发射4组字码,2272只有在连续两次检测到相同的地址码加数据码才会把数据码中的“1”驱动相应的数据输段裤出端为高电平和驱动VT端同步为高电平。因为无线发射的特点,第一组字码非常容易受零电平干扰,往往会产生误码,所以程序可以丢弃处理。

PT2272解码芯片有不同的后缀,表示不同的功能,有L4/M4/L6/M6之分,其中L表示锁存输出,数据只要成功接收就能一直保持对应的电平状态,直到下次遥控数据发生变化时改变。M表示非锁存输出,数据脚输出的电平是瞬时的而且和发射端是否发射相对应,可以用于类似点动的控制。后缀的6和4表示有几路并行的控制通道,当采用4路并行数据时(PT2272-M4),对应的地址编码应该是8位,如果采用6路的并行数据时(PT2272-M6),对应的地址编码应该是6位。

PT2262/2272芯片的地址编码设定和修改:

在通常使用中,我们一般采用8位地址码和4位数据码,这时编码电路PT2262和解码PT2272的第1~8脚为地址设定脚,有三种状态可供选择:悬空、接正电源、接地三种状态,3的8次方为6561,所以地址编码不重复度为6561组,只有发射端PT2262和接收端PT2272的地址编码完全相同,才能配对使用,遥控模块的生产厂家为了便于生产管理,出厂时遥控模块的PT2262和PT2272的八位地址编码端全部悬空,这样用户可以很方便选择各种编码状态,用户如果想改变地址编码,只要将PT2262和PT2272的1~8脚设置相同即可,例如将发射机的PT2262的第1脚接地第5脚接正电源,其它引脚悬空,那么接收机的PT2272只要也第1脚接地第5脚接正电源,其它引脚悬空就能实现配对接收。当两者地址编码完全一致时,接收机对应的D1~D4端输出约4V互锁高电平控制信号,同时VT端也输出解码有效高电平信号。用户可将这些信号加一级放大,便可驱动继电器、功率三极管等进行负载遥控开关 *** 纵。

我们网站提供的遥控类产品上一般都预留地址编码区,采用焊锡搭焊的方式来选择:悬空、接正电源、接地三种状态,出厂是一般都悬空,便于客户自己修改地址码。这里我们以常用的超再生插针式接收板A-L4的跳线区为例:

网友可以看到,跳线区是由三排焊盘组成,中间的8个焊盘是PT2272解码芯片的第1~8脚,最左边有1字样的是芯片的第一脚,最上面的一排焊盘上标有L字样,表示和电源地连同,如果用万用表测量会发现和PT2272的第9脚连同最下面的一排焊盘上标有H字样,表示和正电源连同,如果用万用表测量会发现和PT2272的第18脚连同.所谓的设置地址码就是用焊锡将上下相邻的焊盘用焊锡桥搭短路起来,例如将第一脚和上面的焊盘L用焊锡短路后就相当于将PT2272芯片的第一脚设置为接地,同理将第一脚和下面的焊盘H用焊锡短路后就相当于将PT2272芯片的第一脚设置为接正电源,如果什么都不接就是表示悬空。

设置地址码的原则是:同一个系统地址码必须一致;不同的系统可以依靠不同的地址码加以区分。至于设置什么样的地址码完全随客户喜欢。

PT2262和PT2272除地址编码必须完全一致外,振荡电阻还必须匹配,否则接收距离会变近甚至无法接收,随着技术的发展市场上出现一批兼容芯片,在实际使用中只要对振荡电阻稍做改动就能配套使用,根据我们网站的实际使用经验,下面的参数匹配效果较好:

编码发射芯片振荡的电阻 同步位宽度 窄脉冲宽度 宽脉冲宽度 配套的解码接收芯片振荡电阻

SC/PT2262 SC2260-R4

(不同厂家参数有区别)    PT2272/SC2272

1.2M    200K

1.5M 5.1M 5毫秒 150微秒 450微秒 270K

2.2M     390K

3.3M 12M 10毫秒 320微秒 960微秒 680K

4.7M 20M 14毫秒 450微秒 1350微秒 820K

2262 IR是2262系列用于红外遥控的专用芯片,可以按照下面的图纸进行接线,可以通过调整发射端Rosc电阻的大小使接收距离最远,发射端电阻的调整范围390~420K。

注意:批号为 703780 的 SC2262IR DIP18 的芯片振荡电阻请选用510K!

邮箱有吗?

我建议你不要用单片机解码,我刚刚搞的,编码芯片是EV1527,我已经用逻辑分析仪分解出信号调制发射之前的原始信号,就是同步码加地址码之类的,很纯的。但用逻辑分析仪分析超再生接收模块的输出口信号时,干扰信号不断,单片机即使能解码也需要灰常灰常强的编程。

单片机解码还有个问题,即使解码了,还得把地址码存EEPROM,以后接收信号以对比,我都准备换TDH6300芯片解码了,还带学习功能的。

今晚回去把超再生接收模块的供电电源屏蔽下,看是否是电源干扰。有点可确定的,工业上有用单片机解码的,我的超再生接收模块就是从家里坏了的报警器主机上拆的,上面就没用解码芯片直接用的是单片机口,此单片机伟STC抗干扰系列的。但我逻辑分析仪测试的时候没用单片机供电,用的一个独立电源供电的,照理不是单片机影响的,此模块也是上面拆的,照理也不会有问题。

最后说下:如果保证信号相对较纯的时候,我有个想法(未证实),用单片机检测高低电平脉冲宽度大致比例,接近芯片手册上的介绍,然后将各位地址存入EEPROM,下次与新收到的地址态梁比较

**********************************************************************************************************************

最新实践已经成功学习并识别不同的PT2262,EV1527即将可以修改即可,EV1527和PT2262脉冲数一样,EV1527是24+1个脉冲,PT2262是12*2+1个脉冲,以下是程序核心原理:根据同步码的低电平时间,在任何一个下降沿开外部中断,并定时(时间为同步码低电平时间一半再少点),定时器中断产生时,查看这段时间里下降沿次数,如大于0证明不是同步码低电平,为0继续,假设进入同步码低电平时间段(因为有杂波存在低电平时间较长),在第一个高脉冲下降沿的时候开定时,定时时间取全部脉冲时间+同步码低电平时间弊碰一半,定时中断结束时查看这段时间里的脉冲个数,如果为上面提到的25则进入正式阶段。利用定时器查看每两个高脉冲的宽度,取定时器TH0里面的值,一般宽脉冲为3或4,低脉冲为1,通过除法比值确定前后两个脉冲的比值(此法容错高)。因为一个程序要识别PT2262即EV1527,所以中间要先加识别脉冲是PT2262还是EV1527的,PT2262前8个信号即8*2个脉冲不会出现先宽后窄的脉冲的,如出现即为EV1527,PT2262最后4个信号即4*2个脉冲里每两个是相等,如不等即为EV1527,当然如都相等也不一定是PT2262(EV1527四个按键全部没按情况下也是一样,但一般不出现此情况,忽略掉)。里面经常要用到某个地址作为标示,如30H内存处,某种情况值为0,另一种情况为1,然后再程序通过检测该值,决定走那种程序,好了以上全部是自己查阅各种资料及实践所得的经验,为了帮助广大的学友少走弯路,或许有其他的好办法,就靠大家的悟性了,我因为有虚拟逻辑分析仪,所以信号容易分析。

*********************************************************************************************************

最新已经帆卜运解码成功,单片机是STC89C52,我用单片机可以同时解码EV1527和PT2262芯片,也把代码单独分开成两个独立的,带学习功能,代码里注释的很清楚,代码已完整,根据自己的硬件更改相应的IO设置就可以直接使用,新浪共享网站可以查询PT2262.TXT,EV1527.TXT,CODE.TXT都能搜到


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8262744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存