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

📄 main.lst

📁 24c02的keilc程序
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  01/27/2008 16:21:54 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*     51系列单片机在使用时,有时需要模拟I2C总线,                      */
   2          /*   这里举出一个实例(读写串行EEPROM芯片at2402)                       */
   3          /************************************************************************/
   4          /* Name:AT24C02存储器的读写程序,用到I2C总线,含相对独立的I2C总线读写函数 */
   5          /* Language: C51单片机编程语言                                          */
   6          /* Platform: Win98,Intel Celeron 433 Processor,伟福仿真器,仿真8751     */
   7          /* Author:  StephenZhu    javasdk@163.com                               */
   8          /* Date: 2003年5月21日,5月22日,5月29日                                  */
   9          /* Version: 1.1.1                            */
  10          /* Others: None                                                         */
  11          /************************************************************************/
  12          
  13              #include<string.h>
  14              #include<reg52.h>
  15              #include<intrins.h>
  16                  #include "LCM1602.h"
  17              #define DELAY_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
  18              #define TRUE 1
  19              #define FALSE 0
  20          
  21              sbit SCL=P3^5;/*假设由P1.7和P1.6控制*/
  22              sbit SDA=P3^4;
  23          
  24          
  25          /********** Function Definition 函数定义 ************/
  26          
  27              void DELAY(unsigned int t) /*延时函数*/
  28              {
  29   1              while(t!=0)
  30   1                  t--;
  31   1          }
  32          
  33              void I2C_Start(void)
  34              {
  35   1              /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
  36   1              SDA=1;
  37   1              SCL=1;
  38   1              DELAY(DELAY_TIME);
  39   1              SDA=0;
  40   1              DELAY(DELAY_TIME);
  41   1              SCL=0;
  42   1              DELAY(DELAY_TIME);
  43   1          }
  44          
  45              void I2C_Stop(void)
  46              {
  47   1              /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
  48   1              SDA=0;
  49   1              SCL=1;
  50   1              DELAY(DELAY_TIME);
  51   1              SDA=1;
  52   1              DELAY(DELAY_TIME);
  53   1              SCL=0;
  54   1              DELAY(DELAY_TIME);
  55   1          }
