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

📄 shiyan4.lst

📁 单片机I2C总线设计 程序功能:利用I2C总线写或读E2PROM 向E2PROM写n个数据
💻 LST
字号:
C51 COMPILER V8.01   SHIYAN4                                                               10/26/2008 19:39:37 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE SHIYAN4
OBJECT MODULE PLACED IN shiyan4.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE shiyan4.c BROWSE DEBUG OBJECTEXTEND TABS(6)

line level    source

   1          //**程序设计**作者hyg214**网名**展凌**
   2          //程序功能:利用I2C总线写或读E2PROM
   3          //向E2PROM写n个数据,再按头尾地址读出
   4          //当然你也可以设置n=1;那就只写读一个数据
   5          //************************************
   6          //********************************************
   7          #include<reg52.h> 
   8          #include<intrins.h>//空操作需要的头文件
   9          #define uchar unsigned char
  10          sbit sda=P2^0;//声明控制信号
  11          sbit scl=P2^1;
  12          
  13          uchar idata tab[]={
  14          //数码显示从0-9数字,读ROM时
  15          0x3f,0x06,0x5b,0x4f,0x66,
  16          0x6d,0x7d,0x07,0x7f,0x6f};
  17          
  18          uchar idata sdate[50];//接收数据的数组变量
  19          uchar tn=0;//从那个地址开始读
  20          uchar m=10;//读出时要读几个数据
  21          //你可以只读一个(m=1),但这个程序让它循环显示
  22          uchar n=10;//写入数据的个数
  23          uchar  idata mdate[10]={53,28,37,45,69,74,56,82,30,99};//要写入的数据
  24          //*********************************************
  25          
  26          //----------------------------------
  27          void delay()//延时函数
  28          {//约等于5us用于控制信号SDA,SCL的延时
  29   1        uchar i;i++;
  30   1      }
  31          //----------------------------------
  32          void delay_ms(uchar z)//延时函数
  33          {//约等于z*0.5ms
  34   1       //用于写、读间时;数码动态显示间时
  35   1          uchar i,j;
  36   1          for(i=z;i>0;i--)
  37   1             for(j=222;j>0;j--);
  38   1      }
  39          //----------------------------------
  40          void intc()//初始化函数
  41          {
  42   1          sda=1;//控制信号拉高
  43   1          scl=1;
  44   1          P0=0x00;//数码管不显示
  45   1      }
  46          //----------------------------------
  47          void start()//起始信号函数
  48          {//向ROM发送一个开始的信号
  49   1          sda=1;
  50   1          scl=1;
  51   1          delay();
  52   1          sda=0;
  53   1          delay();
  54   1          scl=0; 
  55   1      }
