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

📄 ds1302.lst

📁 用于GPRS远程电力抄表系统中采集器端的程序
💻 LST
字号:
C51 COMPILER V7.50   DS1302                                                                07/19/2006 10:05:10 PAGE 1   


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

line level    source

   1          #include "ds1302.h"
   2          
   3          void    wr_oneword_ds1302(uchar,uchar);
   4          uchar   rd_oneword_ds1302(uchar);
   5          void    delay1302(void);
   6          
   7          uchar    xdata    rdtime[6] = {0};
   8          uchar    xdata    inittime[6]={0};//初始时间(yy,mm,dd,hh,mm,ss)
   9          
  10          sbit    sck1302    =P1^5;    //1302的clock
  11          sbit    sio1302    =P1^6;    //1302的io口
  12          sbit    rst1302    =P1^7;    //1302的rst
  13          
  14          
  15          /************************************************************/
  16          /*函数名:ds1302set
  17          /*描述:设置1302的时间
  18          /*输入:inittime:初始时间暂存区头指针
  19          /*输出:无
  20          /************************************************************/
  21          void    ds1302set(void)
  22              {
  23   1              uchar    xdata    *inittimeptr;
  24   1              uchar    ctrl1302;    //存放1302控制码
  25   1              uchar    data1302;    //存放1302数据
  26   1              inittimeptr=inittime;
  27   1      
  28   1              ctrl1302=0x8e;        
  29   1              data1302=0x00;        //控制字(允许写)
  30   1              wr_oneword_ds1302(ctrl1302,data1302);
  31   1      
  32   1              ctrl1302=0x80;        //禁止1302
  33   1              data1302=0x80;
  34   1              wr_oneword_ds1302(ctrl1302,data1302);        
  35   1          
  36   1              
  37   1              ctrl1302=0x8c;        //写入年
  38   1              data1302=*inittimeptr;
  39   1              wr_oneword_ds1302(ctrl1302,data1302);
  40   1              inittimeptr++;
  41   1      
  42   1              ctrl1302=0x88;        //写入月
  43   1              data1302=*inittimeptr;
  44   1              wr_oneword_ds1302(ctrl1302,data1302);
  45   1              inittimeptr++;        
  46   1      
  47   1              ctrl1302=0x86;        //写入日期
  48   1              data1302=*inittimeptr;
  49   1              wr_oneword_ds1302(ctrl1302,data1302);
  50   1              inittimeptr++;        
  51   1      
  52   1              ctrl1302=0x84;        //写入小时
  53   1              data1302=*inittimeptr;
  54   1              data1302&=0x7f;//24小时制
  55   1              wr_oneword_ds1302(ctrl1302,data1302);
C51 COMPILER V7.50   DS1302                                                                07/19/2006 10:05:10 PAGE 2   

  56   1              inittimeptr++;        
  57   1              
  58   1              ctrl1302=0x82;        //写入分
  59   1              data1302=*inittimeptr;
  60   1              wr_oneword_ds1302(ctrl1302,data1302);
  61   1              inittimeptr++;    
  62   1      
  63   1              ctrl1302=0x80;
  64   1              data1302=*inittimeptr;
  65   1              data1302|=0x80;
  66   1              wr_oneword_ds1302(ctrl1302,data1302);
  67   1      
  68   1              ctrl1302=0x80;        //写入秒 
  69   1              data1302=*inittimeptr;
  70   1              data1302&=0x7f;//开始计时
  71   1              wr_oneword_ds1302(ctrl1302,data1302);    
  72   1                      
  73   1              ctrl1302=0x90;
  74   1              data1302=0xa5;
  75   1              wr_oneword_ds1302(ctrl1302,data1302);//trikle charger    
  76   1          
  77   1      
  78   1              ctrl1302=0x8e;        //结束(写保护)
  79   1              data1302=0x80;
  80   1              wr_oneword_ds1302(ctrl1302,data1302);    
  81   1          
  82   1          }
  83          /***********************************************************/
  84          /*函数名:ds1302read
  85          /*描述:读出1302计数器中的当前值
  86          /*输入:inittime:读出数据保存区的头指针
  87          /*输出:无
  88          /***********************************************************/
  89          void    ds1302read(void)    //读1302内部数据
  90              {    
  91   1              uchar    ctrl1302;
  92   1              uchar    data1302;
  93   1      
  94   1              uchar    xdata        *inittimep;
  95   1              inittimep = rdtime;
  96   1      
  97   1              ctrl1302=0x8e;        
  98   1              data1302=0x00;        //控制字(允许写)
  99   1              wr_oneword_ds1302(ctrl1302,data1302);
 100   1      
 101   1              ctrl1302=0x8d;        //读入年
 102   1              data1302=rd_oneword_ds1302(ctrl1302);
 103   1              *inittimep = data1302;
 104   1              inittimep++;
 105   1      
 106   1      
 107   1              ctrl1302=0x89;        //读入月
 108   1              data1302=rd_oneword_ds1302(ctrl1302);
 109   1              *inittimep=data1302;
 110   1              inittimep++;
 111   1      
 112   1      
 113   1              ctrl1302=0x87;        //读入日期
 114   1              data1302=rd_oneword_ds1302(ctrl1302);
 115   1              *inittimep=data1302;
 116   1              inittimep++;
 117   1      
C51 COMPILER V7.50   DS1302                                                                07/19/2006 10:05:10 PAGE 3   

 118   1              ctrl1302=0x85;        //读入小时
 119   1              data1302=rd_oneword_ds1302(ctrl1302);
 120   1              *inittimep=data1302;
 121   1              inittimep++;
 122   1      
 123   1              ctrl1302=0x83;        //读入分钟
 124   1              data1302=rd_oneword_ds1302(ctrl1302);
 125   1              *inittimep=data1302;
 126   1              inittimep++;
 127   1      
 128   1              ctrl1302=0x81;        //读入秒
 129   1              data1302=rd_oneword_ds1302(ctrl1302);
 130   1              *inittimep=data1302;
 131   1      
 132   1              ctrl1302=0x8e;        //结束(写保护)
 133   1              data1302=0x80;
 134   1              wr_oneword_ds1302(ctrl1302,data1302);
 135   1              inittimep = rdtime;
 136   1          //    return(inittimep);    
 137   1          }
 138          
 139          /*************************************************************/
 140          /*函数名:wr_oneword_ds1302
 141          /*描述:向ds1302的某一指定单元写入一字节
 142          /*输入:ctrl1302:命令字节
 143                  data1302:数据字节
 144          /*输出:无
 145          /************************************************************/
 146          void    wr_oneword_ds1302(uchar    ctrl1302,uchar    data1302)
 147              {
 148   1              uchar    i;
 149   1              uchar    ds1302tmp;
 150   1              ds1302tmp =ctrl1302;
 151   1              ds1302tmp|=0x80;//控制码最高位必须位1
 152   1              ds1302tmp&=0xfe;//写入时,最低位必须为0
 153   1              sck1302 =0;//当把rst驱动为1时,sck必须为0
 154   1              delay1302();
 155   1              rst1302 =1;//只有rst为高时,才允许数据传送
 156   1      
 157   1              for(i=0;i<8;i++)//写入控制码
 158   1              {
 159   2                  sck1302 =0;
 160   2                  delay1302();
 161   2                  if(ds1302tmp&0x01)
 162   2                      sio1302 =1;
 163   2                  else
 164   2                      sio1302 =0;
 165   2                  _nop_();
 166   2                  _nop_();
 167   2                  sck1302 =1;//上升沿将数据写入
 168   2                  delay1302();
 169   2                  ds1302tmp>>=1;
 170   2              }
 171   1      
 172   1              ds1302tmp =data1302;//写入数据
 173   1              for(i=0;i<8;i++)
 174   1              {
 175   2                  sck1302 =0;
 176   2                  delay1302();
 177   2                  if(ds1302tmp&0x01)
 178   2                      sio1302 =1;
 179   2                  else    
C51 COMPILER V7.50   DS1302                                                                07/19/2006 10:05:10 PAGE 4   

 180   2                      sio1302 =0;
 181   2                  _nop_();
 182   2                  _nop_();
 183   2                  sck1302 =1;
 184   2                  delay1302();
 185   2                  ds1302tmp>>=1;
 186   2              }
 187   1              _nop_();
 188   1              _nop_();
 189   1              rst1302 =0;//禁止芯片操作
 190   1              sck1302 =0;//恢复原有状态
 191   1              
 192   1          }
 193          /************************************************************/
 194          /*函数名:rd_oneword_ds1302
 195          /*描述:从ds1302的指定单元读出一字节
 196          /*输入:ctrl1302:指定要读取的单元
 197          /*输出:读取的字节
 198          /***********************************************************/
 199          uchar    rd_oneword_ds1302(uchar    ctrl1302)
 200              {
 201   1              
 202   1              uchar    i;
 203   1              uchar    ds1302tmp;
 204   1              ds1302tmp =ctrl1302;
 205   1              ds1302tmp|=0x80;//控制码最高位必须为1
 206   1              ds1302tmp|=0x01;//读出时,最低位必须为1
 207   1              sck1302 =0;//当把rst驱动为1时,sck必须为0
 208   1              delay1302();
 209   1              rst1302 =1;//只有rst为高时,才允许数据传送
 210   1      
 211   1              for(i=0;i<8;i++)//输出控制码
 212   1              {
 213   2                  sck1302 =0;
 214   2                  delay1302();
 215   2                  if(ds1302tmp&0x01)
 216   2                      sio1302 =1;
 217   2                  else    
 218   2                      sio1302 =0;
 219   2                  _nop_();
 220   2                  _nop_();
 221   2                  sck1302 =1;
 222   2                  delay1302();
 223   2                  ds1302tmp>>=1;    
 224   2              }
 225   1          
 226   1              for(i=0;i<8;i++)//读出控制码指定单元内容
 227   1              {    
 228   2                  ds1302tmp>>=1;
 229   2                  sck1302 =1;
 230   2                  delay1302();
 231   2                  sck1302 =0;
 232   2                  delay1302();
 233   2                  if(sio1302)
 234   2                      ds1302tmp|=0x80;//最高位为1
 235   2                  else
 236   2                      ds1302tmp&=0x7f;//最高位为0
 237   2                  delay1302();
 238   2              }
 239   1              rst1302 =0;//禁止芯片操作
 240   1              sck1302 =0;//恢复原有状态
 241   1              return(ds1302tmp);
C51 COMPILER V7.50   DS1302                                                                07/19/2006 10:05:10 PAGE 5   

 242   1          }
 243          /*****************************************/
 244          /*函数名:delay1302
 245          /*描述:延时,使程序时序符合芯片要求
 246          /*输入:无 
 247          /*输出:无
 248          /****************************************/
 249          void    delay1302(void)//对于11.0592Mhz,延时为1us
 250              {
 251   1              _nop_();
 252   1              _nop_();
 253   1              _nop_();
 254   1              _nop_();
 255   1              _nop_();
 256   1              _nop_();
 257   1              _nop_();
 258   1              _nop_();
 259   1              _nop_();
 260   1              _nop_();
 261   1          } 
 262          
 263          
 264          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    532    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     12    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----       9
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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