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

📄 i2c.lst

📁 系统采用51单片机
💻 LST
📖 第 1 页 / 共 4 页
字号:
   4      =2  //定义按键
   5      =2  sbit KEY1 = P3^2;               //按键1
   6      =2  sbit KEY2 = P3^3;               //按键2
C51 COMPILER V8.16   I2C                                                                   10/04/2008 14:53:01 PAGE 6   

   7      =2  
   8      =2  sbit Buzzer=P2^4;//????
   9      =2  
  10      =2  #define TemperatureMax 50
  11      =2  
  12      =2  #define TemperatureMin 5
  13      =2  
  14      =2  void INTInit();
  15      =2  
  16      =2  #endif
  17      =2  
  16      =1  
  17      =1  sbit LEDCool = P2^0;    //定义LED由P0.0控制
  18      =1  sbit LEDHot = P2^1;         //定义LED由P0.0控制
  19      =1  sbit LEDSet = P2^2;     //定义LED由P0.0控制
  20      =1  
  21      =1  
  22      =1  //unsigned char Temperature_Set;//设定温度
  23      =1  
  24      =1  #endif
  10          
  11          //定义延时变量,用于宏I2C_Delay()
  12          unsigned char data I2C_Delay_t;
  13          
  14          /*
  15          宏定义:I2C_Delay()
  16          功能:延时,模拟I2C总线专用
  17          */
  18          #define I2C_Delay()\
  19          {\
  20                  I2C_Delay_t = (I2C_DELAY_VALUE);\
  21                  while ( --I2C_Delay_t != 0 );\
  22          }
  23          
  24          
  25          /*
  26          函数:I2C_Init()
  27          功能:I2C总线初始化,使总线处于空闲状态
  28          说明:在main()函数的开始处,通常应当要执行一次本函数
  29          */
  30          void I2C_Init()
  31          {
  32   1              I2C_SCL = 1;
  33   1              I2C_Delay();
  34   1              I2C_SDA = 1;
  35   1              I2C_Delay();
  36   1      }
  37          
  38          
  39          /*
  40          函数:I2C_Start()
  41          功能:产生I2C总线的起始状态
  42          说明:
  43                  SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
  44                  不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态
  45                  本函数也可以用来产生重复起始状态
  46                  本函数执行后,I2C总线处于忙状态
  47          */
  48          void I2C_Start()
  49          {
  50   1              I2C_SDA = 1;
  51   1              I2C_Delay();
C51 COMPILER V8.16   I2C                                                                   10/04/2008 14:53:01 PAGE 7   

  52   1              I2C_SCL = 1;
  53   1              I2C_Delay();
  54   1              I2C_SDA = 0;
  55   1              I2C_Delay();
  56   1              I2C_SCL = 0;
  57   1              I2C_Delay();
  58   1      }
  59          
  60          
  61          /*
  62          函数:I2C_Write()
  63          功能:向I2C总线写1个字节的数据
  64          参数:
  65                  dat:要写到总线上的数据
  66          */
  67          void I2C_Write(unsigned char dat)
  68          {
  69   1              unsigned char t = 8;
  70   1              do
  71   1              {
  72   2                      I2C_SDA = (bit)(dat & 0x80);
  73   2                      dat <<= 1;
  74   2                      I2C_SCL = 1;
  75   2                      I2C_Delay();
  76   2                      I2C_SCL = 0;
  77   2                      I2C_Delay();
  78   2              } while ( --t != 0 );
  79   1      }
  80          
  81          
  82          /*
  83          函数:I2C_Read()
  84          功能:从从机读取1个字节的数据
  85          返回:读取的一个字节数据
  86          */
  87          unsigned char I2C_Read()
  88          {
  89   1              unsigned char dat;
  90   1              unsigned char t = 8;
  91   1              I2C_SDA = 1;    //在读取数据之前,要把SDA拉高
  92   1              do
  93   1              {
  94   2                      I2C_SCL = 1;
  95   2                      I2C_Delay();
  96   2                      dat <<= 1;
  97   2                      if ( I2C_SDA ) dat |= 0x01;
  98   2                      I2C_SCL = 0;
  99   2                      I2C_Delay();
 100   2              } while ( --t != 0 );
 101   1              return dat;
 102   1      }
 103          
 104          
 105          /*
 106          函数:I2C_GetAck()
 107          功能:读取从机应答位
 108          返回:
 109                  0:从机应答
 110                  1:从机非应答
 111          说明:
 112                  从机在收到每个字节的数据后,要产生应答位
 113                  从机在收到最后1个字节的数据后,一般要产生非应答位
C51 COMPILER V8.16   I2C                                                                   10/04/2008 14:53:01 PAGE 8   

 114          */
 115          bit I2C_GetAck()
 116          {
 117   1              bit ack;
 118   1              I2C_SDA = 1;
 119   1              I2C_Delay();
 120   1              I2C_SCL = 1;
 121   1              I2C_Delay();
 122   1              ack = I2C_SDA;
 123   1              I2C_SCL = 0;
 124   1              I2C_Delay();
 125   1              return ack;
 126   1      }
 127          
 128          
 129          /*
 130          函数:I2C_PutAck()
 131          功能:主机产生应答位或非应答位
 132          参数:
 133                  ack=0:主机产生应答位
 134                  ack=1:主机产生非应答位
 135          说明:
 136                  主机在接收完每一个字节的数据后,都应当产生应答位
 137                  主机在接收完最后一个字节的数据后,应当产生非应答位
 138          */
 139          void I2C_PutAck(bit ack)
 140          {
 141   1              I2C_SDA = ack;
 142   1              I2C_Delay();
 143   1              I2C_SCL = 1;
 144   1              I2C_Delay();
 145   1              I2C_SCL = 0;
 146   1              I2C_Delay();
 147   1      }
 148          
 149          
 150          /*
 151          函数:I2C_Stop()
 152          功能:产生I2C总线的停止状态
 153          说明:
 154                  SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
 155                  不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态
 156                  本函数执行后,I2C总线处于空闲状态
 157          */
 158          void I2C_Stop()
 159          {
 160   1              unsigned int t = I2C_STOP_WAIT_VALUE;
 161   1              I2C_SDA = 0;
 162   1              I2C_Delay();
 163   1              I2C_SCL = 1;
 164   1              I2C_Delay();
 165   1              I2C_SDA = 1;
 166   1              I2C_Delay();
 167   1              while ( --t != 0 );             //在下一次产生Start之前,要加一定的延时
 168   1      }
 169          
 170          
 171          /*
 172          函数:I2C_Puts()
 173          功能:主机通过I2C总线向从机发送多个字节的数据
 174          参数:
 175                  SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
C51 COMPILER V8.16   I2C                                                                   10/04/2008 14:53:01 PAGE 9   

 176                  SubAddr:从机的子地址
 177                  Size:数据的字节数
 178                  *dat:要发送的数据
 179          返回:
 180                  0:发送成功
 181                  1:在发送过程中出现异常
 182          */
 183          bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
 184          {
 185   1      //检查长度
 186   1              if ( Size == 0 ) return 0;
 187   1      //确保从机地址最低位是0
 188   1              SlaveAddr &= 0xFE;
 189   1      //启动I2C总线
 190   1              I2C_Start();
 191   1      //发送从机地址
 192   1              I2C_Write(SlaveAddr);
 193   1              if ( I2C_GetAck() )
 194   1              {
 195   2                      I2C_Stop();
 196   2                      return 1;
 197   2              }
 198   1      //发送子地址
 199   1              I2C_Write(SubAddr);
 200   1              if ( I2C_GetAck() )
 201   1              {
 202   2                      I2C_Stop();
 203   2                      return 1;
 204   2              }
 205   1      //发送数据
 206   1              do
 207   1              {
 208   2                      I2C_Write(*dat++);
 209   2                      if ( I2C_GetAck() )
 210   2                      {
 211   3                              I2C_Stop();
 212   3                              return 1;
 213   3                      }
 214   2              } while ( --Size != 0 );
 215   1      //发送完毕,停止I2C总线,并返回结果
 216   1              I2C_Stop();
 217   1              return 0;
 218   1      }
 219          
 220           bit I2C_Puts_s(unsigned char SlaveAddr, unsigned char SubAddr)
 221          {
 222   1      //检查长度
 223   1              //if ( Size == 0 ) return 0;
 224   1      //确保从机地址最低位是0
 225   1              SlaveAddr &= 0xFE;
 226   1      //启动I2C总线
 227   1              I2C_Start();
 228   1      //发送从机地址
 229   1              I2C_Write(SlaveAddr);
 230   1              if ( I2C_GetAck() )
 231   1              {
 232   2                      I2C_Stop();
 233   2                      return 1;
 234   2              }
 235   1      //发送子地址
 236   1              I2C_Write(SubAddr);
 237   1              if ( I2C_GetAck() )
C51 COMPILER V8.16   I2C                                                                   10/04/2008 14:53:01 PAGE 10  

 238   1              {
 239   2                      I2C_Stop();
 240   2                      return 1;
 241   2              }
 242   1      //发送数据
 243   1              /*
 244   1              do
 245   1              {
 246   1                      I2C_Write(*dat++);
 247   1                      if ( I2C_GetAck() )
 248   1                      {
 249   1                              I2C_Stop();
 250   1                              return 1;
 251   1                      }
 252   1              } while ( --Size != 0 );
 253   1      //发送完毕,停止I2C总线,并返回结果
 254   1              I2C_Stop();
 255   1              return 0;
 256   1              */
 257   1      }
 258          /*
 259          函数:I2C_Put()
 260          功能:主机通过I2C总线向从机发送1个字节的数据
 261          参数:
 262                  SlaveAddr:从机地址(高7位是从机地址,最低位是写标志0)
 263                  SubAddr:从机的子地址
 264                  dat:要发送的数据
 265          返回:
 266                  0:发送成功
 267                  1:在发送过程中出现异常
 268          */
 269          bit I2C_Put(unsigned char SlaveAddr, unsigned char SubAddr, char dat)
 270          {
 271   1              return I2C_Puts(SlaveAddr,SubAddr,1,&dat);
 272   1      }
 273          
 274          
 275          /*
 276          函数:I2C_Gets()
 277          功能:主机通过I2C总线从从机接收多个字节的数据
 278          参数:
 279                  SlaveAddr:从机地址(高7位是从机地址,最低位是读标志1)
 280                  SubAddr:从机的子地址
 281                  Size:数据的字节数
 282                  *dat:保存接收到的数据
 283          返回:
 284                  0:接收成功
 285                  1:在接收过程中出现异常
 286          */
 287          bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
 288          {
 289   1      //检查长度
 290   1              if ( Size == 0 ) return 0;
 291   1      //确保从机地址最低位是0
 292   1              SlaveAddr &= 0xFE;      //确保最低位是0
 293   1      //启动I2C总线

⌨️ 快捷键说明

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