• <i id="jb6ye"><bdo id="jb6ye"></bdo></i>
    1. <b id="jb6ye"><bdo id="jb6ye"><tr id="jb6ye"></tr></bdo></b><tt id="jb6ye"><tr id="jb6ye"><dfn id="jb6ye"></dfn></tr></tt><track id="jb6ye"><big id="jb6ye"></big></track>
    2. 专注电子技术学习与研究
      当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

      曼彻斯特编码的接收C51程序

      作者:佚名   来源:本站原创   点击数:  更新时间:2012年01月18日   【字体:
      曼码接收程序,常用在无线信号的编码与解码中,给大家分享:
      
      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[Bptr] <<= 1;              // rotate 
            if ( RFBit==0)  //如是有效的下跳变则该位的数据值为1,上跳变为0
            { 
             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; //重新记时
            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;//启动端口电平中断
      }
      关闭窗口

      相关文章

      68日本xxxxxxxxx,水萝拉日语中字在线,德国videos高清,欧美色图片 网站地图