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

📄 i2c.lst

📁 DS18B20用来测温度十分方便
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V3.96,  SN-83203013  I2C                                                      09/12/05  17:49:31  PAGE 1   


DOS C51 COMPILER V3.96, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\OUT\I2C.OBJ
COMPILER INVOKED BY: C:\C51\BIN\C51.EXE I2C.C-CODE-DEBUG-SMALL-OBJECTEXTEND-OJ(.\OUT\I2C.OBJ) 

stmt level    source

   1          /*******************************************************************
   2          *				P89LPC932硬件I2C软件包(主)
   3          * 1  使用I2C总线软件包时P1.2,P1.3切勿写为0,并要设置为开漏输出。
   4          * 2  总线定义为P1.2=SCL,P1.3=SDA,需外接上拉电阻2-10k。
   5          * 3  相应寄存器:
   6          *    地址寄存器  I2ADR   用于存放自身从地址(从方式时才有用)
   7          *    数据寄存器  I2DAT   接收/发送数据用
   8          *    控制寄存器  I2CON   用于硬件I2C的设置、使能、启动、结束,
   9          *                       应答控制,中断标志等。
  10          *    状态寄存器  I2STAT  指示I2C总线的操作状态码,高5位有效,
  11          *                       若I2C中断志置位,可查询此寄存器判断
  12          *                        总线情况。
  13          *    SCL占空比寄存器  I2SCLH、I2SCLL  设置SCL的频率发生。
  14          *                        
  15          *    此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
  16          * 使用看门狗,以防等待总线而造成死机。
  17          *	 文件名:HI2C_C51.C
  18          *                                 
  19          *******************************************************************/
  20          #include "I2C.h"
  21          #include "main.h"
  22          
  23          #define uchar 	unsigned char
  24          #define GENERATE_STOP        0x54     // 置位 STO, 复位 STA 、 SI          
  25          #define RELEASE_BUS_ACK      0x44     // 复位 STO,STA,SI 并置位  AA (ack)  
  26          #define RELEASE_BUS_NOACK    0x40     // 复位 STO,STA,SI 并置位 AA (noack) 
  27          #define RELEASE_BUS_STA      0x64     // 起动总线/重新起动总线, 置位 STA   
  28          
  29          
  30          /*******************************************************************
  31          *                  申请总线
  32          * 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
  33          *       I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
  34          *******************************************************************/
  35          void GetBus()
  36          { 
  37   1      	I2SCLH = 15;				                // 设置SCL高电平的PCLK周期数
  38   1        I2SCLL = 15;                        // 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S 
  39   1                                            // 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位。
  40   1        I2CON = RELEASE_BUS_STA; 	
  41   1        while( SI==0 );        	            // 等待起始位的发送
  42   1      }
  43          
  44          
  45          /*******************************************************************
  46          *                    发送数据函数
  47          * 功能:用于向总线发送数据 
  48          * 入口参数:ACC   待发送的数据                   
  49          *******************************************************************/
  50          void SendByte(uchar c)
  51          { 
  52   1      	I2DAT = c;
  53   1        I2CON = RELEASE_BUS_ACK;    	// 清除SI位等等   	
  54   1        while( SI==0 );        		    // 等待数据的发送 	
  55   1      }
