资源描述
关于用PIC单片机红外遥控的编码与解码一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)接收时:如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断例程如下(用来解6221;分频比为256)RF:BTFSCPORTB,2;B2口用做接收口GOTORF1BTFSSDOWNBIT;检测下降沿标制CLRFRTCCOUNTBSFDOWNBIT;制下降沿标制BTFSSUPBIT;检测上升沿标制RETLW0BTFSCIDBIT;检测码头标制GOTORF3MOVLW2AHSUBWFRTCCOUNT,0BTFSSSTATUS,0GOTORF2MOVLW36HSUBWFRTCCOUNT,0BTFSCSTATUS,0GOTORF2BTFSCIDBITGOTORF3MOVLW.8MOVWFLOOPMOVLW.3MOVWFLOOPCOUNTCLRFDATACOUNTBSFIDBITBSFDOWNBITBCFUPBITCLRFRTCCOUNTRETLW0RF1:BTFSSDOWNBITRETLW0BSFUPBITRETLW0RF2:BCFDOWNBITBCFUPBITBCFIDBITCLRFRTCCOUNTRETLW0;遥控接收RF3:MOVLW02HSUBWFRTCCOUNT,0BTFSSSTATUS,0GOTORF4MOVLW0CHSUBWFRTCCOUNT,0BTFSSSTATUS,0GOTORF4GOTORF2RF4:MOVLW08HSUBWFRTCCOUNT,0BTFSCSTATUS,0BSF3H,0MOVLW07HSUBWFRTCCOUNT,0BCF3H,0RLFDATACOUNT,1BSFDOWNBITBCFUPBITCLRFRTCCOUNTDECFSZLOOP,1RETLW0MOVLW.8MOVWFLOOPDECFSZLOOPCOUNTRETLW0BSFRFBIT;制接收完标制BCFDOWNBITBCFUPBITBCFIDBITCLRFRTCCOUNTRETLW0/TIME:BTFSCTIMEPD1GOTOTIME1MOVFRTCC,0;(MOVWFTIMEONEBSFTIMEPD1RETLW0;定时查寻TIME1:MOVFRTCC,0SUBWFTIMEONE,0BTFSCSTATUS,2RETLW0BCFTIMEPD1INCFRTCCOUNT,1RETLW0/在这里我是用查询的方式来定时的(RTCCOUNT)只是在解码时不需要去追求时间精度;我是去查RTCC有没有发生跳变如有则表示时间过了256US-RTCCOUNT加一;这样做有一个好处-你不必去管RTCC具体的值是多少,(RTCC去做精确的时钟定时;在这个查询的子程序中你可以去判断键扫,显示刷新,驱动步进电机等等)相应的C代码如下:unsignedcharrfcount,loop,rftime,/查询定时器k;bitrfbit,/接收完标制lowbit1,lowbit2,downbit,rfgobit;unsignedchardispcount5;结果#definerfinRC6/rf()/遥控接收if(rfbit=0)if(lowbit1=0)&(rfin=0)downbit=1;rftime=0;lowbit1=1;return;if(lowbit1=1)&(rfin=1)lowbit2=1;return;if(lowbit1=1)&(lowbit2=1)&(RC6=0)lowbit1=0;lowbit2=0;if(rftime=40)&(downbit=1)遥控接收;rfgobit=1;loop=0;rfcount=0;k=1;rftime=0;return;rfcount=rfcount+1;loop=loop+1;if(rfcount=31)rfgobit=0;downbit=0;rfcount=0;rfbit=1;loop=0;return;if(rftime=7)&(rfgobit=1)dispcountk=dispcountk|0x80;rftime=0;if(loop=8)k=k+1;loop=0;return;dispcountk=dispcountk1;return;if(rftime1;return;(查询子程序同汇编)假如用中断的话也可用时间查询的方法,只是接收口改用带中断的口线;RB4-RB7,CCP1,CCP2,都可以。建议不要用RB0(他当按键输入最好用);还有就是解码时的容陷和误码处理(有一种写法是在解码移位时利用进位标制C同时移位;我个人认为不太好,因为只要差一位没接收到,整个接收到的都是误码且浪费时间)2在谈发送原理是接收的逆过程例程如下(用来发6221;分频比为256);/READDIGT:MOVFSENDLOOP,0ADDWFPC,1GOTOSENDC4GOTOSENDC3GOTOSENDC2GOTOSENDC1GOTOSENDC0;/SENDC0:MOVFC4COUNT,0;读要发的数据(假设要发5个字)RETURNSENDC1:MOVFC3COUNT,0RETURNSENDC2:RETURNSENDC3:MOVFC1COUNT,0RETURNSENDC4:MOVFC0COUNT,0RETURN;/SENDBIT:CLRFTIMEBCFPORTB,1SENDBIT1:CLRWDTMOVLW.35SUBWFTIME,0BTFSSSTATUS,2GOTOSENDBIT1CLRFTIMEBSFPORTB,1SENDBIT2:CLRWDTMOVLW.18SUBWFTIME,0BTFSSSTATUS,2GOTOSENDBIT2CLRFSENDLOOP;码头数据发送/SENDBIT3:CLRWDTBCFINTCON,7CALLREADDIGTMOVWFSENDCOUNTBSFINTCON,7CALLSENDDIGTINCFSENDLOOP,1MOVLW.5SUBWFSENDLOOP,0BTFSSSTATUS,2GOTOSENDBIT3CLRFTIMEBCFPORTB,1SENDDIGT5:CLRWDTMOVLW.2;加发一个结束位SUBWFTIME,0BTFSSSTATUS,2GOTOSENDDIGT5BSFPORTB,1BSFSTARTBITRETURN;/SENDDIGT:;实现0和1的发送MOVLW.8MOVWFLOOPSENDCOUNTSENDDIGTGO:BTFSSSENDCOUNT,7GOTOZERSENDCLRFTIMESENDDIGT1:CLRWDTBCFPORTB,1MOVLW.2SUBWFTIME,0BTFSSSTATUS,2GOTOSENDDIGT1CLRFTIMESENDDIGT2:CLRWDTBSFPORTB,1MOVLW.6SUBWFTIME,0BTFSSSTATUS,2GOTOSENDDIGT2GOTOSENDOVERZERSEND:CLRFTIMESENDDIGT3:CLRWDTBCFPORTB,1MOVLW.2SUBWFTIME,0BTFSSSTATUS,2GOTOSENDDIGT3CLRFTIMESENDDIGT4:CLRWDTBSFPORTB,1BTFSSSTATUS,2GOTOSENDDIGT4SENDOVER:RLFSENDCOUNT,1DECFSZLOOPSENDCOUNTGOTOSENDDIGTGORETURN相应的C代码如下:(C5口是发送口)#include#include#includeunsignedchardispcount5;要发送的码值unsignedchari,k,data,rfbit,zbit,rfgobit;#pragmainterrupt_level1interruptadint(void)if(TMR1IF=1)TMR1IF=0;TMR1L=0b00010111;TMR1H=0b11111100;rfbit=rfbit+1;发送指针加一send();/send()if(rfgobit=0)switch(rfbit)case1:RC5=0;break;case6:RC5=1;break;case7:RC5=0;rfgobit=1;制发送完标制rfbit=0;break;default:break;if(rfgobit=1)zbit=dispcounti&0b00000001;switch(rfbit)case1:RC5=1;break;case2:if(zbit=0)RC5=0;rfbit=0;rf();break;case3:if(zbit=1)RC5=0;rfbit=0;rf();break;default:break;/rf()k=k+1;if(k=8)i=i+1;k=0;if(i=6)rfgobit=0;TMR1H=0;TMR1L=0;RC5=1;dispcount1=0xaa;dispcount2=0xbb;dispcount3=0xcc;dispcount4=0xdd;dispcount5=0xee;return;dispcounti=dispcounti1;/main()di();TRISC=0b11011111;TRISA=0b111111;TRISB=0b11111111;i=1;k=0;TMR1H=0b11111100;TMR1L=0b00010111;T1CON=1;TMR1IE=1;RC5=1;PEIE=1;ei();dispcount1=0xaa;dispcount2=0xbb;dispcount3=0xcc;dispcount4=0xdd;dispcount5=0xee;while(1)5这两个程序只是一个演示例程在实际运用中可变通的把这种发送与接受用于两机之间的通讯(好处是移植性好,抗干扰好且一发一收只要两根线或一根线)另外如要产生载波(38KHZ)的话可用其输出口去调制38KHZ发生源(比如555电路,PWM)来得到,或干脆用软件来实现(不过难度较大;不如用带38KHZ的单片机来做)
展开阅读全文