C51 COMPILER V7.06   MAIN                                                                  01/27/2008 16:21:54 PAGE 2   

  56          
  57              void SEND_0(void)   /* SEND ACK */
  58              {
  59   1              /*发送0,在SCL为高电平时使SDA信号为低*/
  60   1              SDA=0;
  61   1              SCL=1;
  62   1              DELAY(DELAY_TIME);
  63   1              SCL=0;
  64   1              DELAY(DELAY_TIME);
  65   1          }
  66          
  67              void SEND_1(void)
  68              {
  69   1              /*发送1,在SCL为高电平时使SDA信号为高*/
  70   1              SDA=1;
  71   1              SCL=1;
  72   1              DELAY(DELAY_TIME);
  73   1              SCL=0;
  74   1              DELAY(DELAY_TIME);
  75   1          }
  76          
  77              bit Check_Acknowledge(void)
  78              {
  79   1              /*发送完一个字节后检验设备的应答信号*/
  80   1              SDA=1;
  81   1              SCL=1;
  82   1              DELAY(DELAY_TIME/2);
  83   1              F0=SDA;
  84   1              DELAY(DELAY_TIME/2);
  85   1              SCL=0;
  86   1              DELAY(DELAY_TIME);
  87   1              if(F0==1)
  88   1                  return FALSE;
  89   1              return TRUE;
  90   1          }
  91          
  92              void WriteI2CByte(char b)reentrant
  93              {
  94   1              /*向I2C总线写一个字节*/
  95   1              char i;
  96   1              for(i=0;i<8;i++)
  97   1                  if((b<<i)&0x80)
  98   1                      SEND_1();
  99   1                  else
 100   1                      SEND_0();
 101   1          }
 102          
 103          
 104              char ReadI2CByte(void)reentrant
 105              {
 106   1              /*从I2C总线读一个字节*/
 107   1              char b=0,i;
 108   1              for(i=0;i<8;i++)
 109   1              {
 110   2                  SDA=1;    /*释放总线*/
 111   2                  SCL=1;    /*接受数据*/
 112   2                  DELAY(10);
 113   2                  F0=SDA;
 114   2                  DELAY(10);
 115   2                  SCL=0;
 116   2                  if(F0==1)
 117   2                      {
C51 COMPILER V7.06   MAIN                                                                  01/27/2008 16:21:54 PAGE 3   

 118   3                          b=b<<1;
 119   3                          b=b|0x01;
 120   3                      }
 121   2                  else
 122   2                      b=b<<1;
 123   2              }
 124   1              return b;
 125   1          }
 126          
 127          
 128          /**********以下为读写24c02的函数**********/
 129          void Write_One_Byte(char addr,char thedata)
 130          {
 131   1                bit acktemp=1;
 132   1                /*write a byte to mem*/
 133   1                I2C_Start();
 134   1                WriteI2CByte(0xa0);
 135   1                acktemp=Check_Acknowledge();
 136   1                WriteI2CByte(addr);/*address*/
 137   1                acktemp=Check_Acknowledge();
 138   1                WriteI2CByte(thedata);/*thedata*/
 139   1                acktemp=Check_Acknowledge();
 140   1                I2C_Stop();
 141   1      
 142   1      }
 143          
 144          void Write_A_Page(char *buffer,char addr)
 145          {
 146   1                bit acktemp=1;
 147   1      //          bit wrtmp;
 148   1                int i;
 149   1                /*write a page to at24c02*/
 150   1                I2C_Start();
 151   1                WriteI2CByte(0xa0);
 152   1                acktemp=Check_Acknowledge();
 153   1                WriteI2CByte(addr);/*address*/
 154   1                acktemp=Check_Acknowledge();
 155   1                for(i=0;i<7;i++)
 156   1                {
 157   2                  WriteI2CByte(buffer[i]);
 158   2                  if(!Check_Acknowledge())
 159   2                      {
 160   3                          I2C_Stop();
 161   3      
 162   3                      }
 163   2                 }
 164   1      
 165   1      
 166   1                I2C_Stop();
 167   1      
 168   1      }
 169          
 170          char Read_One_Byte(char addr)
 171          {         bit acktemp=1;
 172   1                char mydata;
 173   1                 /*read a byte from mem*/
 174   1                I2C_Start();
 175   1                WriteI2CByte(0xa0);
 176   1                acktemp=Check_Acknowledge();
 177   1                WriteI2CByte(addr);/*address*/
 178   1                acktemp=Check_Acknowledge();
 179   1                I2C_Start();
C51 COMPILER V7.06   MAIN                                                                  01/27/2008 16:21:54 PAGE 4   

 180   1                WriteI2CByte(0xa1);
 181   1                acktemp=Check_Acknowledge();
 182   1      
 183   1      
 184   1                mydata=ReadI2CByte();
 185   1                acktemp=Check_Acknowledge();
 186   1      
 187   1                return mydata;
 188   1                I2C_Stop();
 189   1      }
 190          
 191          void Read_N_Bytes(char *buffer,char n,char addr)
 192          {
 193   1                bit acktemp=1;
 194   1      
 195   1                int i=0;
 196   1                 /*read 8 bytes from mem*/
 197   1                I2C_Start();
 198   1                WriteI2CByte(0xa0);
 199   1                acktemp=Check_Acknowledge();
 200   1                WriteI2CByte(addr);/*address*/
 201   1                acktemp=Check_Acknowledge();
 202   1                I2C_Start();
 203   1                WriteI2CByte(0xa1);
 204   1      
 205   1                acktemp=Check_Acknowledge();
 206   1      
 207   1       
 208   1      
 209   1      
 210   1                for(i=0;i<n;i++)
 211   1                {
 212   2                      buffer[i]=ReadI2CByte();
 213   2                      if(i!=n-1)
 214   2                          SEND_0();    /*发送应答*/
 215   2                      else
 216   2                          SEND_1();    /*发送非应答*/
 217   2                }
 218   1      
 219   1         I2C_Stop();
 220   1      
 221   1      }
 222          
 223          
 224          void main()
 225          {
 226   1                int i;
 227   1                char mybyte;
 228   1                char myarray[8];
 229   1                char myarray2[8];
 230   1                char rdarray[16];
 231   1                
 232   1                for(i=0;i<8;i++)
 233   1                {
 234   2                      myarray[i]=i;
 235   2                      myarray2[i]=i+0x08;     
 236   2      
 237   2                }
 238   1      
 239   1                Write_One_Byte(0x20,0x28);
 240   1      
 241   1                Write_A_Page(myarray,0x10);
C51 COMPILER V7.06   MAIN                                                                  01/27/2008 16:21:54 PAGE 5   

 242   1                Write_A_Page(myarray2,0x18);
 243   1      
 244   1                mybyte=Read_One_Byte(0x20);
 245   1                Read_N_Bytes(rdarray,16,0x10);
 246   1      
 247   1      }
 248          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    645    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      43
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       4
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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