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

📄 i2c.lst

📁 C8051F226单片机的初始化
💻 LST
字号:
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: D:\Keil C51\C51\BIN\C51.EXE I2C.c OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //*******************************************************
   2          //      文件名:I2C.c
   3          //  创建人: ZFZ
   4          //  建立时间: 2008-6-6
   5          //  版本描 述: STIV8.0.0
   6          //      文件描述:标准80C51单片机模拟I2C总线的主机程序
   7          //  功能描述:
   8          //      备注:本程序仅供学习参考,版权归江西新和公司所有,勿用于商业目的
   9          //  最后修改时间:      
  10          //*******************************************************
  11          #include <C8051F340.h>
  12          #include <intrins.h>
  13          #include "I2C.h"
  14          
  15          
  16          /*---------------------------------------------
  17          函数名:Romdelay
  18          功  能:24C512的延时
  19          参  数:uint x
  20          返回值:无
  21          修改记录
  22          ----------------------------------------------
  23          日期     作者      内容
  24          
  25          ---------------------------------------------*/
  26          void Romdelay(unsigned int x)
  27          {
  28   1       unsigned int i;
  29   1       for(i=0;i<x;i++);
  30   1      }
  31          
  32          
  33          /*---------------------------------------------
  34          函数名: sta
  35          功  能:24C512起始条件
  36          参  数:无
  37          返回值:无
  38          修改记录
  39          ----------------------------------------------
  40          日期     作者      内容
  41          
  42          ---------------------------------------------*/
  43          void sta(void)
  44          {
  45   1       SDA=1;              //SCL为高时,SDA的下降延开始
  46   1       Romdelay(50);
  47   1       //_nop_();
  48   1       SCL=1;
  49   1       while(SCL==0)
  50   1       {;}
  51   1       //_nop_();
  52   1       //_nop_();
  53   1       //_nop_();
  54   1       //_nop_();
  55   1       //_nop_();
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 2   

  56   1       Romdelay(100);
  57   1       SDA=0;
  58   1       //_nop_();
  59   1       //_nop_();
  60   1       //_nop_();
  61   1       //_nop_();
  62   1       //_nop_();
  63   1       //_nop_();
  64   1       Romdelay(100);
  65   1       SCL=0;
  66   1       //_nop_();
  67   1       //_nop_();
  68   1       Romdelay(100);
  69   1      }
  70          
  71          /*---------------------------------------------
  72          函数名:stop
  73          功  能:24C512停止
  74          参  数:无
  75          返回值:无
  76          修改记录
  77          ----------------------------------------------
  78          日期     作者      内容
  79          
  80          ---------------------------------------------*/
  81          void stop(void)
  82          {
  83   1       SDA=0;           //SCL为高时,SDA的上升延停止
  84   1       SCL=1;
  85   1       while(SCL==0)
  86   1       {;}
  87   1       //_nop_();
  88   1       //_nop_();
  89   1       //_nop_();
  90   1       //_nop_();
  91   1       //_nop_();
  92   1       Romdelay(100);
  93   1       SDA=1;
  94   1       //_nop_();
  95   1       //_nop_();
  96   1       //_nop_();
  97   1       //_nop_();
  98   1       //_nop_();
  99   1       Romdelay(100);
 100   1      }
 101          
 102          /*---------------------------------------------
 103          函数名:wrbyt
 104          功  能:向EEPROM写一个字节函数
 105          参  数:uchar shu 
 106          返回值:无
 107          修改记录
 108          ----------------------------------------------
 109          日期     作者      内容
 110          
 111          ---------------------------------------------*/
 112          void wrbyt(unsigned char shu)
 113          {
 114   1       unsigned char i;
 115   1      
 116   1       for(i=0;i<8;i++)
 117   1       {
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 3   

 118   2        SDA=((shu&0x80)>0)?1:0;   //取数据最高位,先传高再低
 119   2        Romdelay(100);
 120   2       //_nop_();
 121   2        SCL=1;
 122   2        //_nop_();
 123   2        //_nop_();
 124   2        //_nop_();
 125   2        //_nop_();
 126   2        //_nop_();
 127   2        Romdelay(100);
 128   2        SCL=0;                    //SDA上的数据只有在SCL为低时才能改变
 129   2        Romdelay(100);
 130   2        //_nop_();
 131   2        shu<<=1;                  //数据左移一位
 132   2       }
 133   1      }
 134          
 135          /*---------------------------------------------
 136          函数名:rdbyt
 137          功  能:从EEPROM读一个字节
 138          参  数:无
 139          返回值:uchar nn  
 140          修改记录
 141          ----------------------------------------------
 142          日期     作者      内容
 143          
 144          ---------------------------------------------*/
 145          unsigned char rdbyt(void)
 146          {
 147   1       unsigned char nn=0xff;
 148   1       unsigned char j;
 149   1      
 150   1       for(j=0;j<8;j++)
 151   1       {
 152   2        SDA=1;
 153   2        //_nop_();
 154   2        //_nop_();
 155   2        //_nop_();
 156   2        //_nop_();
 157   2        //_nop_();
 158   2        Romdelay(100);
 159   2        SCL=1;
 160   2        if(SDA==0)
 161   2        {
 162   3         nn<<=1;
 163   3         nn=(nn&0xfe);
 164   3         SCL=0;
 165   3        }
 166   2        else
 167   2        {
 168   3         nn<<=1;
 169   3         nn=(nn|0x01);
 170   3         SCL=0;
 171   3        }
 172   2       }
 173   1       return(nn);
 174   1      }
 175          
 176          
 177          /*---------------------------------------------
 178          函数名:mack
 179          功  能:
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 4   

 180          参  数:无
 181          返回值:无
 182          修改记录
 183          ----------------------------------------------
 184          日期     作者      内容
 185          
 186          ---------------------------------------------*/
 187          void mack(void)
 188          {
 189   1       SDA=0;
 190   1       SCL=1;
 191   1       Romdelay(100);
 192   1       //_nop_();
 193   1       //_nop_();
 194   1       //_nop_();
 195   1       //_nop_();
 196   1       //_nop_();
 197   1       //_nop_();
 198   1       SCL=0;
 199   1       SDA=1;
 200   1      }
 201          
 202          /*---------------------------------------------
 203          函数名:mnack
 204          功  能:
 205          参  数:无
 206          返回值:无
 207          修改记录
 208          ----------------------------------------------
 209          日期     作者      内容
 210          
 211          ---------------------------------------------*/
 212          void mnack(void)
 213          {
 214   1       SDA=1;
 215   1       SCL=1;
 216   1       //_nop_();
 217   1       //_nop_();
 218   1       //_nop_();
 219   1       //_nop_();
 220   1       //_nop_();
 221   1       //_nop_();
 222   1       Romdelay(100);
 223   1       SCL=0;
 224   1       SDA=0;
 225   1      }
 226           
 227          /*---------------------------------------------
 228          函数名:cack
 229          功  能:返回应答信号
 230          参  数:无
 231          返回值:F0(0或1)
 232          修改记录
 233          ----------------------------------------------
 234          日期     作者      内容
 235          
 236          ---------------------------------------------*/
 237          bit cack(void)
 238          {
 239   1       bit F0;
 240   1       //_nop_();
 241   1       //_nop_();
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 5   

 242   1       //_nop_();
 243   1       Romdelay(50);
 244   1       SDA=1;
 245   1       //_nop_();
 246   1       //_nop_();
 247   1       //_nop_();
 248   1       Romdelay(50);
 249   1       SCL=1;
 250   1       //_nop_();
 251   1       //_nop_();
 252   1       //_nop_();
 253   1       //_nop_();
 254   1       //_nop_();
 255   1       //_nop_();
 256   1       Romdelay(200);
 257   1       F0=(SDA==0)?0:1;
 258   1       SCL=0;
 259   1       //_nop_();
 260   1       //_nop_();
 261   1       //_nop_();
 262   1       //_nop_();
 263   1       //_nop_();
 264   1       //_nop_();
 265   1       //_nop_();
 266   1       Romdelay(100);
 267   1       return(F0);
 268   1      }
 269          
 270          /*---------------------------------------------
 271          函数名:rdnbyt
 272          功  能:从EEPROM读出一个数组函数
 273          参  数:unsigned int SubAddr,unsigned char number,unsigned char qq[]
 274          返回值:unsigned char qq[]
 275          修改记录
 276          ----------------------------------------------
 277          日期     作者      内容
 278          
 279          ---------------------------------------------*/
 280          void rdnbyt(unsigned int SubAddr,unsigned char number,unsigned char qq[])
 281          {
 282   1       unsigned char l;
 283   1       unsigned char addh,addl;
 284   1       bit cflag=0;
 285   1      
 286   1       addh = SubAddr / 0x100;
 287   1       addl = SubAddr % 0x100;
 288   1       sta();
 289   1       wrbyt(0xA0);   
 290   1       cflag=cack();
 291   1       wrbyt(addh);
 292   1       cflag=cack();
 293   1       wrbyt(addl);
 294   1       cflag=cack();
 295   1       
 296   1       sta();
 297   1       wrbyt(0xA1);     //写命令字(读)
 298   1       cflag=cack();
 299   1      
 300   1       for(l=0;l<number;l++)
 301   1       {
 302   2        qq[l]=rdbyt();
 303   2        if(l<(number-1))
C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 6   

 304   2        { 
 305   3         mack(); 
 306   3        } 
 307   2        Romdelay(100);   
 308   2       }
 309   1       mnack();
 310   1       Romdelay(100);  
 311   1       stop();
 312   1       Romdelay(2000);
 313   1      }
 314          
 315          /*---------------------------------------------
 316          函数名:wrnbyt
 317          功  能:向EEPROM写一个数组
 318          参  数:unsigned int SubAddr,unsigned char number,unsigned char ff[]
 319          返回值:无
 320          修改记录
 321          ----------------------------------------------
 322          日期     作者      内容
 323          
 324          ---------------------------------------------*/
 325          void wrnbyt(unsigned int SubAddr,unsigned char number,unsigned char ff[])
 326          {
 327   1       unsigned char k;
 328   1       unsigned char addh,addl;
 329   1       bit cflag=0;
 330   1      
 331   1       addh = SubAddr / 0x100;
 332   1       addl = SubAddr % 0x100;
 333   1      
 334   1       for (k=0;k<number;k++)
 335   1       {
 336   2        if ((k==0) || (addl==0)||(addl==128)) //页边界处理。
 337   2        {
 338   3         sta();           //开始
 339   3         wrbyt(0xA0);     //写命令字(写)1010(000)0
 340   3         cflag=cack();
 341   3         wrbyt(addh);
 342   3         cflag=cack();
 343   3         wrbyt(addl);
 344   3         cflag=cack();
 345   3        }
 346   2        wrbyt(ff[k]);
 347   2        cflag=cack();      //接收应答信号
 348   2        Romdelay(100);     //延时
 349   2        addl=addl+1;
 350   2        if((addl==128)||(addl==0))
 351   2        {
 352   3         addh=(addl==0)?(addh+1):addh;
 353   3         stop();
 354   3         Romdelay(2000); //延时
 355   3        }
 356   2       }
 357   1       Romdelay(200);  //延时
 358   1       stop();         //停止
 359   1       Romdelay(2000); //延时
 360   1      }
 361          
 362          
 363          
 364          

C51 COMPILER V7.50   I2C                                                                   09/18/2008 15:29:04 PAGE 7   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    482    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      17
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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