作者: LB 于 2007/5/16 16:19:45 發(fā)布:
還有就是解碼時(shí)的容陷和誤碼處理(有一種寫法是在解碼移位時(shí)利用進(jìn)位標(biāo)制C同時(shí)移位;我個(gè)人認(rèn)為不太好,因?yàn)橹灰钜晃粵]接收到,整個(gè)接收到的都是誤碼且浪費(fèi)時(shí)間) 2在談發(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 SENDDIGTG 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ā)送口) #i nclude #i nclude #i nclude 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ī)來做) |