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

📄 24c02.lst

📁 51单片机模拟实现I2C 协议
💻 LST
字号:
C51 COMPILER V7.06   24C02                                                                 07/26/2007 14:08:17 PAGE 1   


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

stmt level    source

   1          #include<reg52.h>
   2          #include <stdio.h>
   3          #include <intrins.h>
   4          #include <absacc.h>
   5          sbit RS=P1^0;   //设置连接线
   6          sbit RW=P1^1;
   7          sbit E=P1^2;
   8          sbit D7=P2^7;
   9          sbit scl=P3^2;  //24c02 SCL时钟线
  10          sbit sda=P3^3;  //24c02 SDA数据线
  11          
  12          #define uchar unsigned char
  13          #define uint unsigned int   
  14          unsigned char sec; //定义计数值,每过1 秒,sec 加1
  15          unsigned int tcnt; //
  16          
  17          uchar x24c02_read(uchar address);  //从24c02的地址address中读取一个字节数据
  18          void x24c02_write(uchar address,uchar info);//向24c02的address地址中写入一字节数据inf  
  19          void x24c02_init();   //24c02初始化子程序
  20          void delay1(uchar x);
  21          void flash();
  22          void x24c01_init();
  23          void start();
  24          void stop();
  25          void writex(uchar j);
  26          uchar readx();
  27          void clock();
  28          /*******************************
  29          以下为LCD1602的驱动程序
  30          ************************************/
  31          busy()  //系统忙检测函数
  32          { 
  33   1        do {P2=0xff;  
  34   2            RS=0; 
  35   2            RW=1;                 
  36   2            E=0;
  37   2           _nop_();
  38   2            E=1;
  39   2           }while (D7);
  40   1      }
  41          
  42          write_com(char commend)//写命令函数
  43          {
  44   1        P2=commend;
  45   1        RS=0;
  46   1        RW=0;
  47   1        E=0;
  48   1        busy();
  49   1        E=1;
  50   1      }
  51          
  52          i_lcd()//初始化函数
  53          {
  54   1        write_com(0x01);//清屏
  55   1        write_com(0x38);//置功能
C51 COMPILER V7.06   24C02                                                                 07/26/2007 14:08:17 PAGE 2   

  56   1        write_com(0x0c);//显示开
  57   1        write_com(0x06);//输入模式
  58   1        write_com(0x80);//显示位置
  59   1      }
  60          
  61          
  62          write_char(char lcddata)//写数据函数
  63          {
  64   1        P2=lcddata;
  65   1        RS=1;
  66   1        RW=0;
  67   1        E=0;
  68   1        busy();
  69   1        E=1;
  70   1      }
  71          /*******************************
  72          写一串数据
  73          ************************************/
  74          
  75          write_string(char * s)
  76          {
  77   1      while (*s!=0x00)
  78   1      write_char(*s++);
  79   1      }
  80          /*******************************
  81          以上为LCD1602的驱动程序
  82          ************************************/
  83          void delay1(uchar j)
  84          {
  85   1         uint i;
  86   1         for(i=0;i<j;i++);
  87   1         ;
  88   1      }
  89          /*******************************
  90          以下为24C02的驱动程序
  91          ************************************/
  92          void flash()////延时
  93          {;;
  94   1      }  
  95          ///////初始化
  96          void x24c02_init()             
  97          {
  98   1         scl=1; flash(); sda=1; flash();
  99   1      }
 100          /*******************************
 101          以下为24C02的开始信号SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
 102          ************************************/
 103          
 104          void start()
 105          {
 106   1         sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
 107   1      }
 108          /*******************************
 109          以下为24C02的结束信号//SCL为高电平时?,SDA由低电平向高电平跳变,结束传送数据。。
 110          ************************************/
 111          void stop()
 112          {
 113   1         sda=0; flash(); scl=1; flash(); sda=1; flash();
 114   1      }
 115           /*******************************
 116          以下为24C02的写一个字节
 117          ************************************/
C51 COMPILER V7.06   24C02                                                                 07/26/2007 14:08:17 PAGE 3   

 118          void writex(uchar j)
 119          {
 120   1         uchar i,temp;
 121   1         temp=j;
 122   1         for (i=0;i<8;i++)
 123   1         {
 124   2            temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
 125   2         }
 126   1         
 127   1         scl=0; flash(); sda=1; flash();
 128   1      }
 129           /*******************************************
 130             也可以这样写数据
 131              for (i=0;i<8;i++)
 132             {scl=0;flash();
 133             if(temp<<i&0x80) sda=1;else sda=0;scl=1; flash();
 134             ****************************************************************************
 135          以下为24C02的读一个字节
 136          ************************************/
 137          uchar readx()
 138          {
 139   1         uchar i,j,k=0;
 140   1         scl=0; flash(); sda=1;///数据线为输入状态
 141   1         for (i=0;i<8;i++){
 142   2            flash(); scl=1; flash();
 143   2            if (sda==1) j=1;
 144   2            else j=0;
 145   2            k=(k<<1)|j; scl=0;      ///////读数据 8位先传高位
 146   2         }
 147   1         flash(); return(k);
 148   1      }
 149          /*************************************
 150          每次响应,保持SDA高电平///这里写法个人认为可以不同,SDA也可以是低电瓶///其次考虑建立时间
 151          ********************/
 152          void clock()               ///时钟
 153          {
 154   1         uchar i=0;
 155   1         scl=1; flash();
 156   1         while ((sda==1)&&(i<255))i++;
 157   1         scl=0; flash();
 158   1      }
 159          uchar x24c02_read(uchar address)
 160          {
 161   1         uchar i;
 162   1         start(); writex(0xa0);///写操作
 163   1         clock(); 
 164   1         writex(address);
 165   1         clock();
 166   1         start();
 167   1         writex(0xa1); clock();//读操作
 168   1         i=readx(); stop();
 169   1         delay1(10);
 170   1         return(i);
 171   1      }
 172          /*****************************
 173          在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应
             -为1010)
 174          接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。

⌨️ 快捷键说明

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