⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsa.lst

📁 这是一个成熟的DSA通讯持续,可以在单片机之间通讯用.
💻 LST
字号:
C51 COMPILER V8.08   DSA                                                                   07/24/2008 14:03:29 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE DSA
OBJECT MODULE PLACED IN dsa.OBJ
COMPILER INVOKED BY: E:\Program Files\kiel3\C51\BIN\C51.EXE dsa.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*C**************************************************************************
   2          * NAME:         dsa_com.c
   3          *----------------------------------------------------------------------------
   4          * PURPOSE:
   5          * This is the  software for A2368+DSA
   6          *****************************************************************************/
   7          #include<at89x52.h>
   8          #include"dsa.h"
   9          #include"typedefine.h"
  10          #include"delay.h"
  11          
  12          uchar Send_ok;
  13          uchar Read_ok;
  14          uchar dsa_com;
  15          uchar dsa_data1;
  16          uchar dsa_data2;
  17          uchar Time_out;
  18          
  19          /*F**************************************************************************
  20          * NAME:    dsa_init
  21          *----------------------------------------------------------------------------
  22          * PURPOSE: 
  23          *  init
  24          *****************************************************************************/
  25          void dsa_init()
  26           {
  27   1        Stb=1; 
  28   1        S_data=1;
  29   1        Ack=1; 
  30   1        }
  31          /*F**************************************************************************
  32          * NAME: Wr_data
  33          *----------------------------------------------------------------------------
  34          * PURPOSE: 
  35          *   send word data to servo routine 
  36          *****************************************************************************/
  37          void Wr_data(int w_data, uchar w_ldat)   //写字节
  38            {
  39   1         uchar i;
  40   1         int j;
  41   1         Time_out=0;
  42   1         dsa_init();
  43   1         for(i=0;i<16;i++)
  44   1          {      
  45   2           if(w_data & 0x8000)   //!!!16位,不能用0x80
  46   2           S_data=1;
  47   2           else S_data=0;     
  48   2           w_data<<=1;
  49   2           Stb=0;
  50   2           for(j=0;j <= 300;j++)   //如果应答不为零,未读数
  51   2              {  
  52   3                if(Ack==0) break;  
  53   3                if(j==300)
  54   3                  {
  55   4                   Time_out=1;
C51 COMPILER V8.08   DSA                                                                   07/24/2008 14:03:29 PAGE 2   

  56   4                   return;    //超时退出
  57   4                  }
  58   3              }
  59   2           Stb=1;                     
  60   2           for(j=0;j <= 300;j++)   //如果应答不为1,读数未完成
  61   2              {  
  62   3                if(Ack==1) break;  
  63   3                if(j==300) 
  64   3                 {
  65   4                   Time_out=1;
  66   4                   return;    //超时退出
  67   4                  }
  68   3              }
  69   2           
  70   2           }
  71   1      
  72   1               for(i=0;i<8;i++)
  73   1               {
  74   2           if(w_ldat & 0x80)   //
  75   2           S_data=1;
  76   2           else S_data=0;     
  77   2           w_ldat<<=1;
  78   2           Stb=0;
  79   2           for(j=0;j <= 300;j++)   //如果应答不为零,未读数
  80   2              {  
  81   3                if(Ack==0) break;  
  82   3                if(j==300)
  83   3                  {
  84   4                   Time_out=1;
  85   4                   return;    //超时退出
  86   4                  }
  87   3              }
  88   2           Stb=1;                     
  89   2           for(j=0;j <= 300;j++)   //如果应答不为1,读数未完成
  90   2              {  
  91   3                if(Ack==1) break;  
  92   3                if(j==300) 
  93   3                 {
  94   4                   Time_out=1;
  95   4                   return;    //超时退出
  96   4                  }
  97   3              }
  98   2           
  99   2           }           
 100   1               
 101   1        }
 102          /*F**************************************************************************
 103          * NAME: Wr_command
 104          *----------------------------------------------------------------------------
 105          * PURPOSE: 
 106          *   write command routine 
 107          *****************************************************************************/
 108          
 109          void Wr_command(uchar wdsa_c,uchar wdsa_d,uchar wdsa_l)  //写命令
 110            { 
 111   1          int j;  
 112   1          uchar i;
 113   1          Send_ok=0;
 114   1          for(i=0 ; i<2 ; i++)   //发2次
 115   1           {
 116   2            Time_out=0;
 117   2            dsa_init();
C51 COMPILER V8.08   DSA                                                                   07/24/2008 14:03:29 PAGE 3   

 118   2            S_data=0;
 119   2            if(Send_ok==0)
 120   2              {
 121   3               for(j=0;j <=8000;j++)   //如果应答不为0,未握手
 122   3                {  
 123   4                 if(Ack==0) break;   //如果应答0,握手OK
 124   4                 if(j==8000)return;  //超时退出
 125   4                }
 126   3               S_data=1;
 127   3               for(j=0;j <= 300;j++)   //如果应答不为1,握手未完成
 128   3                {  
 129   4                 if(Ack==1) break;  //如果应答1,握手完成
 130   4                 if(j==300)return;
 131   4                }
 132   3            Wr_data(( (uint)wdsa_c <<8 ) | wdsa_d,wdsa_l); //合并为16位
 133   3            if(Time_out==1) break;  //超时退出
 134   3            dsa_init();
 135   3            Ack=0;      
 136   3            for(j=0;j <= 300;j++)  
 137   3              {  
 138   4                if(Stb==0) break;  //如果选通0,应答成功
 139   4                if(j==300)return;
 140   4              }
 141   3            dsa_init();
 142   3            Send_ok=1;            //发送成功            
 143   3           }       
 144   2          if(Send_ok==1) break;
 145   2         }
 146   1       }
 147          /*F**************************************************************************
 148          * NAME: Rd_data
 149          *----------------------------------------------------------------------------
 150          * PURPOSE: 
 151          *   read word data from servo routine 
 152          *****************************************************************************/
 153          
 154           unsigned char Rd_data()    //读字节
 155           {
 156   1         uchar i;
 157   1         uint j;
 158   1         uchar r_data;
 159   1         Time_out=0;   
 160   1         for(i=0;i<8;i++)
 161   1         {
 162   2           for(j=0;j <= 300;j++)  //如果选通不为0,数据无效
 163   2            {  
 164   3             if(Stb==0) break;  //如果选通0,数据有效
 165   3             if(j==300) Time_out=1;
 166   3            }
 167   2           if(Time_out==1) break;  //超时退出stb
 168   2           r_data <<=1;  
 169   2           if(S_data==1) r_data |= 0x01;  //读数据
 170   2           check_count++;
 171   2           Ack=0;  //应答
 172   2           for(j=0;j <= 300;j++)  
 173   2            {  
 174   3             if(Stb==1) break;  //如果选通1,应答成功
 175   3             if(j==300) Time_out=1;
 176   3            }
 177   2           if(Time_out==1) break;  //超时退出stb   
 178   2           Ack=1;  //应答
 179   2      
C51 COMPILER V8.08   DSA                                                                   07/24/2008 14:03:29 PAGE 4   

 180   2          }   
 181   1         return(r_data);
 182   1        }
 183          /*F**************************************************************************
 184          * NAME: Rd_command
 185          *----------------------------------------------------------------------------
 186          * PURPOSE: 
 187          *   read dsa command routine 
 188          *****************************************************************************/
 189          void Rd_command()  //读命令
 190          {    
 191   1         uint  j;
 192   1         uchar i; 
 193   1         Read_ok=0;
 194   1         check_count=0;
 195   1         dsa_init();
 196   1      
 197   1        for(i=0;i<1;i++)
 198   1         {
 199   2           if((Ack==0) | (Stb==0 )) break;
 200   2           for(j=0;j <=300;j++)        //如果不为0,未握手,不能太长
 201   2              {  
 202   3               if(S_data==0) break;     //如果应答0,握手OK
 203   3               if(j==300)return;
 204   3              }
 205   2          Ack=0;                       //应答0
 206   2          for(j=0;j <= 300;j++)        //如果应答不为1,握手未完成
 207   2               {  
 208   3                 if(S_data==1) break;  //如果应答1,握手完成
 209   3                 if(j==300) return;
 210   3               }
 211   2           Ack=1;     
 212   2      
 213   2           dsa_com = Rd_data();
 214   2               dsa_data1 = Rd_data();
 215   2               dsa_data2 = Rd_data();
 216   2      
 217   2           if(Time_out==1)return;  //只读一次,所以超时退出
 218   2           dsa_init();      
 219   2           for(j=0;j <= 300;j++)  
 220   2              {  
 221   3                if(Ack==0) break;  //如果选通0,应答成功
 222   3                if(j==300)return;   
 223   3              }
 224   2           if(check_count==24) S_data=1;
 225   2           else S_data=0;
 226   2             Stb=0;
 227   2           for(j=0;j <= 300;j++)  //如果选通为0,数据校验
 228   2              {  
 229   3                if(Ack==1) break;  //如果选通1,应答成功
 230   3                if(j==300) return;   //超时退出
 231   3              }
 232   2           dsa_init();
 233   2           Read_ok=1;   //读数成功
 234   2          }
 235   1      
 236   1       }
 237          
 238          
 239          


C51 COMPILER V8.08   DSA                                                                   07/24/2008 14:03:29 PAGE 5   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    623    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -