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

📄 myram.lst

📁 这是一个单片机的项目
💻 LST
字号:
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 11:04:04 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=P1^0;            /*模拟I2C时钟控制位*/
  21          sbit SDA=P1^1;            /*模拟I2C数据传送位*/
  22          bit  AckSelf;                /*应答标志位*/
  23          
  24          /****************************************************************************************
  25          功能:MyStart,起动总线函数.
  26          描述:启动I2C总线,即发送I2C起始条件.
  27          参数:无
  28          返回:无
  29          ****************************************************************************************/
  30          void MyStart()
  31          {
  32   1        SDA=1;     /*发送起始条件的数据信号*/
  33   1        Delay(DELAY);
  34   1      
  35   1        SCL=1;     /*起始条件建立时间大于4.7us,延时*/
  36   1        Delay(DELAY);   
  37   1      
  38   1        SDA=0;     /*发送起始信号*/ /* 起始条件锁定时间大于4μs*/
  39   1        Delay(DELAY);   
  40   1          
  41   1        SCL=0;     /*钳住I2C总线,准备发送或接收数据 */
  42   1        Delay(DELAY);
  43   1      }
  44          
  45          /****************************************************************************************
  46          功能:MyStop,结束总线函数.
  47          描述:结束I2C总线,即发送I2C结束条件.
  48          参数:无
  49          返回:无
  50          ****************************************************************************************/
  51          void MyStop()
  52          {
  53   1        SDA=0;  /*发送结束条件的数据信号*/
  54   1        Delay(DELAY); 
  55   1      
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 11:04:04 PAGE 2   

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

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    597    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      23
C51 COMPILER V7.50   MYRAM                                                                 03/17/2008 11:04:04 PAGE 6   

   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 + -