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

📄 i2c.lst

📁 AT89S52 I2C单-多字节通信,使用I2C总线大大减少电路板的面积
💻 LST
字号:
C51 COMPILER V8.05a   I2C                                                                  02/14/2009 15:35:01 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg52.h>
   2          #define uchar unsigned char
   3          #define uint unsigned int
   4          #include<LCD_1602.h>
   5          sbit sda=P3^5;
   6          sbit sck=P3^4;
   7          
   8          void sda_0() {sda=0;;;;;;}
   9          void sda_1() {sda=1;;;;;;}
  10          void sck_0() {sck=0;;;;;;}
  11          void sck_1() {sck=1;;;;;;}
  12          void delay(uint z)                //延时子程序
  13          {
  14   1              uint x,y;
  15   1              for(x=z;x>0;x--)
  16   1                      for(y=110;y>0;y--);
  17   1      }
  18          
  19          void initial()          //初始化子程序
  20          {
  21   1              sda_1();
  22   1              sck_1();
  23   1      }
  24          
  25          void start()  //开始子程序
  26          {       
  27   1              sda_1();
  28   1              sck_1();
  29   1              sda_0();
  30   1              sck_0();   //钳住I2C总线准备发送数据
  31   1      }
  32          
  33          void stop()   //停止子程序
  34          {
  35   1              sda_0();
  36   1              sck_1();
  37   1              sda_1();
  38   1      }
  39          
  40          void response()  //判断是否收到对方的响应信号,
  41          {                                //没有收到则在规定时间内默认对方收到数据
  42   1              uchar i=0;
  43   1              sck_1();
  44   1              while((sda==1)&&(i<250))i++;
  45   1              sck_0();         //钳住I2C总线
  46   1      }
  47          
  48          void ack(bit byte)
  49          {
  50   1              if(byte==0) sda_0();
  51   1              else sda_1();
  52   1              sck_1();        //使数据有效
  53   1              sck_0();        //钳住I2C总线
  54   1      
  55   1      }
C51 COMPILER V8.05a   I2C                                                                  02/14/2009 15:35:01 PAGE 2   

  56          
  57          void send_byte(uchar data1)   //写数据子程序
  58          {
  59   1              uchar i;
  60   1              for(i=0;i<8;i++)
  61   1              {
  62   2                      data1=data1<<1;
  63   2                      sck_0();        //时钟线为低电平时,数据线才能改变
  64   2                      sda=CY; {;;;;;;;;;;}  //注意不同晶振频率的延时长短
  65   2                      sck_1();   //时钟线为高电平时,数据必须稳定
  66   2              }
  67   1              sck_0();   
  68   1              sda_1();   //释放数据线
  69   1              response();//等待对方响应
  70   1      }
  71          
  72          uchar read_byte()         //读数据子程序
  73          {
  74   1              uchar i,temp=0;
  75   1              sck_0();
  76   1              sda_1();   //使数据线为输入方式
  77   1              for(i=0;i<8;i++)
  78   1              {
  79   2                      sck_1();        //使时钟线为高电平,数据有效    
  80   2                      temp=(temp<<1)|sda;     {;;;;;} //注意不同晶振频率的延时长短
  81   2                      sck_0();    //钳住I2C总线       
  82   2              }
  83   1              return temp;
  84   1      }
  85          
  86          void write_address(uchar sla,uchar data1)
  87          {                                   
  88   1              start();
  89   1              send_byte(sla);  //i2c地址
  90   1              send_byte(data1);        //数据
  91   1              stop();
  92   1      }
  93          
  94          void sendstring(uchar sla,uchar suad,uchar *p,uchar num)
  95          {
  96   1              uchar i;
  97   1              start();
  98   1              send_byte(sla);  //器件地址
  99   1              send_byte(suad);         //器件子地址
 100   1              for(i=0;i<num;i++,p++)
 101   1              {
 102   2                      send_byte(*p);   //发送数据
 103   2                      delay(1);
 104   2              }
 105   1              stop(); 
 106   1      }
 107          
 108          uchar read_address(uchar sla)
 109          {                          //向24C02任意地址读任意数据子程序            
 110   1              uchar data1;
 111   1              start();
 112   1              send_byte(sla);          //先发送地址+写方向
 113   1              start();                                 //接着又开始
 114   1              send_byte(sla+1);                 //改变方向
 115   1              data1=read_byte();
 116   1          ack(1);                      //发送非应答信号
 117   1              stop();                  //结束
C51 COMPILER V8.05a   I2C                                                                  02/14/2009 15:35:01 PAGE 3   

 118   1              return data1;
 119   1      }
 120          
 121          void readstring(uchar sla,uchar suad,uchar *s,uchar num)
 122          {                                       
 123   1              uchar i,table[32];
 124   1              table[0]=*s;
 125   1              start();
 126   1              send_byte(sla);          //先发送地址+写方向
 127   1              send_byte(suad);         //读24C02哪一地址的数据
 128   1              start();                                 //接着又开始
 129   1              send_byte(sla+1);                 //改变方向
 130   1              for(i=0;i<num-1;i++)
 131   1              {
 132   2      //              *s=read_byte();   //为什么指针最多加12就自动结束?
 133   2                      table[i]=read_byte();
 134   2                      ack(0);                  //发送应答信号
 135   2      //              s++;
 136   2                      delay(1);
 137   2              }
 138   1              *s=read_byte();
 139   1              ack(1);           //发送应非答信号
 140   1              stop();           //结束
 141   1      }
 142          
 143          void main()
 144          {
 145   1          uchar temp,sla,suad,i,num,data1,*p;
 146   1              uchar code team[32]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
 147   1                                                       0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,
 148   1                                                       0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
 149   1                                                       0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
 150   1              initial();
 151   1              initial_1602();
 152   1      
 153   1              sla=0x40;data1=0x64;
 154   1              write_address(sla,data1);       //向无子地址器件发送数据
 155   1              
 156   1              delay(100);               //需要延时一段时间
 157   1              sla=0x40;
 158   1              temp=read_address(sla);     //向无子地址器件读取数据
 159   1              display_1602(1,2,0,temp);       
 160   1              
 161   1              delay(100);               //需要延时一段时间
 162   1              sla=0xa0;suad=0x00;p=team; num=32;
 163   1              sendstring(sla,suad,p,num);       //向有子地址器件发送多字节数据
 164   1              
 165   1              delay(100);                //需要延时一段时间
 166   1              sla=0xa0;suad=0x90;p=&temp;num=32;      
 167   1              readstring(sla,suad,p,num);       //向有子地址器件读取多字节数据
 168   1              p=&temp;         
 169   1              display_1602(0,1,9,'H');
 170   1              for(i=0;i<32;i++,p++)
 171   1              {
 172   2                      display_HEX1602(1,1,7,*p);   //显示16进制数
 173   2                      delay(500);
 174   2              }
 175   1              while(1);
 176   1      }
 177          
 178          

C51 COMPILER V8.05a   I2C                                                                  02/14/2009 15:35:01 PAGE 4   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    795    ----
   CONSTANT SIZE    =     32    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      58
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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