PIC單片機(jī)紅外遙控編碼與解碼的問題
出處:ferry 發(fā)布于:2008-08-19 16:43:26
PIC單片機(jī)接收時(shí):
如果用54,57這類片子做的話有一定的難度(假如要做成實(shí)時(shí)控制的;比如說你還要驅(qū)動(dòng)顯示,驅(qū)動(dòng)步進(jìn)電機(jī),在加上幾個(gè)按鍵)原因就是這類片子沒有中斷
例程如下(用來解6221;分頻比為256)
RF:
BTFSC PORTB,2;;B2口用做接收口
GOTO RF1
BTFSS DOWNBIT;;檢測下降沿標(biāo)制
CLRF RTCCOUNT
BSF DOWNBIT;制下降沿標(biāo)制
BTFSS UPBIT;;檢測上升沿標(biāo)制
RETLW 0
BTFSC IDBIT;;檢測碼頭標(biāo)制
GOTO RF3
MOVLW 2AH
SUBWF RTCCOUNT,0
BTFSS STATUS,0
GOTO RF2
MOVLW 36H
SUBWF RTCCOUNT,0
BTFSC STATUS,0
GOTO RF2
BTFSC IDBIT
GOTO RF3
MOVLW .8
MOVWF LOOP
MOVLW .3
MOVWF LOOPCOUNT
CLRF DATACOUNT
BSF IDBIT
BSF DOWNBIT
BCF UPBIT
CLRF RTCCOUNT
RETLW 0
RF1:
BTFSS DOWNBIT
RETLW 0
BSF UPBIT
RETLW 0
RF2:
BCF DOWNBIT
BCF UPBIT
BCF IDBIT
CLRF RTCCOUNT
RETLW 0 ;遙控接收
RF3:
MOVLW 02H
SUBWF RTCCOUNT,0
BTFSS STATUS,0
GOTO RF4
MOVLW 0CH
SUBWF RTCCOUNT,0
BTFSS STATUS,0
GOTO RF4
GOTO RF2
RF4:
MOVLW 08H
SUBWF RTCCOUNT,0
BTFSC STATUS,0
BSF 3H,0
MOVLW 07H
SUBWF RTCCOUNT,0
BTFSS STATUS,0
BCF 3H,0
RLF DATACOUNT,1
BSF DOWNBIT
BCF UPBIT
CLRF RTCCOUNT
DECFSZ LOOP,1
RETLW 0
MOVLW .8
MOVWF LOOP
DECFSZ LOOPCOUNT
RETLW 0
BSF RFBIT;;制接收完標(biāo)制
BCF DOWNBIT
BCF UPBIT
BCF IDBIT
CLRF RTCCOUNT
RETLW 0
//////////////////////////////////////////////////////////
TIME:
BTFSC TIMEPD1
GOTO TIME1
MOVF RTCC,0;;(
MOVWF TIMEONE
BSF TIMEPD1
RETLW 0 ;定時(shí)查尋
TIME1:
MOVF RTCC,0
SUBWF TIMEONE,0
BTFSC STATUS,2
RETLW 0
BCF TIMEPD1
INCF RTCCOUNT,1
RETLW 0
////////////////////////////////////////////////
在這里我是用查詢的方式來定時(shí)的(RTCCOUNT)只是在解碼時(shí)不需要去追求時(shí)間;我是去查RTCC有沒有發(fā)生跳變?nèi)缬袆t表示時(shí)間過了 256US---RTCCOUNT加一;這樣做有一個(gè)好處---你不必去管RTCC具體的值是多少,(RTCC去做的時(shí)鐘定時(shí);在這個(gè)查詢的子程序中你可以去判斷鍵掃,顯示刷新,驅(qū)動(dòng)步進(jìn)電機(jī)等等)
相應(yīng)的C代碼如下:
unsigned char rfcount,
loop,
rftime,//查詢定時(shí)器
k;
bit rfbit, //接收完標(biāo)制
lowbit1,
lowbit2,
downbit,
rfgobit;
unsigned char dispcount[5];//結(jié)果
#define rfin RC6
////////////////////////////////////////////////////////////////////////////////
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))
{
dispcount[k]=dispcount[k]|0x80;
rftime=0;
if(loop==8)
{
k=k+1;
loop=0;
return;
}
dispcount[k]=dispcount[k]>>1;
return;
}
if((rftime<5)&&(rfgobit==1))
{
dispcount[k]=dispcount[k]&0x7f;
rftime=0;
if(loop==8)
{
k=k+1;
loop=0;
return;
}
dispcount[k]=dispcount[k]>>1;
return;
}
}
}
}
(查詢子程序同匯編)
假如用中斷的話也可用時(shí)間查詢的方法,只是接收口改用帶中斷的口線;RB4--RB7,CCP1,CCP2,都可以。建議不要用RB0(他當(dāng)按鍵輸入用);
還有就是解碼時(shí)的容陷和誤碼處理(有一種寫法是在解碼移位時(shí)利用進(jìn)位標(biāo)制C同時(shí)移位;我個(gè)人認(rèn)為不太好,因?yàn)橹灰钜晃粵]接收到,整個(gè)接收到的都是誤碼且浪費(fèi)時(shí)間)
2 再談PIC單片機(jī)發(fā)送
原理是接收的逆過程
例程如下(用來發(fā)6221;分頻比為256)
;///////////////////////////////////////////////////////////////////////////////////////////////
READDIGT:
MOVF SENDLOOP,0
ADDWF PC,1
GOTO SENDC4
GOTO SENDC3
GOTO SENDC2
GOTO SENDC1
GOTO SENDC0
;///////////////////////////////////
SENDC0:
MOVF C4COUNT,0;;讀要發(fā)的數(shù)據(jù)(假設(shè)要發(fā)5個(gè)字)
RETURN
SENDC1:
MOVF C3COUNT,0
RETURN
SENDC2:
MOVF C2COUNT,0
RETURN
SENDC3:
MOVF C1COUNT,0
RETURN
SENDC4:
MOVF C0COUNT,0
RETURN
;///////////////////////////////////
SENDBIT:
CLRF TIME
BCF PORTB,1
SENDBIT1:
CLRWDT
MOVLW .35
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDBIT1
CLRF TIME
BSF PORTB,1
SENDBIT2:
CLRWDT
MOVLW .18
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDBIT2
CLRF SENDLOOP ;碼頭數(shù)據(jù)發(fā)送
//////////////////////////////////////////////
SENDBIT3:
CLRWDT
BCF INTCON,7
CALL READDIGT
MOVWF SENDCOUNT
BSF INTCON,7
CALL SENDDIGT
INCF SENDLOOP,1
MOVLW .5
SUBWF SENDLOOP,0
BTFSS STATUS,2
GOTO SENDBIT3
CLRF TIME
BCF PORTB,1
SENDDIGT5:
CLRWDT
MOVLW .2;;加發(fā)一個(gè)結(jié)束位
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDDIGT5
BSF PORTB,1
BSF STARTBIT
RETURN
;/////////////////////////////////////////////////////////////////////////////////////////
SENDDIGT:;;實(shí)現(xiàn)0和1的發(fā)送
MOVLW .8
MOVWF LOOPSENDCOUNT
SENDDIGTGO:
BTFSS SENDCOUNT,7
GOTO ZERSEND
CLRF TIME
SENDDIGT1:
CLRWDT
BCF PORTB,1
MOVLW .2
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDDIGT1
CLRF TIME
SENDDIGT2:
CLRWDT
BSF PORTB,1
MOVLW .6
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDDIGT2
GOTO SENDOVER
ZERSEND:
CLRF TIME
SENDDIGT3:
CLRWDT
BCF PORTB,1
MOVLW .2
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDDIGT3
CLRF TIME
SENDDIGT4:
CLRWDT
BSF PORTB,1
MOVLW .2
SUBWF TIME,0
BTFSS STATUS,2
GOTO SENDDIGT4
SENDOVER:
RLF SENDCOUNT,1
DECFSZ LOOPSENDCOUNT
GOTO SENDDIGTGO
RETURN
相應(yīng)的C代碼如下:(C5口是發(fā)送口)
#include
#include
#include
unsigned char dispcount[5];//要發(fā)送的碼值
unsigned char i,k,data,rfbit,zbit,rfgobit;
#pragma interrupt_level 1
interrupt adint(void)
{
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0b11111100;
TMR1L=0b00010111;
rfbit=rfbit+1;//發(fā)送指針加一
send( );
}
}
//////////////////////////////////////////
send( )
{
if(rfgobit==0)
{
switch(rfbit)
{
case 1 :
RC5=0;
break;
case 6 :
RC5=1;
break;
case 7 :
RC5=0;
rfgobit=1;//制發(fā)送完標(biāo)制
rfbit=0;
break;
default :
break;
}
}
if(rfgobit==1)
{
zbit=dispcount[i]&0b00000001;
switch(rfbit)
{
case 1:
RC5=1;
break;
case 2 :
if(zbit==0)
{
RC5=0;
rfbit=0;
rf( );
}
break;
case 3 :
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)
{
i=1;
rfgobit=0;
TMR1H=0;
TMR1L=0;
RC5=1;
dispcount[1]=0xaa;
dispcount[2]=0xbb;
dispcount[3]=0xcc;
dispcount[4]=0xdd;
dispcount[5]=0xee;
}
return;
}
dispcount[i]=dispcount[i]>>1;
}
//////////////////////////////////////
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( );
dispcount[1]=0xaa;
dispcount[2]=0xbb;
dispcount[3]=0xcc;
dispcount[4]=0xdd;
dispcount[5]=0xee;
while( 1 )
{
;
}
}
這兩個(gè)程序只是一個(gè)演示例程
在實(shí)際運(yùn)用中可變通的把這種發(fā)送與接受用于兩機(jī)之間的通訊(好處是移植性好,抗干擾好且一發(fā)一收只要兩根線或一根線)另外如要產(chǎn)生載波(38KHZ)的話可用其輸出口去調(diào)制38KHZ發(fā)生源(比如555電路,PWM)來得到,或干脆用軟件來實(shí)現(xiàn)(不過難度較大;不如用帶38KHZ的單片機(jī)來做)
欲知詳情,請登錄維庫電子市場網(wǎng)(www.hbjingang.com)
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- 單片機(jī)技術(shù)特性與嵌入式開發(fā)實(shí)踐指南2026/1/7 10:00:02
- 單片機(jī)(MCU)與數(shù)字信號處理器(DSP)分類及選型技術(shù)指南2025/12/30 10:02:37
- 工業(yè)級DSP信號處理系統(tǒng):硬件適配與抗干擾工程方案2025/12/15 14:41:00
- HOLTEK推出HT32F65533G/733G內(nèi)建N/N預(yù)驅(qū)電機(jī)專用SoC單片機(jī)2025/11/26 14:11:41
- 什么是C51數(shù)據(jù)類型擴(kuò)充定義2025/10/27 13:59:22
- PCB焊盤與過孔設(shè)計(jì)核心實(shí)操規(guī)范(含可焊性與可靠性保障)
- 汽車電子常用電子元器件選型指南
- MOSFET驅(qū)動(dòng)與隔離方案設(shè)計(jì)
- 高溫環(huán)境下電源IC選型建議
- 安防監(jiān)控設(shè)備連接器應(yīng)用分析
- 高速PCB信號完整性(SI)設(shè)計(jì)核心實(shí)操規(guī)范
- 鎖相環(huán)(PLL)中的環(huán)路濾波器:參數(shù)計(jì)算與穩(wěn)定性分析
- MOSFET反向恢復(fù)特性對系統(tǒng)的影響
- 電源IC在惡劣環(huán)境中的防護(hù)設(shè)計(jì)
- 連接器耐腐蝕性能測試方法









