cpubbs 发表于 2004-11-6 02:34:57

串口模拟程序,只占用一个T2资源

<P>//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$   扩展串口</P>
<P>//simulate serial port</P>
<P>   #include &lt;reg52.h&gt;
   #include &lt;intrins.h&gt;
   #define   uchar   unsigned char
   #define   uint    unsigned int
   #define   nop   _nop_()
   #define   On      1 ;
   #define   Off   0
    sbitTXDS = P1^0 ;
    sbitRXDS = P1^1 ;
    sbitrede1= P3^5;
    bit   Tend;//发送结束标志
    bit   Rend;//接收结束标志
    bit   Tov;// 接收超时标志
    bit   TR;//发送 接受标志
    uchar Tb=10;//发送数据为十位
    uchar Rb=8; //接收数据为8位
ucharTX_number;
uchar   RX_number;
uchar hs=0;// 发送数据移位变量
uchar t;
uchar r;
uchar*ptr_T; //发送数据指针
uchar*ptr_R; //接收数据指针</P>
<P> voiddelay(uint);
voidTX_DATA();
voidRX_DATA();
   void main (void)
    {delay(9);
       Tov=0;</P>
<P>   *ptr_R=r;
    // TX_number=10;</P>
<P>    // t=0x11;</P>
<P>    //t=0x12;
    //t=0x13;
    // t=0x14;
    //t=0x15;
    //t=0x25;
    //t=0x26;
    //t=0x27;
    //t=0x28;
    //t=0x29;
    //TX_DATA();
    RX_number=2;
   RX_DATA();
   delay(199);
   nop;
   nop;
      while(1);</P>
<P>    } //main
void TX_DATA(void)
   {
         ptr_T=t; //定义指针地址
         hs=*ptr_T; //第一个数据送达数据移位单元
         TR=On;//发送
         Tend =0;
         rede1=Off;//只发送状态
         delay(9);</P>
<P>
         T2CON=0x00;
          TH2=0xfd;   //bps 1200
          TL2=0x23;                              
                                             
         TR2=On;   //开中断
         ET2=On;
         EA =On;
         do{
         PCON|=0x01;
         nop;}
      while(Tend==0);
         rede1=On;
      }</P>
<P> void RX_DATA(void)</P>
<P>      {
          ptr_R=r;
          Rend= 0;
          TR= 0;//接收标志
          rede1= 1;</P>
<P>          T2CON=0x08;//允许外部中断
          ET2=1;
          EA= 1;
      
       }//RX_DATA</P>
<P>   voidTimer2(void)    interrupt   5    //timer interrupt
   {
      ucharRdata;</P>
<P>         if(TR)
         {//发送   
         TL2=0x23;//
         TH2=0xfd; //bps 1200         
                                       
         TF2=0x00;</P>
<P>         if (--Tb)
            {if(Tb==9)
                  {nop;
                     nop;
                     nop;
                     TXDS=0;
                   }
                else
                  {   TXDS=(bit)(hs&amp;0x01) ;
                      hs=hs&gt;&gt;1;
                   }
                }
            else //if(Tb==0)
            {nop;
               nop;
               Tb=10;
               nop;
               nop;
               TXDS=1;
               if(--TX_number!=0)
                  {ptr_T++;
                     hs=*ptr_T ;
                   }
                   else
                     {
                  Tend=1;   //发完
                  T2CON=0;
                     }
                }//Tb==0
          } //TR=1
       if (!TR)//接收
         {
            if(!EXF2)
            { TF2=0;
                TL2=0x1c;//
                TH2=0xfd;///bps=1200                ////TL2=0xc2; //bps9600
                                                      ////TH2=0x0ff;
                Rdata=(uchar)RXDS;
                hs|=Rdata;
                hs=_cror_(hs,1);
               if(--Rb==0)
               {//
                *ptr_R=hs;
               ptr_R++;
               hs=0;</P>
<P>                  //;;;;;;;;;;
            //    TH0=0x0f0;//每收-每收到1字节,重新设置定时溢出超时时间4mS
                  //;;;;;;;;;;;;;;;;;;;
                if(--RX_number)
                {
               T2CON=0x08;</P>
<P>                  }
               else
               {T2CON=0x00;
               //   Rend=1;
                  }
                }//
            }//EXF2
               else if (EXF2)
                {</P>
<P>                EXF2=0;
                TL2=0xef;//0xe6;//0x22;
                TH2=0xfc;                     
                TR2=1;
                EXEN2=0;
                ET2=1;
                Rb=8;
                }</P>
<P>          }//TR==0</P>
<P>
         }//end</P>
<P> void delay(uint delx)
{
      uint i=0;
      while(i&lt;delx)
      {
                i++;
      }
}
</P>
页: [1]
查看完整版本: 串口模拟程序,只占用一个T2资源