关于用PIC单片机红外遥控的编码与解码

上传人:小** 文档编号:210920341 上传时间:2023-05-18 格式:DOC 页数:20 大小:50.50KB
返回 下载 相关 举报
关于用PIC单片机红外遥控的编码与解码_第1页
第1页 / 共20页
关于用PIC单片机红外遥控的编码与解码_第2页
第2页 / 共20页
关于用PIC单片机红外遥控的编码与解码_第3页
第3页 / 共20页
点击查看更多>>
资源描述
关于用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的单片机来做)
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!