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

📄 da.lst

📁 系统通过单片机控制主电路
💻 LST
字号:
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE DA
OBJECT MODULE PLACED IN .\da.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\0217\da.c BROWSE INTVECTOR(0X8000) DEBUG OBJECTEXTEND PRINT(.\da.lst) OB
                    -JECT(.\da.obj)

line level    source

   1           #include <reg52.h>          /*头文件的包含*/
   2          #include <intrins.h>
   3          
   4          #define  uchar unsigned char /*宏定义*/
   5          #define  uint  unsigned int
   6          
   7          #define  _Nop()  _nop_()        /*定义空指令*/
   8          
   9          /* 常,变量定义区 */
  10           
  11                                                           /*端口位定义*/
  12          sbit sda=P1^0;            /*模拟I2C数据传送位*/
  13          sbit scl=P1^1;          /*模拟I2C时钟控制位*/
  14                                             
  15                                                           /*状态标志*/
  16          bit ack1;                /*应答标志位*/
  17             
  18          
  19          
  20          
  21          
  22          
  23          /*******************************************************************
  24                               起动总线函数               
  25          函数原型: void  Start_I2c();  
  26          功能:       启动I2C总线,即发送I2C起始条件.
  27            
  28          ********************************************************************/
  29          void start_I2c()
  30          {
  31   1        sda=1;   /*发送起始条件的数据信号*/
  32   1        _Nop();
  33   1        scl=1;
  34   1        _Nop();    /*起始条件建立时间大于4.7us,延时*/
  35   1        _Nop();
  36   1        _Nop();
  37   1        _Nop();
  38   1        _Nop();    
  39   1        sda=0;   /*发送起始信号*/
  40   1        _Nop();    /* 起始条件锁定时间大于4μs*/
  41   1        _Nop();
  42   1        _Nop();
  43   1        _Nop();
  44   1        _Nop();       
  45   1        scl=0;   /*钳住I2C总线,准备发送或接收数据 */
  46   1        _Nop();
  47   1        _Nop();
  48   1      }
  49          
  50          
  51          
  52          
  53          /*******************************************************************
  54                                结束总线函数               
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 2   

  55          函数原型: void  Stop_I2c();  
  56          功能:       结束I2C总线,即发送I2C结束条件.
  57            
  58          ********************************************************************/
  59          void stop_I2c()
  60          {
  61   1        sda=0;  /*发送结束条件的数据信号*/
  62   1        _Nop();   /*发送结束条件的时钟信号*/
  63   1        scl=1;  /*结束条件建立时间大于4μs*/
  64   1        _Nop();
  65   1        _Nop();
  66   1        _Nop();
  67   1        _Nop();
  68   1        _Nop();
  69   1        sda=1;  /*发送I2C总线结束信号*/
  70   1        _Nop();
  71   1        _Nop();
  72   1        _Nop();
  73   1        _Nop();
  74   1      }
  75          
  76          
  77          
  78          
  79          /*******************************************************************
  80                           字节数据传送函数               
  81          函数原型: void  SendByte(uchar c);
  82          功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
  83               此状态位进行操作.(不应答或非应答都使ack=0 假)     
  84               发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  85          ********************************************************************/
  86          void  sendByte(uchar c)
  87          {
  88   1       uchar BitCnt;
  89   1       
  90   1       for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  91   1          {
  92   2           if((c<<BitCnt)&0x80)sda=1;   /*判断发送位*/
  93   2             else  sda=0;                
  94   2           _Nop();
  95   2           scl=1;               /*置时钟线为高,通知被控器开始接收数据位*/
  96   2            _Nop(); 
  97   2            _Nop();               /*保证时钟高电平周期大于4μs*/
  98   2            _Nop();
  99   2            _Nop();
 100   2            _Nop();         
 101   2           scl=0; 
 102   2          }
 103   1          
 104   1          _Nop();
 105   1          _Nop();
 106   1          sda=1;               /*8位发送完后释放数据线,准备接收应答位*/
 107   1          _Nop();
 108   1          _Nop();   
 109   1          scl=1;
 110   1          _Nop();
 111   1          _Nop();
 112   1          _Nop();
 113   1          if(sda==1)ack1=0;     
 114   1             else ack1=1;        /*判断是否接收到应答信号*/
 115   1          scl=0;
 116   1          _Nop();
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 3   

 117   1          _Nop();
 118   1      }
 119          
 120          
 121          
 122          
 123          
 124          
 125          /*******************************************************************
 126                           字节数据传送函数               
 127          函数原型: uchar  RcvByte();
 128          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 129               发完后请用应答函数。  
 130          ********************************************************************/   
 131          uchar  rcvByte()
 132          {
 133   1        uchar retc;
 134   1        uchar BitCnt;
 135   1        
 136   1        retc=0; 
 137   1        sda=1;             /*置数据线为输入方式*/
 138   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 139   1            {
 140   2              _Nop();           
 141   2             scl=0;       /*置时钟线为低,准备接收数据位*/
 142   2              _Nop();
 143   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 144   2              _Nop();
 145   2              _Nop();
 146   2              _Nop();
 147   2              scl=1;       /*置时钟线为高使数据线上数据有效*/
 148   2              _Nop();
 149   2              _Nop();
 150   2              retc=retc<<1;
 151   2              if(sda==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 152   2              _Nop();
 153   2              _Nop(); 
 154   2            }
 155   1        scl=0;    
 156   1        _Nop();
 157   1        _Nop();
 158   1        return(retc);
 159   1      }
 160          
 161          
 162          
 163          
 164          /********************************************************************
 165                               应答子函数
 166          原型:  void Ack_I2c(bit a);
 167           
 168          功能:主控器进行应答信号,(可以是应答或非应答信号)
 169          ********************************************************************/
 170          void ack_I2c(bit a)
 171          {
 172   1        
 173   1        if(a==0)sda=0;     /*在此发出应答或非应答信号 */
 174   1              else sda=1;
 175   1        _Nop();
 176   1        _Nop();
 177   1        _Nop();      
 178   1        scl=1;
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 4   

 179   1          _Nop();
 180   1          _Nop();              /*时钟低电平周期大于4μs*/
 181   1          _Nop();
 182   1          _Nop();
 183   1          _Nop();  
 184   1       scl=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 185   1          _Nop();
 186   1          _Nop();    
 187   1      }
 188          
 189          
 190          
 191          
 192          
 193          
 194          /*******************************************************************
 195                              向无子地址器件发送字节数据函数               
 196          函数原型: bit  ISendByte(uchar sla,ucahr c);  
 197          功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
 198                     如果返回1表示操作成功,否则操作有误。
 199          注意:    使用前必须已结束总线。
 200          ********************************************************************/
 201          bit iSendByte(uchar sla,uchar c)
 202          {
 203   1         start_I2c();               /*启动总线*/
 204   1         sendByte(sla);            /*发送器件地址*/
 205   1           if(ack1==0)return(0);
 206   1         sendByte(c);               /*发送数据*/
 207   1           if(ack1==0)return(0);
 208   1        stop_I2c();                 /*结束总线*/ 
 209   1        return(1);
 210   1      }
 211          
 212          
 213          
 214          
 215          /*******************************************************************
 216                              向有子地址器件发送多字节数据函数               
 217          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 218          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 219                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 220                     如果返回1表示操作成功,否则操作有误。
 221          注意:    使用前必须已结束总线。
 222          ********************************************************************/
 223          bit iSendStr(uchar sla,uchar suba,uchar *s,uchar no)
 224          {
 225   1         uchar i;
 226   1      
 227   1         start_I2c();               /*启动总线*/
 228   1        sendByte(sla);            /*发送器件地址*/
 229   1           if(ack1==0)return(0);
 230   1         sendByte(suba);            /*发送器件子地址*/
 231   1           if(ack1==0)return(0);
 232   1      
 233   1         for(i=0;i<no;i++)
 234   1          {   
 235   2           sendByte(*s);               /*发送数据*/
 236   2             if(ack1==0)return(0);
 237   2           s++;
 238   2          } 
 239   1       stop_I2c();                 /*结束总线*/ 
 240   1        return(1);
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 5   

 241   1      }
 242          
 243          
 244          
 245          
 246          
 247          
 248          /*******************************************************************
 249                              向无子地址器件读字节数据函数               
 250          函数原型: bit  IRcvByte(uchar sla,ucahr *c);  
 251          功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地
 252                    址sla,返回值在c.
 253                     如果返回1表示操作成功,否则操作有误。
 254          注意:    使用前必须已结束总线。
 255          ********************************************************************/
 256          bit iRcvByte(uchar sla,uchar *c)
 257          {
 258   1         start_I2c();                /*启动总线*/
 259   1         sendByte(sla+1);           /*发送器件地址*/
 260   1           if(ack1==0)return(0);
 261   1         *c=rcvByte();               /*读取数据*/
 262   1           ack_I2c(1);               /*发送非就答位*/
 263   1        stop_I2c();                  /*结束总线*/ 
 264   1        return(1);
 265   1      }
 266          
 267          
 268          
 269          /*******************************************************************
 270                              向有子地址器件读取多字节数据函数               
 271          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 272          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 273                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 274                     如果返回1表示操作成功,否则操作有误。
 275          注意:    使用前必须已结束总线。
 276          ********************************************************************/
 277          bit iRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 278          {
 279   1         uchar i;
 280   1      
 281   1         start_I2c();               /*启动总线*/
 282   1         sendByte(sla);            /*发送器件地址*/
 283   1           if(ack1==0)return(0);
 284   1         sendByte(suba);            /*发送器件子地址*/
 285   1           if(ack1==0)return(0);
 286   1      
 287   1         start_I2c();
 288   1         sendByte(sla+1);
 289   1            if(ack1==0)return(0);
 290   1      
 291   1         for(i=0;i<no-1;i++)
 292   1          {   
 293   2           *s=rcvByte();               /*发送数据*/
 294   2           ack_I2c(0);                /*发送就答位*/  
 295   2           s++;
 296   2          } 
 297   1         *s=rcvByte();
 298   1          ack_I2c(1);                 /*发送非应位*/
 299   1      stop_I2c();                    /*结束总线*/ 
 300   1        return(1);
 301   1      }
 302          
C51 COMPILER V7.50   DA                                                                    07/22/2007 10:51:30 PAGE 6   

 303          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    349    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      12
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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