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

📄 myram.lst

📁 这是一个单片机的项目
💻 LST
字号:
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 1   


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

line level    source

   1          /****************************************************************************************
   2          File: MyRam.c
   3          Description:用来读写自带RAM的IIC程序。
   4          Author: ganzi535@qq.com Joehill.Net@qq.com
   5          Date:   September,2007
   6          ****************************************************************************************/
   7          #include<string.h>
   8          #include <SM89516A.h>
   9          #include<intrins.h>
  10          #include"SerialPort.h"
  11          
  12          #define uchar unsigned char
  13          #define uint  unsigned int
  14          
  15          #define WRITE 0xa0
  16          #define READ  0xa1 
  17          #define DELAY 5
  18          
  19          /*端口位定义*/
  20          sbit SCL=P2^1;            /*模拟I2C时钟控制位*/
  21          sbit SDA=P2^2;            /*模拟I2C数据传送位*/
  22          bit  Ack1;                /*应答标志位*/
  23          
  24          
  25          /****************************************************************************************
  26          功能:MyStart,起动总线函数.
  27          描述:启动I2C总线,即发送I2C起始条件.
  28          参数:无
  29          返回:无
  30          ****************************************************************************************/
  31          void MyStart()
  32          {
  33   1        SDA=1;     /*发送起始条件的数据信号*/
  34   1        Delay(DELAY);
  35   1      
  36   1        SCL=1;     /*起始条件建立时间大于4.7us,延时*/
  37   1        Delay(DELAY);   
  38   1      
  39   1        SDA=0;     /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/
  40   1        Delay(DELAY);   
  41   1          
  42   1        SCL=0;     /*钳住I2C总线,准备发送或接收数据 */
  43   1        Delay(DELAY);
  44   1      }
  45          
  46          /****************************************************************************************
  47          功能:MyStop,结束总线函数.
  48          描述:结束I2C总线,即发送I2C结束条件.
  49          参数:无
  50          返回:无
  51          ****************************************************************************************/
  52          void MyStop()
  53          {
  54   1        SDA=0;  /*发送结束条件的数据信号*/
  55   1        Delay(DELAY); 
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 2   

  56   1      
  57   1        SCL=1;  /*结束条件建立时间大于4μs*/
  58   1        Delay(DELAY);
  59   1      
  60   1        SDA=1;  /*发送I2C总线结束信号*/
  61   1        Delay(DELAY);
  62   1      }
  63          
  64          /****************************************************************************************
  65          功能:MySendByte,字节数据传送函数.
  66          描述:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答
  67               或者非应答都使ack=0 假)发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
  68          参数:c---需要发送的字符。
  69          返回:无
  70          ****************************************************************************************/
  71          void MySendByte(uchar c)
  72          {
  73   1          uchar BitCnt;
  74   1       
  75   1          for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/
  76   1          {
  77   2            if((c<<BitCnt)&0x80)  /*判断发送位*/
  78   2              SDA=1;   
  79   2            else  
  80   2              SDA=0;       
  81   2               
  82   2            Delay(DELAY);
  83   2            SCL=1;               /*置时钟线为高,通知被控器开始接收数据位  保证时钟高电平周期大于4μs*/
  84   2      
  85   2            Delay(DELAY);       
  86   2            SCL=0; 
  87   2          }
  88   1          
  89   1          Delay(DELAY);
  90   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
  91   1          Delay(DELAY);
  92   1      
  93   1          SCL=1;
  94   1          Delay(DELAY);
  95   1      
  96   1          if(SDA==1)      /*判断是否接收到应答信号*/
  97   1             Ack1=0;     
  98   1          else 
  99   1             Ack1=1;        
 100   1      
 101   1          SCL=0;
 102   1          Delay(DELAY);
 103   1      }
 104          
 105          /****************************************************************************************
 106          功能:MyRcvByte,字节数据传送函数。
 107          描述:用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数。
 108          参数:无
 109          返回:无
 110          ****************************************************************************************/
 111          uchar MyRcvByte()
 112          {
 113   1        uchar retc;
 114   1        uchar BitCnt;
 115   1        
 116   1        retc=0; 
 117   1        SDA=1;             /*置数据线为输入方式*/
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 3   

 118   1      
 119   1        for(BitCnt=0;BitCnt<8;BitCnt++)
 120   1        {
 121   2           Delay(DELAY);           
 122   2           SCL=0;       /*置时钟线为低,准备接收数据位*/  /*时钟低电平周期大于4.7μs*/
 123   2           Delay(DELAY);
 124   2      
 125   2           SCL=1;       /*置时钟线为高使数据线上数据有效*/
 126   2           Delay(DELAY);
 127   2      
 128   2           retc=retc<<1;
 129   2      
 130   2           if(SDA==1)    /*读数据位,接收的数据位放入retc中 */
 131   2             retc=retc+1; 
 132   2           Delay(DELAY);
 133   2        }
 134   1      
 135   1        SCL=0;    
 136   1        Delay(DELAY);
 137   1      
 138   1        return(retc);
 139   1      }
 140          
 141          /****************************************************************************************
 142          功能:MyAck,应答子函数。
 143          描述:主控器进行应答信号,(可以是应答或非应答信号)。
 144          参数:a---应答与否,a==1应答,a==0不应答。
 145          返回:无
 146          ****************************************************************************************/
 147          void MyAck(bit a)
 148          { 
 149   1        if(a==0)
 150   1          SDA=0;     /*在此发出应答或非应答信号 */
 151   1        else 
 152   1          SDA=1;
 153   1      
 154   1        Delay(DELAY);     
 155   1      
 156   1        SCL=1;           /*时钟低电平周期大于4μ*/
 157   1        Delay(DELAY);  
 158   1      
 159   1        SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 160   1        Delay(DELAY);   
 161   1      }
 162          
 163          /****************************************************************************************
 164          功能:MyWriteOneByte,向有子地址器件发送字节数据函数。
 165          描述:从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.如果返回1表示操作成功,否
 166               则操作有误,使用前必须已结束总线。
 167          参数:sla---器件地址;c---发送的字符。
 168          返回:无
 169          ****************************************************************************************/
 170          bit MyWriteOneByte(uint sla,uchar c)
 171          {
 172   1         MyStart();             //启动总线
 173   1      
 174   1         MySendByte(WRITE);         
 175   1         if(Ack1==0)return(0);  //发送器件地址    
 176   1      
 177   1         MySendByte(sla>>8);        
 178   1         if(Ack1==0)return(0);  //高address  
 179   1      
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 4   

 180   1         MySendByte(sla);           
 181   1         if(Ack1==0)return(0);  //low address 
 182   1      
 183   1         MySendByte(c);             
 184   1         if(Ack1==0)return(0);  //发送数据
 185   1         
 186   1         MyStop();              //结束总线
 187   1         return(1);
 188   1      }
 189          
 190          /****************************************************************************************
 191          功能:MyWriteBytes,向有子地址器件发送多字节数据函数。
 192          描述:从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址sla,子地址suba,发送
 193               内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。使用前必须已
 194                   结束总线。
 195          参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
 196          返回:写成功则返回1,否则返回0.
 197          ****************************************************************************************/
 198          bit MyWriteBytes(uint suba,uchar *s,uchar no)
 199          {
 200   1         uchar i;
 201   1      
 202   1         MyStart();      
 203   1                  
 204   1         MySendByte(WRITE);        
 205   1         if(Ack1==0)return(0);
 206   1      
 207   1         MySendByte(suba>>8);      
 208   1         if(Ack1==0)return(0);
 209   1      
 210   1         MySendByte(suba);         
 211   1         if(Ack1==0)return(0);
 212   1         
 213   1         for(i=0;i<no;i++)
 214   1         {   
 215   2            MySendByte(*s);        
 216   2            if(Ack1==0) return(0);       
 217   2            s++;
 218   2         } 
 219   1      
 220   1         MyStop();                 
 221   1         return(1);
 222   1      }
 223          
 224          /****************************************************************************************
 225          功能:MyReadOneByte,向无子地址器件读字节数据函数。
 226          描述:从启动总线到发送地址,读数据,结束总线的全过程,从器件地址sla,返回值在c.如果返回1表
 227               示操作成功,否则操作有误。使用前必须已结束总线。
 228          参数:sla---器件地址。
 229          返回:返回读取的字符。
 230          ****************************************************************************************/
 231          uchar MyReadOneByte(uint sla)
 232          {
 233   1         uchar x;
 234   1      
 235   1         MyStart();      //启动总线
 236   1      
 237   1         MySendByte(WRITE);         
 238   1         if(Ack1==0)return(0);   //发送器件地址
 239   1         
 240   1         MySendByte(sla>>8);        
 241   1         if(Ack1==0)return(0);   //高address 
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 5   

 242   1      
 243   1         MySendByte(sla);           
 244   1         if(Ack1==0)return(0);   //low address
 245   1         
 246   1         MyStart(); 
 247   1      
 248   1         MySendByte(READ);          
 249   1         if(Ack1==0)return(0); 
 250   1             
 251   1         x=MyRcvByte();
 252   1      
 253   1         return x;
 254   1      }
 255          
 256          /****************************************************************************************
 257          功能:MyReadBytes,向有子地址器件读取多字节数据函数。
 258          描述:从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址sla,子地址suba,读
 259               出的内容放入s指向的存储区,读no个字节。使用前必须已结束总线。
 260          参数:suba---子地址,s---指向发送的内容,no---发送字符个数。
 261          返回:如果返回1表示操作成功,否则操作有误。
 262          ****************************************************************************************/
 263          bit MyReadBytes(uint suba,uchar *s,uchar no)
 264          {
 265   1         uchar i;
 266   1      
 267   1         MyStart();            
 268   1         
 269   1         MySendByte(WRITE);      
 270   1         if(Ack1==0)return(0);
 271   1               
 272   1         MySendByte(suba>>8);    
 273   1         if(Ack1==0)return(0);        
 274   1       
 275   1         MySendByte(suba);       
 276   1         if(Ack1==0)return(0);
 277   1               
 278   1         MyStart();
 279   1      
 280   1         MySendByte(READ);       
 281   1         if(Ack1==0)return(0);
 282   1                
 283   1         for(i=0;i<no-1;i++)
 284   1         {   
 285   2            *s=MyRcvByte();             
 286   2            MyAck(0);                  
 287   2            s++;
 288   2         } 
 289   1      
 290   1         *s=MyRcvByte();
 291   1          MyAck(1);     
 292   1                  
 293   1         MyStop();                  
 294   1         return(1);
 295   1      }
 296          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    597    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 20:43:16 PAGE 6   

   DATA SIZE        =   ----      23
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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