cpubbs论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

LabVIEW+单片机学习套件全套教程资料下载[免费]LabVIEW论坛精华列表贴USB0816数据采集卡《LabVIEW宝典》
LabWindows/CVI论坛精华贴NET0816以太网数据采集卡RC0210远程设备授权系统 关闭关停锁定打开设备 户外分布式数据采集
NET1624低速高精度以太网数据采集卡WIFI0824SD无线WIFI网络数据采集卡脱机运行 SD存储 小尺寸微型 串口采集远程采集 安卓 手持移动采集 纪录仪
查看: 1565|回复: 0

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

[复制链接]
发表于 2004-11-6 02:34:57 | 显示全部楼层 |阅读模式
<>//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$     扩展串口</P>
<>//simulate serial port</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
    sbit  TXDS = P1^0 ;
    sbit  RXDS = P1^1 ;
    sbit  rede1= P3^5;
    bit   Tend;//发送结束标志
    bit   Rend;//接收结束标志
    bit   Tov;// 接收超时标志
    bit   TR;//  发送 接受标志
    uchar Tb=10;//发送数据为十位
    uchar Rb=8; //接收数据为8位
  uchar  TX_number;
  uchar   RX_number;
  uchar hs=0;// 发送数据移位变量
  uchar t[10];
  uchar r[10];
  uchar*ptr_T; //发送数据指针
  uchar*ptr_R; //接收数据指针</P>
<P> void  delay(uint);
void  TX_DATA();
void  RX_DATA();
   void main (void)
    {  delay(9);
       Tov=0;</P>
<P>     *ptr_R=r;
    // TX_number=10;</P>
<P>    // t[0]=0x11;</P>
<P>    //  t[1]=0x12;
    //  t[2]=0x13;
    // t[3]=0x14;
    //  t[4]=0x15;
    //  t[5]=0x25;
    //  t[6]=0x26;
    //  t[7]=0x27;
    //  t[8]=0x28;
    //  t[9]=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>   void  Timer2(void)    interrupt   5    //timer interrupt
     {
        uchar  Rdata;</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>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|cpubbs论坛. ( 粤ICP备09171248号 )

GMT+8, 2025-4-4 13:43 , Processed in 0.591443 second(s), 7 queries , Gzip On, File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表