完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#define RF P00
unsigned char RF_Code[3]; //遥控码值 bit RF_SyncFlag; //同步信号标志,为1表示已接受到同步信号 //unsigned char RF; unsigned char Decode_ok; //解码成功 unsigned char High_WidthLow_Width; //高低电平宽度 unsigned char RF_BitCount; //接收到第几位编码 unsigned char bma1bma2bma3bma4; //接收编码 unsigned char mma1mma2mma3mma4; //用于接收过程存放遥控编码,编码比较两次,这是第一次 unsigned char mmb1mmb2mmb3mmb4; //用于接收过程存放遥控编码,这是第二次 unsigned char rf_ok1rf_ok2rf_ok; //解码过程中的临时接收成功编码标志,接收到一个完整的遥控命令后置1,通知解码程序可以解码了 unsigned char Last_state; //保存上一个查询到的电平状态 unsigned char temp_htemp_l; #define LED1 P03 #define LED2 P01 bit bt_auto; unsigned ss1; void RF_MainLoop(void) { TMOD=0x10; TH1=0xff; TL1=0x88; ET1=1; TR1=1; EA=1; if(Decode_ok==1) { if(RF_Code[0]==0xc8) { LED1=0; Delay_ms(50); } if(RF_Code[1]==0xc4) { LED1=1; Delay_ms(50); } if(RF_Code[2]==0xc2) { LED2=0; Delay_ms(50); } if(RF_Code[3]==0xc1) { LED2=1; Delay_ms(50); } } } void timer1 (void) interrupt 3 { if(!bt_auto) { TL1=0x70; TH1=0xfb; } else { TL1=temp_l; TH1=temp_h; } TF1=0; // 清除T1中断标志 if(!RF) { Low_Width++; Last_state=0; // 检测到低电平 低电平时间加1记录本次电平状态 } else // 检测到高电平 { High_Width++; if(!Last_state) // 检测到从低到高的跳变已检测到一个完整(高-低)电平周期 { if(((High_Width>=2) (High_Width<=8)) ((Low_Width>=50) (Low_Width<=190))) //判同步码 2/5 110/140 { if((Low_Width>=110) (Low_Width<=140)) //根据不同 同步码 宽度,T0加载不同初值 { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; } else { if((Low_Width>=140) (Low_Width<=160)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xfe; temp_l=0x6b; } else { if((Low_Width>=160) (Low_Width<=190)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xfd; temp_l=0xdc; } else { if((Low_Width>=70) (Low_Width<=90)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x30; } else { if((Low_Width>=90) (Low_Width<=110)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x00; } else { if((Low_Width>=50) (Low_Width<=70)) { RF_BitCount=0; RF_SyncFlag=1; bma1=0; bma2=0; bma3=0; bt_auto=0; temp_h=0xff; temp_l=0x7a; } } } } } } } else if ((RF_SyncFlag) ((Low_Width>=10) (Low_Width<=14))) // 10/14 { RF_BitCount++; //已经接收到同步码判0 if(RF_BitCount==24) { if(!rf_ok1) { mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4; //将接收到的编码复制到解码寄存器中 rf_ok1=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; s=1500; } else { if(!rf_ok2) mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4; //将接收到的编码复制到解码寄存器中 rf_ok2=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; } } } else if((RF_SyncFlag) ((Low_Width>=2) (Low_Width<=8))) // 3/5 { switch(RF_BitCount) { 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; } case 17: { bma3=bma3 | 0x40; break; } case 18: { bma3=bma3 | 0x20; break; } case 19: { bma3=bma3 | 0x10; break; } case 20: { bma4=bma4 | 0x80; break; }//按键状态第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; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; s=1500; break; } else { mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//将再次接收到的编码复制到解码寄存器中, rf_ok2=1; // 通知解码子程序可以解码了 RF_SyncFlag=0; bt_auto=0; break; } } } RF_BitCount++; } else { RF_BitCount=0; RF_SyncFlag=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0; High_Width=1; Low_Width=0; } //接收到不符合的高-低电平序列 Low_Width=0;High_Width=1; } Last_state=1; // 记录本次电平状态 } if(rf_ok1) //规定时间内接受到2帧相同的编码数据才有效 { s--; if(!s) rf_ok1=0; if(rf_ok2) { if((mma1==mmb1) (mma2==mmb2) (mma3==mmb3) (mma4==mmb4)) { rf_ok=1; rf_ok1=0; rf_ok2=0; } else { rf_ok=0; rf_ok1=0; rf_ok2=0; } } } if((rf_ok)) //判断是否接收成功 { EA=0; rf_ok=0; RF_Code[0]=mma4 0x80; //取按键码 RF_Code[1]=mma4 0x40; RF_Code[2]=mma4 0x20; RF_Code[3]=mma4 0x10; Decode_ok=1; EA=1; } } |
|
相关推荐
1个回答
|
|
1527是滚动码,单片机不能解码,只有固定码才可以用单片机解码
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
515 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
515 浏览 0 评论
780 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1360 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
572 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11755 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 18:36 , Processed in 0.810279 second(s), Total 71, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号