C51 COMPILER V8.01   SHIYAN4                                                               10/26/2008 19:39:37 PAGE 2   

  56          //----------------------------------
  57          void stop()//停止信号函数
  58          {//向ROM发送一个停止的信号
  59   1          sda=0;
  60   1          scl=1;
  61   1          delay();
  62   1          sda=1;
  63   1          delay();
  64   1          scl=0;  
  65   1      }
  66          //----------------------------------
  67          void respons()//产生应答信号函数
  68          {//接收一数据后应答
  69   1          sda=0;
  70   1          scl=1;
  71   1          delay();
  72   1          scl=0;
  73   1          sda=1;
  74   1      }
  75          //----------------------------------
  76          void no_respons()//产生非应答信号函数
  77          {//接收一数据没应答,则强制
  78   1          sda=0;
  79   1          scl=1;
  80   1          delay();
  81   1          scl=0;
  82   1          sda=1;
  83   1      }
  84          //----------------------------------
  85          void write_date(uchar date)//向E2PEOM写数据函数
  86          {//向E2PROM写一字节数据
  87   1          uchar i,temp;
  88   1           temp=date;
  89   1           for(i=0;i<8;i++)//总共写入8次位=1字节=1个数据
  90   1           {
  91   2                temp=temp<<1;//要存的数据左移1位,最高位给CY了
  92   2                scl=0;  //数据可以改变
  93   2                delay();
  94   2                sda=CY; //写入一位
  95   2                delay();
  96   2                scl=1;  //数据稳定,不能写了
  97   2                delay();
  98   2           }
  99   1           scl=0;
 100   1           delay();
 101   1           sda=1;//稳定数据
 102   1           delay(); 
 103   1      }
 104          //----------------------------------
 105          uchar read_date()//从E2PROM读出数据函数
 106          {//根据
 107   1           uchar i,k;
 108   1           scl=0;//数据改变
 109   1           delay();
 110   1           sda=1;//可读信号
 111   1           for(i=0;i<8;i++)//读出8次位=1字节=1个数据
 112   1           {
 113   2                scl=1;//数据稳定,可从sda读出一位
 114   2                delay();
 115   2                k=(k<<1)|sda;//写入时是从高位写,读出时也一行
 116   2                scl=0;//数据改变(准备下一位)
 117   2                delay();
C51 COMPILER V8.01   SHIYAN4                                                               10/26/2008 19:39:37 PAGE 3   

 118   2           }
 119   1           delay();
 120   1           return k;//返回读出的一个数据 
 121   1      }
 122          //----------------------------------
 123          void write_sword(uchar sta,uchar n,uchar *date)//写入串数据函数
 124          {//根据起始地址、数据个数及数据写入E2PEOM中
 125   1           uchar i;//计数变量
 126   1           start();//起始
 127   1           write_date(0xa0);//E2PROM地址(ATC02为oxa0)
 128   1           respons();//应答
 129   1           write_date(sta);//写入数据要存放的地址
 130   1           respons();//应答
 131   1           for(i=0;i<n;i++)
 132   1           {
 133   2               write_date(date[i]);//写入数据
 134   2               respons();//应答
 135   2           }
 136   1           stop();//停止
 137   1      }
 138          //-----------------------------------
 139          uchar read_sword(uchar sta,uchar n)//读出串数据函数
 140          {//根据起始地址和读出个数,从E2PROM读出一串数据
 141   1           uchar i;//计数个数
 142   1           start();//起始
 143   1           write_date(0xa0);//AO表示主机向从机写数据
 144   1           respons();//应答
 145   1           write_date(sta);//数据地址
 146   1           respons();//应答
 147   1      
 148   1           start();//起始
 149   1           write_date(0xa1);//A1表示从机从主机读取数据
 150   1           for(i=0;i<n;i++)
 151   1           {
 152   2               respons();//应答
 153   2               *(sdate+i)=read_date();//读出数据存入数组         
 154   2           }
 155   1           no_respons();//非应答     
 156   1           stop();//停止
 157   1           return 1;//返回读出的数组数据
 158   1      }
 159          //----------------------------------
 160          void display(uchar *dat)//数码管显示函数
 161          {//从E2PROM读出的数据在数码管显示出来
 162   1         uchar i,j,k,tem1,tem0,temp;
 163   1         //计数变量,2个延时用,十位和个位,传值变量
 164   1         for(i=0;i<m;i++)
 165   1         {
 166   2           temp=*(dat+tn++);
 167   2           if(tn==n){tn=0;}//这里让它循环显示
 168   2           tem1=temp/10;//十位
 169   2           tem0=temp%10;//个位
 170   2           for(j=8;j>0;j--)
 171   2             for(k=8;k>0;k--)//大约1s一个数据
 172   2             {
 173   3                P2=0x10;//选通二个数码管
 174   3                P0=tab[tem1];//显示十位
 175   3                delay_ms(20);//延时10ms,动态显示时暂停时间
 176   3                //太快,不够亮,太慢,不稳定(闪烁),一般10ms
 177   3                P2=0x20;
 178   3                P0=tab[tem0];
 179   3                delay_ms(20);
C51 COMPILER V8.01   SHIYAN4                                                               10/26/2008 19:39:37 PAGE 4   

 180   3             }    
 181   2         }
 182   1      }
 183          //----------------------------------
 184          void main()//主函数
 185          {//功能:初始化,写数据,读数据,显示数据
 186   1           uchar i=0,temp;//i表示开始读的地址    
 187   1           intc();//初始化
 188   1           write_sword(i,n,mdate);//根据起始地址和个数,串数据写入E2PROM
 189   1           delay_ms(100);//延时,写入和读出要有个时间的
 190   1           temp=read_sword(i,n);//根据地址读出一串数据   
 191   1           while(temp)
 192   1           {
 193   2               display(sdate);//读出的数据用数码管显示出来
 194   2           } 
 195   1      }
 196          //-----------------------------------


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    408    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3      10
   IDATA SIZE       =     70    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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