C51 COMPILER V3.96,  SN-83203013  I2C                                                      09/12/05  17:49:31  PAGE 2   

  56          
  57          
  58          
  59          /*******************************************************************
  60          *               向无子地址器件发送字节数据函数               
  61          * 功能:从启动总线到发送地址,数据,结束总线的全过程。
  62          * 入口参数:sla		从器件地址
  63          *           c		待发送的数据
  64          * 出口参数:返回1表示操作成功,否则操作有误。
  65          ********************************************************************/
  66          bit ISendByte(uchar sla, uchar c)
  67          { 
  68   1      	GetBus();                 	   // 启动总线                   
  69   1        SendByte(sla);            	   // 发送器件地址,并接收应答位  
  70   1        if( I2STAT!=0X18 )			       // 无从机应答则退出操作        
  71   1        { I2CON = GENERATE_STOP;
  72   2          return(0);
  73   2        }
  74   1      
  75   1        SendByte(c);              	   // 发送数据                    
  76   1        if( I2STAT!=0X28 )
  77   1        { I2CON = GENERATE_STOP;
  78   2          return(0);
  79   2        }
  80   1        I2CON = GENERATE_STOP;          // 结束总线                   
  81   1        return(1);
  82   1      }
  83          
  84          
  85          
  86          /*******************************************************************
  87          *               向有子地址器件发送多字节数据函数                 
  88          * 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
  89          * 入口参数;sla		从器件地址
  90          *           suba    子地址
  91          *           s       发送内容的指针
  92          *           no      发送字节数
  93          * 出口参数:返回1表示操作成功,否则操作有误。
  94          ********************************************************************/
  95          bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
  96          { 
  97   1      	uchar i;
  98   1      
  99   1        GetBus();                            // 启动总线              
 100   1        SendByte(sla);                       // 发送器件地址   
 101   1        if( I2STAT!=0X18 )
 102   1        { I2CON = GENERATE_STOP;
 103   2          return(0);
 104   2        }
 105   1      
 106   1        SendByte(suba);                      // 发送器件子地址
 107   1        if( I2STAT!=0X28 )
 108   1        { I2CON = GENERATE_STOP;
 109   2          return(0);
 110   2        }
 111   1           
 112   1        for(i=0; i<no; i++)
 113   1        { SendByte(*s);                     // 发送数据
 114   2          if( I2STAT!=0X28 )
 115   2      	{ I2CON = GENERATE_STOP;
 116   3      	  return(0);
 117   3      	}
C51 COMPILER V3.96,  SN-83203013  I2C                                                      09/12/05  17:49:31  PAGE 3   

 118   2          s++;
 119   2        } 
 120   1      
 121   1        I2CON = GENERATE_STOP;              // 结束总线
 122   1        return(1);
 123   1      }
 124          
 125          
 126          
 127          /*******************************************************************
 128          *                    向无子地址器件读字节数据函数                
 129          *功能:从启动总线到发送地址,读数据,结束总线的全过程。
 130          *入口参数:sla		从器件地址
 131          *          c        读出的数据(地址传送)
 132          * 出口参数:函数返回1表示操作成功,否则操作有误。
 133          ********************************************************************/
 134          /*bit IRcvByte(uchar sla, uchar *c)
 135          { 
 136          	GetBus();              	      // 启动总线					  
 137            SendByte(sla+1);        	    // 发送器件地址				     
 138            if( I2STAT!=0X40 )
 139            { I2CON = GENERATE_STOP;
 140              return(0);
 141            }
 142            I2CON = RELEASE_BUS_NOACK;    // 接收一字节数据即发送非应答位
 143            while( SI==0 );               // 等待接收数据/ 
 144            if( I2STAT!=0X58 )
 145            { I2CON = GENERATE_STOP;
 146              return(0);
 147            }
 148            *c = I2DAT;                  // 读取数据
 149            I2CON = GENERATE_STOP;       // 结束总线
 150            return(1);
 151          }
 152          */
 153          
 154          
 155          /*******************************************************************
 156          *                    向有子地址器件读取多字节数据函数                
 157          *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
 158          *入口参数:sla 		从器件地址
 159          *          suba		子地址
 160          *		   s	    读出的内容存储区的指针
 161          *          no		读no个字节。
 162          *出口参数:函数返回1表示操作成功,否则操作有误。
 163          ********************************************************************/
 164          /*bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
 165          { uchar i;
 166          
 167            GetBus();                	   // 启动总线			
 168            SendByte(sla);               //发送器件地址
 169            if( I2STAT!=0X18)
 170            { I2CON = GENERATE_STOP;
 171              return(0);
 172            }
 173            SendByte(suba);              // 发送器件子地址	
 174            if( I2STAT!=0X28 )
 175            { I2CON = GENERATE_STOP;
 176              return(0);
 177            }
 178          
 179            I2CON = RELEASE_BUS_STA;     // 重新启动总线				
C51 COMPILER V3.96,  SN-83203013  I2C                                                      09/12/05  17:49:31  PAGE 4   

 180            while( SI==0 );
 181            SendByte(sla+1);
 182            if( I2STAT!=0X40 )
 183            { I2CON = GENERATE_STOP;
 184              return(0);
 185            } 
 186             
 187            for(i=0; i<no-1; i++)

⌨️ 快捷键说明

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