eeprom_24c02.lst

来自「一些51单片机基础模块的程序」· LST 代码 · 共 340 行

LST
340
字号
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE EEPROM_24C02
OBJECT MODULE PLACED IN EEPROM_24C02.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE EEPROM_24C02.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /********************************************************************
   2          * 文件名  : EEPROM_24C02.c
   3          * 描述    :  该文件实现对24C02的操作。
   4                               确认试验是否成功:电源上电后,数码管的值在递增,观察值。关闭电源,待几秒后上电,
   5                               数码管显示的值会从断电钱的那个值开始显示。
   6          * 创建人  : 东流,2009年4月9日
   7          * 版本号  : 2.0
   8          * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
   9          * 感谢“中国自动化资讯网”对本工作室的大力支持。
  10          ***********************************************************************/
  11          #include <reg52.h>
  12          #include <intrins.h>
  13          
  14          #define uchar unsigned char
  15          #define uint  unsigned int
  16          
  17          sbit scl=P3^6;  //24c08 SCL
  18          sbit sda=P3^7;  //24c08 SDA
  19          
  20          uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09}; 
  21          uchar sec;      //定义计数值,每过1秒,sec加1 
  22          uint write;             //写标志位
  23          
  24          /********************************************************************
  25          * 名称 : delay1()
  26          * 功能 : 短暂延时
  27          * 输入 : x
  28          * 输出 : 无
  29          ***********************************************************************/
  30          void delay1(uchar x)
  31          {  
  32   1              uint i;
  33   1              for(i=0; i<x; i++)
  34   1              ;
  35   1      }
  36          
  37          /********************************************************************
  38          * 名称 : flash()
  39          * 功能 : 延时,时间为2个NOP,大概为2US
  40          * 输入 : 无
  41          * 输出 : 无
  42          ***********************************************************************/
  43          void flash(void) 
  44          {
  45   1              _nop_();
  46   1              _nop_();
  47   1      }
  48          
  49          /********************************************************************
  50          * 名称 : x24c02_init()
  51          * 功能 : 24c02初始化子程序
  52          * 输入 : 无
  53          * 输出 : 无
  54          ***********************************************************************/
  55          void x24c02_init(void) 
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 2   

  56          {
  57   1              scl = 1;
  58   1              flash();
  59   1              sda = 1;
  60   1              flash();
  61   1      }
  62          
  63          /********************************************************************
  64          * 名称 : start(void)
  65          * 功能 : 启动I2C总线
  66          * 输入 : 无
  67          * 输出 : 无
  68          ***********************************************************************/
  69          void start(void)
  70          {
  71   1              sda = 1;
  72   1              flash(); 
  73   1              scl = 1; 
  74   1              flash(); 
  75   1              sda = 0; 
  76   1              flash(); 
  77   1              scl = 0; 
  78   1              flash();
  79   1      }
  80          
  81          /********************************************************************
  82          * 名称 : stop()
  83          * 功能 : 停止I2C总线
  84          * 输入 : 无
  85          * 输出 : 无
  86          ***********************************************************************/
  87          void stop() 
  88          {
  89   1              sda = 0; 
  90   1              flash();
  91   1              scl = 1;
  92   1              flash();
  93   1              sda = 1;
  94   1              flash();
  95   1      }
  96          
  97          /********************************************************************
  98          * 名称 : writex()
  99          * 功能 : 写一个字节
 100          * 输入 : j(需要写入的值)
 101          * 输出 : 无
 102          ***********************************************************************/
 103          void writex(uchar j)
 104          {  
 105   1              uchar i,temp;
 106   1              temp = j;
 107   1              for(i=0; i<8; i++)
 108   1              {
 109   2                      temp = temp << 1; 
 110   2                      scl = 0; 
 111   2                      flash(); 
 112   2                      sda = CY; 
 113   2                      flash();
 114   2                      scl = 1; 
 115   2                      flash();
 116   2              }
 117   1              scl = 0;
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 3   

 118   1              flash(); 
 119   1              sda = 1;
 120   1              flash();
 121   1      }
 122          
 123          /********************************************************************
 124          * 名称 : readx()
 125          * 功能 : 读一个字节
 126          * 输入 : 无
 127          * 输出 : 读出的值
 128          ***********************************************************************/
 129          uchar readx(void)
 130          {
 131   1              uchar i, j, k = 0;
 132   1              scl = 0;
 133   1              flash();
 134   1              sda = 1;
 135   1              for(i=0; i<8; i++)
 136   1              {  
 137   2                      flash();
 138   2                      scl = 1;
 139   2                      flash();
 140   2                      if(sda == 1)
 141   2                      {
 142   3                              j = 1;
 143   3                      }
 144   2                      else j = 0;
 145   2                      k = (k << 1) | j; 
 146   2                      scl = 0;
 147   2              }
 148   1              flash(); 
 149   1              return(k);
 150   1      }
 151          
 152          /********************************************************************
 153          * 名称 : clock()
 154          * 功能 : I2C总线时钟
 155          * 输入 : 无
 156          * 输出 : 无
 157          ***********************************************************************/
 158          void clock(void)
 159          {
 160   1              uchar i = 0;
 161   1              scl = 1;
 162   1              flash();
 163   1              while((sda == 1) && (i < 255)) 
 164   1              {
 165   2                      i++;
 166   2              }
 167   1              scl = 0;
 168   1              flash();
 169   1      }
 170          
 171          /********************************************************************
 172          * 名称 : x24c02_read()
 173          * 功能 : 从24c02中读出值
 174          * 输入 : address(要在这个地址读取值)
 175          * 输出 : 从24c02中读出的值
 176          ***********************************************************************/
 177          uchar x24c02_read(uchar address)
 178          {
 179   1              uchar i;
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 4   

 180   1              start();
 181   1              writex(0xa0);
 182   1              clock();
 183   1              writex(address);
 184   1              clock();
 185   1              start();
 186   1              writex(0xa1);
 187   1              clock();
 188   1              i = readx();
 189   1              stop();
 190   1              delay1(10);
 191   1              return(i);
 192   1      }
 193          
 194          /********************************************************************
 195          * 名称 : x24c02_write()
 196          * 功能 : 想24c02中写入数据
 197          * 输入 : address(地址) , info(值)
 198          * 输出 : 无
 199          ***********************************************************************/
 200          void x24c02_write(uchar address, uchar info)
 201          {
 202   1              EA = 0;
 203   1              start();
 204   1              writex(0xa0);
 205   1              clock();
 206   1              writex(address);
 207   1              clock();
 208   1              writex(info);
 209   1              clock();
 210   1              stop();
 211   1              EA = 1;
 212   1              delay1(50);
 213   1      }
 214          
 215          /********************************************************************
 216          * 名称 : Delay_1ms()
 217          * 功能 : 延时,延时时间为 1ms * i
 218          * 输入 : i(延时1ms的个数)
 219          * 输出 : 无
 220          ***********************************************************************/
 221          void Delay_1ms(uint i)
 222          {
 223   1              uchar x, j;
 224   1              for(j=0; j<i; j++)
 225   1              for(x=0; x<=148; x++)
 226   1              ;       
 227   1      }
 228          
 229          /********************************************************************
 230          * 名称 : LED()
 231          * 功能 : 显示
 232          * 输入 : 无
 233          * 输出 : 无
 234          ***********************************************************************/
 235          void LED()                  //LED显示函数
 236          {
 237   1              P2 = 0x02; 
 238   1              P0 = table[sec / 10]; 
 239   1              Delay_1ms(5);
 240   1              P2 = 0x01;
 241   1              P0 = table[sec % 10];
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 5   

 242   1              Delay_1ms(5);
 243   1      }
 244          
 245          /********************************************************************
 246          * 名称 : time0()
 247          * 功能 : 定时中断函数,每秒中sec加一,并且写标识write使能
 248          * 输入 : del
 249          * 输出 : 无
 250          ***********************************************************************/
 251          void time0(void) interrupt 1 using 3  //定时中断服务函数
 252          {
 253   1              static uchar Count = 0; 
 254   1              TH0 = (65536 - 50000) / 256; //对TH0 TL0赋值
 255   1              TL0 = (65536 - 50000) % 256; //重装计数初值
 256   1              Count++;        //每过250ust tcnt加一
 257   1              if(Count == 20)  //计满20次(1秒)时
 258   1              { 
 259   2                      Count = 0;   //重新再计
 260   2                      sec++;
 261   2                      write = 1;  //1秒写一次24C08
 262   2                      if(sec == 100) //定时100秒,在从零开始计时
 263   2                      {
 264   3                              sec = 0;
 265   3                      } 
 266   2              } 
 267   1      }
 268          
 269          /********************************************************************
 270          * 名称 : Time0_Init()
 271          * 功能 : 定时器0的初始化
 272          * 输入 : 无
 273          * 输出 : 无
 274          ***********************************************************************/
 275          void Time0_Init(void)
 276          {
 277   1              TMOD = 0x01;                    //定时器工作在方式1
 278   1              ET0 = 1;
 279   1              EA = 1; 
 280   1              TH0 = (65536 - 50000) / 256;    //对TH0 TL0赋值
 281   1              TL0 = (65536 - 50000) % 256;    //使定时器0.05秒中断一次
 282   1              TR0 = 1;                                        //开始计时
 283   1      }
 284          
 285          /********************************************************************
 286          * 名称 : Main()
 287          * 功能 : 主函数
 288          * 输入 : 无
 289          * 输出 : 无
 290          ***********************************************************************/
 291          void Main(void) 
 292          {
 293   1              P2 = 0x00; 
 294   1              x24c02_init();          //初始化24C02
 295   1              Time0_Init();
 296   1              sec = x24c02_read(2);   //读出保存的数据赋于sec
 297   1              while(1) 
 298   1              {
 299   2                      LED();
 300   2                      if(write == 1)                          //判断计时器是否计时一秒
 301   2              {
 302   3                              write =0 ;              //清零 
 303   3                              x24c02_write(2,sec);    //在24c08的地址2中写入数据sec
C51 COMPILER V7.50   EEPROM_24C02                                                          04/09/2009 19:07:06 PAGE 6   

 304   3                      }
 305   2              }
 306   1      }


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


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

⌨️ 快捷键说明

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