曼碼接收程序,常用在無線信號(hào)的編碼與解碼中,給大家分享:
rxi()
{
// this routine gets called every time TMR0 overflows
if(T0IF) //定時(shí)器中斷程序
{
TMR0 = PERIOD; // 裝計(jì)時(shí)器初值
T0IF = 0; // 清定時(shí)器溢出標(biāo)志
XTMR++; // 外部的系統(tǒng)時(shí)鐘計(jì)時(shí)器加1
RFcount++; // 脈沖寬度計(jì)數(shù)器加1
return;
}
if(RAIF) //端口電平變化中斷程序
{
if (RFFull) // 如果接收位滿就退出
return;
RFBit = RFIn; // 取樣信號(hào)接收的值
RAIF = 0;
switch (RFstate) // 當(dāng)前狀態(tài)
{
case TRFDATAUP:
switch (RFcount)
{
case 4:
case 5:
case 6:
case 7:
PORTA = PORTA;//啟動(dòng)端口電平中斷
break;
case 8:
case 9:
case 10:
case 11:
case 12:
B[Bptr] <<= 1; // rotate
if ( RFBit==0) //如是有效的下跳變則該位的數(shù)據(jù)值為1,上跳變?yōu)?
{
B[Bptr]+=1; // shift in bit
}
if ( ( ++BitCount & 7) == 0)
Bptr++; // advance one byte
if (BitCount == NBIT)
{
RFstate = TRFreset; // finished receiving
RFFull = 1;
}
RFcount=0; //重新記時(shí)
PORTA = PORTA;//啟動(dòng)端口電平中斷
break;
default: //超時(shí)或不足則退出接收
RFstate = TRFSYNC; // reset state machine in all other cases
RFcount = 0;
Bptr = 0;
BitCount = 0;
PORTA = PORTA;//啟動(dòng)端口電平中斷
}
break;
case TRFSYNC:
if ( RFBit)
{ // rising edge detected +---+ +---..
// | | <-Theader-> |
// +----------------+
if ( ( RFcount < SHORT_HEAD) || ( RFcount >= LONG_HEAD))
{
RFstate = TRFreset;
PORTA = PORTA;//啟動(dòng)端口電平中斷
break; // too short/long, no header
}
else
{
RFcount =0; // restart counter
RFstate= TRFDATAUP;
PORTA = PORTA;//啟動(dòng)端口電平中斷
}
}
else
{ // still low
RFcount=0;
PORTA = PORTA;//啟動(dòng)端口電平中斷
}
break;
case TRFreset:
default:
RFstate = TRFSYNC; // reset state machine in all other cases
RFcount = 0;
Bptr = 0;
BitCount = 0;
PORTA = PORTA;//啟動(dòng)端口電平中斷
break;
} // switch
} //電平中斷
} // rxi
void InitReceiver()
{
IOCA = 2;
T0IF = 0;
T0IE = 1; // TMR0 overflow interrupt
RAIE = 1; //使能端口電平變化中斷
GIE = 1; // enable interrupts
RFstate = TRFreset; // reset state machine in all other cases
RFFull = 0; // start with buffer empty
XTMR = 0; // start extended timer
TMR0 = PERIOD; // 裝計(jì)時(shí)器初值
PORTA = PORTA;//啟動(dòng)端口電平中斷
}