最精间的PT2262解码程序与大家共享
我看过很多PT2262软件解码程序,都是用定时器测量脉冲宽度。占用系统太多资源。我自己编写的程序不用定时器,不用中断,代码最少。发射端为PT2262 3.3M 的电阻 接收端为 M8 内部1M RC振荡。解码成功后输出D口显示。编译软件为 ICCAVR。http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241626.JPG
(原文件名:2272.JPG)
#include <iom8v.h>
#include <macros.h>
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;i<n;i++)
{
delay_ms();
}
}
void spaz(void) //响蜂鸣器
{
PORTC|=(1<<5);
delay_nms(50);
PORTC&=~(1<<5);
}
unsigned long decode(void) //无线解码
{
unsigned long DATA; //记录数据
unsigned char count,i; //暂时计数
/*一共接收三字节*/
DATA=0; //
for (count=0;count<24;count++) //开始收集
{
/*测量高电平宽度*/
i=0; //宽度计数
while (PINC&(1<<4)) //高位计数
{
asm("nop"); //
i++; //计数增加
if (i>192) 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; //对比宽度
}
/*解码成功返结果*/
returnDATA; //成功返回
/*有误码结束解码*/
end:
return 0; //误码结束
}
void main(void)
{
unsigned long DATA; //
unsigned char D; //
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=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; //输出显示
}
}
}
} 顶,收藏研究一下再说,如果不用中断岂不是很消耗CPU? http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241061.JPG
(原文件名:2272.JPG)
http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_241062.JPG
(原文件名:2271.JPG) 顶! 和2272解码相比,哪个更好距离更远? 该解码程序流程我已用于量产的商业产品上,从没有出现过误码。如用PIC单片机解码距离和PT2272一样远。上面只解码成功后输出编码显示。其它功能可以扩展。 收下了 楼主,能提供原理图吗? 楼主确定可靠么
只用解码估计还行,加上液晶、时钟芯片什么的估计就危险了 楼上说的没错,多用几个资源,你的延时就不准确了 单片机解码可行,但总感觉抗干扰能力不怎么好。比硬解码还是差一点。 解一个码要多久时间? 做个记号,不错 晕,不用定时器和中断那肯定要加要消耗大量的CPU资源,要么禁中断,要是开了中断,难以得到准确的时间,不用中断而且占用大量CPU时间,CPU不可能当个PT2272用吧!想必这个系统一扩展就难以适应了. 註釋很詳細, 頂! 接收模块在无信号状态下是收到很多杂波,如果用中断的话。MCU反而经常被中断,无法正常处理其它事情。如果是红外接收模块的话就可以,原为红外接收模块在无信号的状态下是高电平。可以多加液晶屏或其它模块,因为解程序是在限定的时间内如果没有正常(合适的电平)的脉冲出现,就会返回。在MCU外理其它任务后,调用解码程序就可以。我用PIC单片机解码已经做出量产的产品,从没出现误码。 楼主,你没看见“缺电路图,不能加酷”,快点加原理图吧。兄弟们等着。 有电路图了。COOL ! 加液晶可以, 如果系统要求加4位数码管,那情况会是怎么样呢?
扫描数码管程序放在主程序, 走不通, 接一个完整的 2262 码程序 30多ms 的
放中断扫描数码管也不形, 如果主程序在解码的过程中中断去扫描数码管了,那解码出错.
(很巧, 后果是, 1个码也收不到.)
楼主是做防盗器的不? 防盗器除了收码之外,没啥实时的操作,都是逻辑操作为多,楼主的那样防到主程序倒是没有问题.
就解码的方法来说, 楼主的办法没有错, 确实是行的通.
软解码跟硬解码没有的比, 我的 100多米就死翘翘了, 跟 2272没的比. 可能是技术问题吧,hoho
还有,解码还是用汇编比较爽,时间比较好精确的控制.
我一般是放倒中断里面做解码程序, 是时钟中断, 而不是 外部中断里面, 也就是每隔固定的时间采样无线接受脚的电平.(50us左右)
这样就可以调整整个系统了, 其他程序跟平时那样就可以了. 只是这个中断的有限级别比较高, 否则收码效果会受影响.
当然这样作会有误差,误差就是一个 +- 中断时间,那样测量出来的脉冲宽度会不是很准. 难道这个就是解码距离不能更加远的原因
吗? (我一般只能到100米左右), 也请楼主指教指教. 现在基本上都用2260了
还有软件延时解码的距离实在不敢恭维而且占用很大的cpu 精度不够 这要怎么说好呢,你先看看这个http://www.dianyuan.com/bbs/d/58/198344.html 用的就是这个解码流程,只不过用的是PIC的单片机,也是我自己做的。单片同时要接收解码,还要检测交流过零。 【18楼】 linyu0395 林'还有软件延时解码的距离实在不敢恭维而且占用很大的cpu 精度不够'
呵呵,
软件延时解码的距离丝毫不比中断解码差,反而在对付周期性的干扰上面有很大的效果。,
如;控制直流电极, 我用中断来解码,这个占用资源应该非常大,是无法正常进行其他功能吧?无线解码是干扰非常大,我处理方法是用双中断来相互处理。出现干扰的时候会自动关闭一段时间,因为无线接收一旦收到正常信号后,就好多了,一般来说软解码距离不如用专用芯片。但用软解码主要是灵活!我当时所做的代码会从引导中来测量出时间长度,这样就可以在一定范围内均可解码。而不必非对应一种电阻。 现在的摩托车防盗器95%都是用软件解码,软件声音,关键是成本呀! 收藏. 只要软件处理得好,接收距离不是问题,很多红外报警器都是采用软件。不过接收距离还和单片机的类型有关,像AVR,89C,等它的端口有对接收板有很大的干扰,晶振频率越高,干扰就大。像PIC,义隆,的单片机就没有很大的干扰,我用PIC12C508做软件解码,距离的PT2272解码一样远。控制要比硬件解码灵活。 我编译了怎么会出现下面的错误,请教是为什么
C:\iccv7avr\bin\imakew -f 2272.mak
iccavr -o 2272 -g -e:0x20000 -ucrtatmega.o -bfunc_lit:0xe4.0x20000 -dram_end:0x21ff -bdata:0x200.0x21ff -dhwstk_size:30 -beeprom:0.4096 -fihx_coff -S2 @2272.lk -lcatm128
!ERROR file 'crtatmega.o': undefined symbol '_main'
C:\iccv7avr\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1. Sun May 04 22:00:56 2008 这个先记下,还没时间仔细看 我晕,看样楼主还是个用汇编比较习惯的人.
今天刚好搞这东西.
以前在上大学的时候用这东西做过小区车辆管理系统.无线的地方就是用的这个模块.
但是接收部分我没有用单片机.而是直接将模块连接到max232上与电脑通信.上位机是用vb+access数据块做的一个系统.
下位机(发射)部分用了一块89c2051.当时做的时候pt2262和2272都没用.直接用串口发送接收.因为要求的距离不是很远.当时实际测试无线距离为30m(可以穿墙).
最近又买了几块拿来搞一搞,其实我觉得距离要是不太远的话.pt2262和pt2272都用不到.只要软件协议写的好都可以解决.
接收端没有接收到信号的时候是高低电平来回跳(真的很烦人).但是接收到信号后就会很稳定了.你协议写的不错的话用串口就ok了.我用的就是串口发送接收的.效果很不错.误码率基本是0. 记号 mark 我是用一片2051单独解码 解码后通过串口发送地址码 和数据码。发射端选用不同的震荡电阻 接受端可用拨码开关设置! 这东西我只做过双路的,学习一下 如果avr有低电平达到多长时间才中断的设置就好了,做这个解码就舒服多了
不知道avr有没有这样的设置 版主:其实我想问一下,图的最右边10引脚,接PB的是什么来的?是不是你万能板上那个现成的线路板模块?是不是PT2272解码模块来的? 收藏! 楼主,PB0是做什么的阿? 我觉得你的程序只解一组码就输出抗干扰能力不行 记号 顶起 主要是要处理好干扰的问题。 我是这样处理的:
信号输入正跳变中断程序只做一件事:定时记数器清零
在主程序中加入解码程序
解码程序从等待信号电平变低后读记数值开始
这样可以大幅度减少干扰信号引起的机器时间占用 标记一下.2272两块多钱一个啊. 做个记号,学习学习。 距离跟软硬解码有关?如果距离远了不太正常,只能说是冗余度设计得不好。 厉害!! 路过 楼主用下面这段代替计时器有什么优势啊,自己通过指令执行个数推算时间还不如让定时器算.
while (!(PINC&(1<<4))) //低位计数
{
asm("nop"); //
i++; //计数增加
if (i>224) goto end; //限时解码
}
/*低电平是否过窄*/
if (i<96) goto end; //对比宽度
} 收藏 记号. unsigned long decode(void) //无线解码
{
unsigned long DATA; //记录数据
unsigned char count,i; //暂时计数
我改成
unsigned long decode(void) //无线解码
{
unsigned long DATA; //记录数据
unsigned char count;
unsigned int i; //暂时计数
为什么一进主程序调用这个函数就没反应了?在decode函数后加个亮灯的指令 灯都不亮
大家帮帮忙看看 留下痕迹,方便以后查阅 记号 留下痕迹,方便以后查阅 註釋很詳細, 頂! 頂! d 软件解码,主要是基于成本考虑。
另外,CPU的高频谐波对接收灵敏度有很大影响,初学者和对RF不熟悉者还是用硬件解码的好。 不知道你们有没有试过....举个例子...
比如说用一PT2262 315MHz的遥控器..3.3M电阻
一号接收方案:
315M 超外差接收板..PT2272 M4 接收解码..(电阻配对)...
1.遥控器放在手上不动..按下发射键...接收正常...
2.按下发射键不放开, 不停的挥动手中的遥控器...这时接收已经不正常...PT2272的输出不断跳动...
二号接收方案:
同样的接收板...发射遥控器...
采用软件解码处理后...这种情况得已很好的解决...
用软件解码..在解决成本的问同时..可靠性还得以提高...当然不同的单片机型类..不一样的解码程式...接收距离也不一样.. 不错,我也实验一下 记号一下 正在搞红外学习空调控制器 或许有用 mark 请问一下作者,DATA*=2; //数据左移 ,相乘的话数据怎么能左移呢,我按照你的电路图作了一个,刷到M8后运行后,出现几个灯一起亮的情况,不知是怎么回事? 这是语言的技巧DATA <<= 1; DATA *= 2; 是一样的.....
这说明已经收到解码信号..是不是用1M的频度呀.. mark 顶 mark 顶一个 好 我也来发表一个用PIC做的,不好意思,用了定时器。不过抗干扰还好。 用硬件解码会好很多,但整个系统的成本会增加。 收下了 mark 看看 mark Mark mark! 我正在做这个模块但是苦于没有资料!谢了楼主顶死你 好东西,标注! hao 学习啦. 留个记号 今天试了下楼主的程序,可以使用。
不过好像有个缺点,需要改进。
PT2262发出来的码的每一位都是三种状态的 “0”,“1”,“三态”
也就是说如果地址是8位,数据是4位的话,这个不重复的地址(密码)只有2^8=256个,正常应该要有3^8=6561个。
不知说的对不对 MARK 我的遥控芯片是PT2213的芯片~~有什么区别的? 记号 以后肯定会用到! 我也顶一下,不知道能否说说解码的原理? 记下 【81楼】 hsztc
今天试了下楼主的程序,可以使用。
不过好像有个缺点,需要改进。
PT2262发出来的码的每一位都是三种状态的 “0”,“1”,“三态”
也就是说如果地址是8位,数据是4位的话,这个不重复的地址(密码)只有2^8=256个,正常应该要有3^8=6561个。
不知说的对不对
你可以参考一下《用PIC对PT2262进行三态解码(6561个地址),地址码设置方便》,这个帖子
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3447443&bbs_page_no=1&search_mode=4&search_text=cqgxh&bbs_id=9999 Mark,没准以后可以借鉴 刚买了模块,准备做实验,可以参考下,谢谢! 不错啊!支持 mark 2262发码,单片机软件解码还是可行的
我们公司一款产品就是用无线收发方式的 就是2262,软件解码,距离可达到30m(12V发射)
用了一年多了还算比较稳定 mark mark if (i>192) goto end;//限时解码
if (!((56>i)&(i>24))) goto end; //电平合法
if (!((168>i)&(i>72))) goto end; //电平合法
if (i>224) goto end; //限时解码
if (i<96) goto end; //对比宽度
while (PIND&(1<<PD2)) //高位计数
{
asm("nop"); //
i++; //计数增加
if (i>192) goto end;//限时解码
}
这个循环周期应该是5,在1M的时钟频率下,一个周期应该是1us,也就是一个循环5us,5*192=960us
在3.3M的电阻下,基本频率是f=10K,也就是100us,那么高电平时间为4*100=400us或12*100=1200us
不知道楼主那些常数是如何得来的? 根据什么来估算正确的范围呢 ? 也望知情的兄弟解答一下,谢谢。 好东西 马克 看看