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

📄 general.lst

📁 江苏单相复费率电能表方案
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   GENERAL                                                               04/13/2007 13:24:51 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE GENERAL
OBJECT MODULE PLACED IN general.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE general.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <Reg931.h>
   2          #include <General.h>
   3          
   4          #define GENERATE_STOP        0x54      // 置位 STO, 复位 STA 、 SI 
   5          #define RELEASE_BUS_ACK      0x44      // 复位 STO,STA,SI 并置位 AA (ack)
   6          #define RELEASE_BUS_NOACK    0x40      // 复位 STO,STA,SI 并置位 AA (noack)
   7          #define RELEASE_BUS_STA      0x64      // 起动总线/重新起动总线, 置位 STA
   8          
   9          bit AckBus(void);
  10          bit GetBus(void);  
  11          bit SendByte(uchar value);
  12          
  13          
  14          //**********************************************************
  15          //                  总线响应
  16          //功能:
  17          //入口参数:无
  18          //**********************************************************
  19          bit AckBus(void)
  20          {
  21   1              uchar TimeOut;
  22   1      
  23   1              TimeOut = 0xFF;
  24   1              
  25   1              while(SI==0)
  26   1              {        
  27   2                      TimeOut--; 
  28   2                      if( TimeOut==0x00 )     //100uS无响应,超时退出
  29   2                      {
  30   3                              I2CON = GENERATE_STOP;
  31   3                              return(0);
  32   3                      }
  33   2              }
  34   1      
  35   1              return(1);
  36   1      }
  37          
  38          
  39          
  40          
  41          
  42          //**********************************************************
  43          //                  总线申请
  44          //功能:进行I2C总线的初始化:包括时钟选择,I2C使能,发送起始信号等等。
  45          //                      I2EN为1,设置为主机;
  46          //                      CRSEL位为0,使用内部SCL发生器。
  47          //入口参数:无
  48          //**********************************************************
  49          bit GetBus(void)       
  50          {       
  51   1                                              // CCLK为7.3728MHz,参数0x14 实际总线频率为 92KHz
  52   1          I2SCLH = 0x14;                                      // 设置SCL高电平的PCLK周期数
  53   1          I2SCLL = 0x14;                      // 设置SCL低电平的PCLK周期数
  54   1          I2CON  = RELEASE_BUS_STA;           // 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位      
  55   1      //  while( SI==0 );                     // 等待起始位的发送
C51 COMPILER V7.50   GENERAL                                                               04/13/2007 13:24:51 PAGE 2   

  56   1              return(AckBus());
  57   1      }
  58          
  59          
  60          
  61          //**********************************************************
  62          //                    发送数据函数
  63          // 功能:    用于向总线发送数据 
  64          // 入口参数:value 待发送的数据                   
  65          //**********************************************************
  66          bit SendByte(uchar value)
  67          { 
  68   1          I2DAT = value;
  69   1          I2CON = RELEASE_BUS_ACK;                    // 清除SI位等等   
  70   1      //  while( SI==0 );                         // 等待数据的发送 
  71   1              return(AckBus());
  72   1      }
  73          
  74          
  75          
  76          
  77          //**********************************************************
  78          //                    向有子地址器件发送多字节数据函数                 
  79          //功能:    从启动总线到发送地址,子地址,数据,结束总线的全过程。
  80          //入口参数;AddrPtr             地址指针
  81          //              DataPrt         数据指针
  82          //              Ptr_length      数据长度
  83          // 出口参数:返回1表示操作成功,否则操作有误。
  84          //**********************************************************
  85          bit ISendStr(uchar idata *AddrPtr,uchar idata *DataPrt,uchar idata *Ptr_length)
  86          { 
  87   1              uchar i;
  88   1              uchar Addr_len;
  89   1              uchar Data_len;
  90   1          
  91   1              Addr_len = *Ptr_length;                                         //地址长度      
  92   1              Ptr_length++;                                                           //数据长度
  93   1              Data_len = *Ptr_length;
  94   1      
  95   1              if(GetBus()==0)                         return(0);              //启动总线
  96   1        
  97   1              if(SendByte(*AddrPtr)==0)       return(0);      //发送器件地址
  98   1      
  99   1              if( I2STAT!=0x18 )
 100   1              { 
 101   2                      I2CON = GENERATE_STOP;
 102   2              return(0);
 103   2              } 
 104   1      
 105   1              for(i=1;i<Addr_len;i++)
 106   1              {
 107   2              AddrPtr++; 
 108   2      
 109   2              if(SendByte(*AddrPtr)==0)return(0);     //发送器件子地址
 110   2              
 111   2                      if( I2STAT!=0x28 )
 112   2              {        
 113   3                      I2CON = GENERATE_STOP;
 114   3                      return(0);
 115   3              } 
 116   2              }   
 117   1           
C51 COMPILER V7.50   GENERAL                                                               04/13/2007 13:24:51 PAGE 3   

 118   1              for(i=0; i<Data_len; i++)
 119   1              { 
 120   2              if(SendByte(*DataPrt)==0)return(0);             //发送数据 
 121   2         
 122   2              if( I2STAT!=0x28 )
 123   2              {
 124   3                      I2CON = GENERATE_STOP;
 125   3                      return(0);
 126   3              }       
 127   2              DataPrt++;
 128   2              } 
 129   1      
 130   1              I2CON = GENERATE_STOP;                                  //结束总线  
 131   1              return(1);
 132   1      }
 133          
 134          
 135          
 136          
 137          //**********************************************************
 138          //                    向有子地址器件读取多字节数据函数                
 139          //功能:    从启动总线到发送地址,子地址,读数据,结束总线的全过程。
 140          //入口参数; AddrPtr            地址指针
 141          //         DataPrt      数据指针
 142          //         Ptr_length   数据长度
 143          //出口参数: 函数返回1表示操作成功,否则操作有误。
 144          //**********************************************************
 145          bit IRcvStr(uchar idata *AddrPtr,uchar idata *DataPrt,uchar idata *Ptr_length)
 146          { 
 147   1          uchar i;
 148   1          uchar Addr_len;
 149   1          uchar Data_len;
 150   1          uchar read;
 151   1        
 152   1          read     = *AddrPtr+1;                              //取从器件地址  
 153   1          Addr_len = *Ptr_length;
 154   1          Ptr_length++;
 155   1          Data_len = *Ptr_length;  
 156   1        
 157   1          if(GetBus()==0)                             return(0);              // 启动总线
 158   1          
 159   1              if(SendByte(*AddrPtr)==0)       return(0);      //发送器件地址
 160   1              
 161   1              if( I2STAT!=0x18 )
 162   1              { 
 163   2                      I2CON = GENERATE_STOP;
 164   2              return(0);
 165   2              }
 166   1       
 167   1              for(i=1;i<Addr_len;i++)                                 //发送器件子地址
 168   1              {
 169   2              AddrPtr++; 
 170   2      
 171   2              if(SendByte(*AddrPtr)==0)return(0);           
 172   2      
 173   2              if( I2STAT!=0x28 )
 174   2              { 
 175   3                      I2CON = GENERATE_STOP;
 176   3                      return(0);
 177   3              } 
 178   2              }
 179   1              
C51 COMPILER V7.50   GENERAL                                                               04/13/2007 13:24:51 PAGE 4   

 180   1              I2CON = RELEASE_BUS_STA;                                //重新启动总线 
 181   1      //      while( SI==0 );
 182   1              if(AckBus()==0)                         return(0);
 183   1      
 184   1              if(SendByte(read)==0)           return(0);  
 185   1      
 186   1              if( I2STAT!=0x40 )
 187   1              { 
 188   2              I2CON = GENERATE_STOP;
 189   2              return(0);
 190   2              } 
 191   1         
 192   1        
 193   1              for(i=0; i<Data_len-1; i++)
 194   1              { 
 195   2              I2CON = RELEASE_BUS_ACK;       //接收一字节数据并发送应答位
 196   2      //      while( SI==0 );                //等待接收数据

⌨️ 快捷键说明

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