EV1527 / PT2262学习型接收解码 315或433M频率
单片机源程序如下:
- /****************************************************************
- * 作者 :maigaokai
- *************************************************************/
- /*
- 1、EV1527/PT2262 按键解码输出,并有解码有效输出端。
- 2、程序采用中断嵌套结构,定时时间准确,可轻松集成到您现有程序中,解码精度不受其他程序块影响。
- 3、通过学习键可学习40个遥控器编码,使用芯片自带EEPROM,无需外挂存储。
- 4、提供keil5 c代码,有详细注释,提供网络技术支持。
- 该源码适合初学者研究,或想在原有产品中增加功能又缺乏此类经验的朋友。
- !!!按一下学习键指示灯亮一下灭,松开,再按一下遥控器,学习指示灯闪一下,表示学习成功
- 学习成功后,才能接收此遥控器的数据,否则没反应!!!
- !!!按下学习按键6秒之内松开,超过6秒后无效并清除以前存储的遥控器数据
- */
- #include "main.h"
- bit old_bit; //保存上一次查询到的电平状态
- bit tb_ok; //接收到同步的马时置1
- bit rf_ok; //接收到一个完整的遥控命令后置1,通知解码程序可以解码了
- bit study; //进入学习状态标志
- bit rf_ok1,rf_ok2; //接收成功临时标志
- uchar hh_w,ll_w; //高,低电平宽度
- uchar ma_n; //接收到第几位编码了
- uchar bma1,bma2,bma3,bma4; //用于接收过程存放遥控编码
- uchar mma1,mma2,mma3,mma4; //第一次接收到的编码,用于解码过程
- uchar mmb1,mmb2,mmb3,mmb4; //第二次接收到的编码
- uchar temp_T0; //t初值
- uint s_tim; //定时
- #if 1
- void rx_data()
- {
- uchar x;
-
-
- TMR0=100;
- TMR00;
-
-
-
-
- if (!RF) { ll_w++;old_bit=0; } // 检测到低电平 低电平时间加1,记录本次电平状态 old_rc5=保存上一次查询到的电平状态
-
-
-
- else // 检测到高电平
- {
-
-
- hh_w++;//记录高电平时间
-
- if (!old_bit)// 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
- {
-
-
-
-
- if (((hh_w>=2)&&(hh_w<=7))&&((ll_w>=50)&&(ll_w<=180))) //判同步码
- { //下面是同步码低电平判断
- if((ll_w>=100)&&(ll_w<=180))//PT2262=4.7M电阻,EV1527=390K
- {ma_n=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bma4=0;
- }
-
- }
-
-
- else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=16))) //数据低电平
- {
- ma_n++; //已经接收到同步码,判为0
- if(ma_n>23)
- {
- if(!rf_ok1)
- {
- mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
- rf_ok1=1;
- ma_n=0;
- tb_ok=0;
- s_tim=2500;
- }
- else
- {
- mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将接收到的编码复制到解码寄存器中
- rf_ok2=1;
- ma_n=0;
- tb_ok=0;
- }
-
- }
- }
-
-
-
-
- else if ((tb_ok)&&((ll_w>=3)&&(ll_w<=6))) //数据高电平
- { switch (ma_n)
- {
- case 0 : { bma1=bma1 | 0x80; break; }//遥控地址编码第1位
- case 1 : { bma1=bma1 | 0x40; break; }
- case 2 : { bma1=bma1 | 0x20; break; }
- case 3 : { bma1=bma1 | 0x10; break; }
- case 4 : { bma1=bma1 | 0x08; break; }
- case 5 : { bma1=bma1 | 0x04; break; }
- case 6 : { bma1=bma1 | 0x02; break; }
- case 7 : { bma1=bma1 | 0x01; break; }
- case 8 : { bma2=bma2 | 0x80; break; }
- case 9 : { bma2=bma2 | 0x40; break; }
- case 10: { bma2=bma2 | 0x20; break; }
- case 11: { bma2=bma2 | 0x10; break; }
- case 12: { bma2=bma2 | 0x08; break; }
- case 13: { bma2=bma2 | 0x04; break; }
- case 14: { bma2=bma2 | 0x02; break; }
- case 15: { bma2=bma2 | 0x01; break; }
- case 16: { bma3=bma3 | 0x80; break; }//2262按键码第1位
- case 17: { bma3=bma3 | 0x40; break; }
- case 18: { bma3=bma3 | 0x20; break; }
- case 19: { bma3=bma3 | 0x10; break; }
- case 20: { bma4=bma4 | 0x80; break; }//1527按键码第1位
- case 21: { bma4=bma4 | 0x40; break; }
- case 22: { bma4=bma4 | 0x20; break; }
- case 23:
- { bma4=bma4 | 0x10;
- if(!rf_ok1)
- {
- mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//将接收到的编码复制到解码寄存器中
- rf_ok1=1;
- tb_ok=0;
- ma_n=0;
- s_tim=2500;
- break;
- }
- else
- {
- mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将再次接收到的编码复制到解码寄存器中,
- rf_ok2=1;
- tb_ok=0;
- ma_n=0;
- break;
- }
-
- }
- }
- ma_n++;
-
- }
-
-
- else {ma_n=0; tb_ok=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;} //接收到不符合的高-低电平序列
-
- ll_w=0;hh_w=1;
- }
-
-
- old_bit=1; // 记录本次电平状态
- }
-
-
-
-
-
- if(rf_ok1) //规定时间内接受到2帧相同的编码数据才有效
- {
-
-
-
- s_tim--;
- if(!s_tim) rf_ok1=0;
- if(rf_ok2)
- {
-
-
- if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//比较两次接收到的编码是否一致 OK
- {
-
- rf_ok=1;
- rf_ok1=0;
- rf_ok2=0;
- }
- else//接收数据无效
- {
- rf_ok=0;
- rf_ok1=0;
- rf_ok2=0;
- }
-
- }
- }
-
-
-
-
- #if defined(STUDY_NOSET)
- if(rf_ok) //判断
- {
- GIE=0;
- rf_ok=0;
- if(((mma3==0xc0)&&(!mma4))|((mma3==0x30)&&(!mma4))|((!mma3)&&(mma4==0xc0))|((!mma3)&&(mma4==0x30))) //判断是2262编码
- {
- D0=(mma3 - 0xc0); //取按键码
- D1=(mma3 - 0x30);
- D2=(mma4 - 0xc0);
- D3=(mma4 - 0x30);
-
- decode_ok=0;
- s=1500;
-
- }
- else //判断是1527编码
- {
-
- D0=(mma4 - 0x80); //取按键码
- D1=(mma4 - 0x40);
- D2=(mma4 - 0x20);
- D3=(mma4 - 0x10);
-
- decode_ok=0;
- s=1500; //解码有效输出时间
-
- }
- GIE=1;
- }
- #endif
-
-
-
- #if defined(STUDY_SET)
- ////////////////////////////////////////////////////////////////////
- if((rf_ok)&&(!study)) //判断是否是学习状态
- {
-
- rf_ok=0;
- if(((mma3==0xc0)&&(!mma4))|((mma3==0x30)&&(!mma4))|((!mma3)&&(mma4==0xc0))|((!mma3)&&(mma4==0x30))) //判断是2262编码
- {
- for(x=0;x<40;x++)
- {
- if((mma1==EEPROM_read(x*3+1))&&(mma2==EEPROM_read(x*3+2)))
- {
- D0=(mma3 - 0xc0); //取按键码
- D1=(mma3 - 0x30);
- D2=(mma4 - 0xc0);
- D3=(mma4 - 0x30);
-
- decode_ok=0;
- s_tim=1500;
- break;
- }
-
- }
-
- }
- else //判断是1527编码
- {
- for(x=0;x<40;x++)
- {
- if((mma1==EEPROM_read(x*3+1))&&(mma2==EEPROM_read(x*3+2))&&(mma3==EEPROM_read(x*3+3)))
- {
- D0=(mma4 - 0x80); //取按键码
- D1=(mma4 - 0x40);
- D2=(mma4 - 0x20);
- D3=(mma4 - 0x10);
-
- decode_ok=0;
- s_tim=1500; //解码有效输出时间
- break;
- }
-
- }
-
- }
-
- }
- /////////////////////////////////////////////////////////////////////////
- #endif
-
-
-
-
-
-
-
-
-
- if(!decode_ok)//解码有效输出
- {
- s_tim--;
- if(!s_tim)
- {
- decode_ok=1;//关信号灯
- if(!LM_SEL) // 锁存/暂态 选择
- {
- D0=1;
- D1=1;
- D2=1;
- D3=1;
- }
- }
-
- }
- }
- #endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void KEY_study() //遥控器学习
- {
- uchar num_rf;
- uchar d_num=0;
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 Keil代码下载:
Keil代码.7z
(24.53 KB, 下载次数: 80)
|