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

📄 z_i2c.lst

📁 基于i2c总线控制的24c32C程序读写
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE Z_I2C
OBJECT MODULE PLACED IN z_i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE z_i2c.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<at89x52.h>
   2          #include<intrins.h>
   3          #define uchar  unsigned char
   4          #define uint   unsigned int
   5          #define _Nop()  _nop_()           //定义空指令
   6          //#define ADDRWR   0xa0
   7          //#define ADDRRD   0xa1
   8          /*定义变量*/
   9          uchar   ADDRWR=0xa0,ADDRRD=0xa1;
  10          uchar   bdata   Rshu;
  11          sbit    Rshu_3=Rshu^3;
  12          sbit    SDA=P1^2;
  13          sbit    SCL=P1^1;
  14          sbit    WP=P1^0;
  15          bit     ack;
  16          uchar    code Wshujiu[]={0xff};
  17          uchar    code Rshujiu[]={0x00};
  18          /******************************************
  19          功能:读写存储卡需要一定的延时,此函数用来延时
  20          参数:wtime
  21          返回值:无
  22          ********************************************/
  23          void delay (uchar wtime)
  24          {
  25   1       uchar i,j;
  26   1       for(i=wtime;i>0;i--)
  27   1               for(j=0;j<200;j++);
  28   1      }
  29          /******************************************
  30          功能:固定时间延时
  31          参数:无
  32          返回值:无
  33          ********************************************/
  34          void  wait(void)
  35          {_Nop();
  36   1       _Nop();
  37   1       _Nop();
  38   1       _Nop();
  39   1       _Nop();
  40   1       
  41   1       }
  42           /**************************************************
  43          启动总线函数
  44          函数原形:
  45          void   start_I2C();
  46          功能:
  47          启动I2C总线,即发送I2C起始条件
  48          参数:无
  49          返回值:无
  50          *****************************************************/
  51          void  start_I2C()
  52          {   SCL=0;
  53   1              wait();
  54   1          SDA=1;                      //发送起始条件的数据信号
  55   1          _Nop();
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 2   

  56   1              _Nop();
  57   1          SCL=1;                                              //起始条件建立时间大于4uS
  58   1          wait(); 
  59   1          SDA=0;                      //发送起始信号
  60   1          wait();                     //起始条件锁定时间大于4us
  61   1          SCL=0;                      //准备发送或接受数据
  62   1          _Nop();
  63   1          _Nop();
  64   1              _Nop();
  65   1              _Nop();
  66   1      }
  67          /**************************************************
  68          结束总线函数
  69          函数原形:
  70          void   stop_I2C();
  71          功能:
  72          结束I2C总线,即发送I2C结束条件
  73          参数:无
  74          返回值:无
  75          *****************************************************/
  76          void  stop_I2C()
  77          {   SDA=0;                      //发送结束条件的数据信号
  78   1          _Nop();
  79   1              _Nop();
  80   1          SCL=1;                      //发送结束条件的时钟信号
  81   1          wait();                  //结束条件建立时间大于4uS
  82   1          SDA=1;                     //发送结束信号
  83   1          _Nop();                     //结束条件锁定时间大于4us
  84   1          _Nop(); 
  85   1          _Nop();
  86   1          _Nop();
  87   1      }
  88          /*******************************************************
  89          字节数据传送函数
  90          函数原形:
  91          void  sendbyte(uchar data);
  92          功能:
  93          发送数据,可以是地址,发送后等待回应,并对此状态位进行操作.
  94          应答或非应答都使ack=0,发送正常,ack=1;ack=0,表示接收器无应答或损坏
  95          参数:
  96          data:需要发送的数据
  97          返回值:无
  98          ********************************************************/
  99          void sendbyte(uchar Data)
 100          {
 101   1        uchar  bitcount;
 102   1        for(bitcount=0;bitcount<8;bitcount++)    //要传送的数据长度为8位
 103   1         {
 104   2           if((Data<<bitcount)&0x80)             //判断发送位
 105   2                 SDA=1;
 106   2           else  SDA=0;
 107   2                
 108   2            _Nop();
 109   2                _Nop();
 110   2             SCL=1;                              //置时钟线为高,通知被控器开始接收数据位
 111   2            wait();                                                      //保证时钟高电平周期大于4um                     
 112   2                SCL=0;
 113   2          }  
 114   1                 SDA=1;
 115   1            _Nop();
 116   1            _Nop();
 117   1      //        _Nop();    
C51 COMPILER V8.02   Z_I2C                                                                 08/07/2008 09:21:33 PAGE 3   

 118   1                                           //8位发送后释放数据线,准备接收应答位
 119   1      //    _Nop();
 120   1      //    _Nop();
 121   1      
 122   1            SCL=1;
 123   1            _Nop();
 124   1            _Nop();
 125   1      //      _Nop();
 126   1      //          _Nop();
 127   1      //      _Nop();
 128   1      //      _Nop();
 129   1      //      _Nop();
 130   1                if(SDA==1)
 131   1                      ack=0;
 132   1                else  ack=1;                         //判断是否接收到应答信号
 133   1                SCL=0;
 134   1            _Nop();
 135   1            _Nop();
 136   1                _Nop();
 137   1            _Nop();
 138   1      
 139   1      }
 140          /************************************************************
 141          字节数据接收函数
 142          函数原形:
 143          uchar  recbyte();
 144          功能:用来接收从器件传来的数据,并判断总线错误(不发生应答信号),发送后请用应答函数
 145          参数:无
 146          返回值:读到的数据
 147          ***uchar*****************************************************/
 148          uchar recbyte()
 149          { uchar recdata;
 150   1        uchar bitcount;
 151   1        recdata=0;
 152   1        SDA=1;                                    //置数据线为输入方式
 153   1        for(bitcount=0;bitcount<8;bitcount++)
 154   1          { _Nop();
 155   2                _Nop();                                               
 156   2             SCL=0;                               //置时钟线为低,准备接收数据位
 157   2            wait();                               //保证时钟低电平周期大于4um
 158   2             SCL=1;                               //置时钟为高使数据线上数据有效
 159   2            _Nop();
 160   2            _Nop();
 161   2            _Nop();
 162   2            recdata=recdata<<1;
 163   2            if(SDA==1)
 164   2               recdata=recdata+1;                 //读数据位,接收的数据位放入recdata中
 165   2              _Nop();
 166   2              _Nop();
 167   2              _Nop();
 168   2           }
 169   1               SCL=0;
 170   1               _Nop();
 171   1           _Nop();
 172   1           _Nop();

⌨️ 快捷键说明

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