winnie 发表于 2009-5-5 15:54:45

曼彻斯特编码的接收

接收程序,给大家分享:rxi()
{
    // this routine gets called every time TMR0 overflows
    if(T0IF)//定时器中断程序
    {
      TMR0 = PERIOD;             // 装计时器初值
      T0IF = 0;   // 清定时器溢出标志
      XTMR++;                     // 外部的系统时钟计时器加1
      RFcount++;   // 脉冲宽度计数器加1
return;
    }
    if(RAIF)//端口电平变化中断程序
    {
   if (RFFull)               // 如果接收位满就退出
         return;
RFBit = RFIn;               // 取样信号接收的值
RAIF = 0;
   switch (RFstate)            // 当前状态
   {
      case TRFDATAUP:
    switch (RFcount)
    {
      case 4:
      case 5:
      case 6:
      case 7:
      PORTA = PORTA;//启动端口电平中断
      break;
   
      case 8:
      case 9:
      case 10:
      case 11:
      case 12:
      B <<= 1;            // rotate
      if ( RFBit==0)//如是有效的下跳变则该位的数据值为1,上跳变为0
      {
       B+=1;          // shift in bit
      }
      if ( ( ++BitCount & 7) == 0)
       Bptr++;               // advance one byte
      if (BitCount == NBIT)
      {
       RFstate = TRFreset;   // finished receiving
       RFFull = 1;
      }
      RFcount=0; //重新记时
      PORTA = PORTA;//启动端口电平中断
         break;
   
      default://超时或不足则退出接收
            RFstate = TRFSYNC;      // reset state machine in all other cases
            RFcount = 0;
            Bptr = 0;
            BitCount = 0;
      PORTA = PORTA;//启动端口电平中断
    }
   break;
   case TRFSYNC:
          if ( RFBit)
          { // rising edge detected+---+                +---..
            //                     |   |<-Theader->   |   
            //                           +----------------+
            if ( ( RFcount < SHORT_HEAD) || ( RFcount >= LONG_HEAD))
            {
                  RFstate = TRFreset;
      PORTA = PORTA;//启动端口电平中断
                  break;                  // too short/long, no header
            }
            else
            {
                  RFcount =0;             // restart counter
                  RFstate= TRFDATAUP;
      PORTA = PORTA;//启动端口电平中断
            }
          }
          else
          { // still low
            RFcount=0;
   PORTA = PORTA;//启动端口电平中断
          }
          break;

   case TRFreset:
   default:
         RFstate = TRFSYNC;      // reset state machine in all other cases
         RFcount = 0;
         Bptr = 0;
         BitCount = 0;
      PORTA = PORTA;//启动端口电平中断
         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;             // 装计时器初值
    PORTA = PORTA;//启动端口电平中断
}
页: [1]
查看完整版本: 曼彻斯特编码的接收