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

📄 at24c02.lst

📁 c8051f020源代码39个 使用Silicon Labs IDE 调试器
💻 LST
字号:
C51 COMPILER V7.05   AT24C02                                                               02/14/2006 09:04:33 PAGE 1   


C51 COMPILER V7.05, COMPILATION OF MODULE AT24C02
OBJECT MODULE PLACED IN AT24C02.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe AT24C02.C DB OE

stmt level    source

   1          //参考程序A:AT24C02.C   SMBUS  24C02 读/写  2005.12.25
   2          //程序功能:在AT24C02的地址00---3FH中依次存入连续的数据10H--4FH
   3          //再依次从地址00---3FH中读出数据并通过SAA1064驱动四位数码管显示出来.
   4          //第一,二位数码管显示地址,第三,四位数码管显示存入该地址内的数据.
   5          //显示格式:
   6          //存储器的地址  存储器单元的内容
   7          //00H---3FH     40H---4FH
   8          #include <c8051f020.h>                    // SFR declarations
   9          #include <intrins.h>
  10          #define  WRITE       0x00                 //  SMBUS寻址字节的写标志位
  11          #define  READ        0x01                 //  SMBUS寻址字节的读标志位
  12          // Device addresses
  13          #define  CHIP_A        0xA0                //AT24C02器件自身的寻址字节
  14          #define  CHIP_B        0x70                //AT24C02器件自身的寻址字节
  15          #define  SMB_BUS_ERROR  0x0  //总线错误                                  
  16            //MT为主发送器,MR为主接收器
  17          #define  SMB_START      0x08              // (MT & MR) 发送起始位
  18          #define  SMB_RP_START   0x10              // (MT & MR) 重复起始位
  19          #define  SMB_MTADDACK   0x18              // (MT) 发送从地址 + W 后收到ACK
  20          #define  SMB_MTADDNACK  0x20              // (MT) 发送从地址 + W 后收到NACK
  21          #define  SMB_MTDBACK    0x28              // (MT) 发送数据后收到ACK
  22          #define  SMB_MTDBNACK   0x30              // (MT) 发送数据后收到NACK
  23          #define  SMB_MTARBLOST  0x38              //(MT)竞争失败
  24          #define  SMB_MRADDACK   0x40              // (MR) 发送从地址 + R 后收到 ACK
  25          #define  SMB_MRADDNACK  0x48              // (MR) 发送从地址 + R 后收到 NACK
  26          #define  SMB_MRDACK     0x50              // (MR) 收到数据字节 后已发送ACK                                
             -    
  27          #define  SMB_MRDBNACK   0x58              // (MR) 收到数据字节 后已发送NACK      
  28          char DATA0[6]={0x17,0x3f,0x06,0x5b,0x4f}; 
  29          char    xdata DATA2[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  30          char SLAW,DATA1[64];                    // 保存从地址+ WRITE 位
  31          char SLAR;                              // 保存从地址+ WRITE 位
  32          char WORD,WORDADR;                      // 保存被收/发的数据字节
  33          char xdata sendnumber;                  // 保存被收/发的数据字节的数目        
  34          //unsigned char xdata  WORDADR;         //保存被传送的数据在24C02中的首地址.
  35          unsigned char xdata SENDMODE;           //SENDMODE作读/写控制字                       
  36          unsigned char xdata  i,j,k,sla,n,m,p;
  37          bit SM_BUSY;           //忙碌标志位                                        void sleep_ms( unsigned int cou
             -nt);       //延时
  38          void SYSCLK_Init (void);                  //系统时钟初始化
  39          void DISPLAY(void);                       //通过SAA1064驱动四位数码管显示
  40          void SMBUS_ISR (void);                    //中断服务程序
  41          char SLA_READ(char chip,char wordadr,char number);
  42          void SLA_SEND(char chip,char wordadr, char word,char number);
  43          void sleep_ms(unsigned int count);
  44          
  45          void MAIN (void)
  46          {
  47   1         unsigned char check;              // 测试用的工作变量
  48   1         WDTCN = 0xde;                          // 关闭看们狗
  49   1         WDTCN = 0xad;
  50   1         SYSCLK_Init();                         // 时钟初始化
  51   1         XBR0 = 0x01;                           // 选交叉开关 :P0.0-->SDA,P0.1-->CLK
  52   1         XBR2 = 0x40;                           // 交叉开关使能
  53   1         SMB0CN = 0x44;                         // 允许SMBUS, 应答返回AA(低电平
C51 COMPILER V7.05   AT24C02                                                               02/14/2006 09:04:33 PAGE 2   

  54   1         SMB0CR = 0xc9;                   // SMBus 速率= 100 kHz,系统时钟为11.0592MHZ
  55   1         EIE1 |= 2;                             // SMBus 中断使能
  56   1         EA = 1;                                // 开中断
  57   1         SM_BUSY = 0;                           //  SM_BUSY是忙碌标志位
  58   1         SI = 0;                                //SM_BUSY中断标志位
  59   1         //写64个连续的数据到AT24C02中去并依次存放.
  60   1      //64个连续的数据的存放地址:00H--3fH.第一个数为10H,最后一个数为4FH.
  61   1         i=0x10;
  62   1         sla=CHIP_A;
  63   1        for  (j=0;j<0x40;j++)            //向24C02的000地址依次写入64个数据,
  64   1        {                                //64个数据的数值从10H---4FH   
  65   2         SLA_SEND(sla, j, i,0x01);       // 写入AT24C02
  66   2         i++;
  67   2         }
  68   1        for  (j=0;j<0x40;j++)          //从24C02的00地址依次连续读出64个数据,
  69   1        {                              //64个数据的数值应该是从10H---3FH(连续存放)
  70   2         check=SLA_READ(sla, j,0x01);     
  71   2         DATA1[j]=check;               //读出来的数据依次连续存入数组DATA[]中
  72   2         }
  73   1         for  (j=0;j<0x40;j++)     //把要显示的两位地址和两位数据存入DATA2[]中           
  74   1        { i=DATA1[j];              
  75   2          k=i&0x0f;
  76   2              m=DATA2[k];              //j为地址,i=DATA1[j]=check,i地址j中存放的数据
  77   2              DATA0[4]=m;
  78   2              k=i&0xf0;
  79   2              k=k>>4;
  80   2          n=DATA2[k];
  81   2              DATA0[3]=n;
  82   2          k=j&0x0f;
  83   2              m=DATA2[k];
  84   2              DATA0[2]=m;
  85   2              k=j&0xf0;
  86   2              k=k>>4;
  87   2          n=DATA2[k];
  88   2              DATA0[1]=n;
  89   2              DISPLAY();
  90   2          sleep_ms(1000);
  91   2              } 
  92   1         while(1);
  93   1       }
  94          void  DISPLAY (void)
  95          {
  96   1        sla=CHIP_B;
  97   1              DATA0[0]=0x17;              //0x17是SAA1064的控制字.
  98   1        for  (p=0;p<0x5;p++)
  99   1        {i=DATA0[p];                 //向SAA1064写入五个数:SAA1064的控制字一字节,
 100   2        SLA_SEND(sla, p, i,0x01);     // 地址2字节,数据2字节.共五字节
 101   2      }
 102   1      }
 103           void SYSCLK_Init (void)
 104          {
 105   1         int i;                               // i 用于延时计数
 106   1         OSCXCN = 0x67;                       // 先选择外捕振荡器,频率位11.0592MHZ
 107   1         for (i=0; i < 256; i++) ;            // 再延时(>1ms),
 108   1         while (!(OSCXCN & 0x80)) ;           // 等待外部晶振稳定
 109   1         OSCICN = 0x88;                       // 选择外部晶振,允许时钟丢失检测
 110   1      }
 111          void SLA_SEND(char chip, char wordadr, char word,char number)
 112          {
 113   1        SENDMODE=0x01;
 114   1         sendnumber=number+1;
 115   1         while(SM_BUSY);               // 若SMBUS忙碌就等待
C51 COMPILER V7.05   AT24C02                                                               02/14/2006 09:04:33 PAGE 3   

 116   1         SM_BUSY = 1;                  // 置SM_BUSY位(忙碌标志位)为1                
 117   1         SLAW = (chip| WRITE);         // COMMAND = 7 个地址位 + 一位WRITE.
 118   1         WORD = word;                  // WORD中存放要送到24C02中去的数据(8位)
 119   1         WORDADR = wordadr;            // OP_CODE 中存放被传送数据送入24C02的首地址.
 120   1         STO = 0;
 121   1         STA = 1;                         // 启动数据传输
 122   1         while(SM_BUSY);                  // 等待传输完成
 123   1      }
 124          char SLA_READ(char chip, char wordadr,char number){
 125   1         sendnumber=number;
 126   1        SENDMODE=0;
 127   1         while(SM_BUSY);                  // 若SMBUS忙碌就等待
 128   1         SM_BUSY = 1;                     // 置SM_BUSY位(忙碌标志位)为1 
 129   1         SLAR = (chip| READ);             // COMMAND = 7 个地址位 + 一位READ
 130   1         WORDADR = wordadr;                // OP_CODE 中存放从24C02读出数据的的首地址.
 131   1         STO = 0;
 132   1         STA = 1;                          // 启动传输
 133   1         while(SM_BUSY);                   // 等待传输完成 
 134   1         return WORD;                      //返回读出来的数据(一个字节)
 135   1      }
 136          void SMBUS_ISR (void) interrupt 7    //中断服务程序
 137          {
 138   1         switch (SMB0STA){                 // 根据中断状态码跳转
 139   2                                           //(SMB0STA 是中断状态寄存器)
 140   2             case SMB_START:               //0x08, (MT & MR) 发送起始位
 141   2               SMB0DAT = SLAW ;            // 装入被访问的从芯片的写地址
 142   2               STA = 0;                    // 人工清除 STA 位
 143   2               SI = 0;                     // 清除中断标志位
 144   2               break;
 145   2             case SMB_RP_START:                //0x10,(MT & MR) 重复发送起始位
 146   2               SMB0DAT = SLAR;             // 装入被访问的从芯片的读地址
 147   2               STA = 0;                    // 人工清除 STA 位
 148   2               SI = 0;                     // 清除中断标志位
 149   2               break;
 150   2             case SMB_MTADDACK:            //0x18 ,(MT) 发送从地址 + W 后收到ACK
 151   2               SMB0DAT = WORDADR;
 152   2               SI = 0;                     // 清除中断标志位
 153   2               break;
 154   2             case SMB_MTADDNACK:          //0x20,(MT) 发送从地址 + W 后收到NACK
 155   2               STO = 1;
 156   2               STA = 1;
 157   2               SI = 0;                    // 清除中断标志位
 158   2               break;
 159   2            case SMB_MTDBACK:                 //0x28,(MT) 发送数据后收到ACK
 160   2               switch (SENDMODE){         // 检查低1位
 161   3             case 1:
 162   3                                 sendnumber--;
 163   3                                 if(sendnumber)
 164   3                                 SMB0DAT = WORD;
 165   3                                 else{
 166   4                                              STO=1;
 167   4                                              SM_BUSY=0;
 168   4                                      }
 169   3                    break;             
 170   3             case 0:
 171   3                                   STO = 0;
 172   3                     STA = 1;
 173   3                     break;            
 174   3             default:              
 175   3                     STO = 1;
 176   3                     SM_BUSY = 0;
 177   3                     break;
C51 COMPILER V7.05   AT24C02                                                               02/14/2006 09:04:33 PAGE 4   

 178   3               }
 179   2               SI = 0;
 180   2               break;
 181   2            case SMB_MTDBNACK:        //0x30
 182   2               STO = 1;
 183   2               STA = 1;
 184   2               SI = 0;                          // 清除中断标志
 185   2               break;
 186   2            case SMB_MRADDACK:        //0x40
 187   2               AA = 0;                        
 188   2               SI = 0;
 189   2               break;
 190   2                case SMB_MRADDNACK:   //0x48
 191   2               STO = 0;
 192   2               STA = 1;
 193   2               SI = 0;
 194   2               break;
 195   2           case SMB_MRDBNACK:     //0x58
 196   2               WORD = SMB0DAT;
 197   2               STO = 1;
 198   2               SM_BUSY = 0;
 199   2               AA = 1;                          
 200   2               SI = 0;
 201   2               break;
 202   2            default:
 203   2               STO = 1;
 204   2               SM_BUSY = 0;
 205   2               break;
 206   2            }
 207   1      }
 208          /*延时子程序*/
 209          void sleep_ms(unsigned int count)
 210          {
 211   1        unsigned int ii,jj;
 212   1        for(ii=0;ii<count;ii++)
 213   1          {
 214   2            for(jj=0;jj<250;jj++)
 215   2                _nop_();      
 216   2                 _nop_();     
 217   2                  _nop_();    
 218   2                       _nop_();                       
 219   2          }   
 220   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    620    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     25    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     74       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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