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

📄 rtc.lst

📁 这是单片机实验板比较齐全的程序
💻 LST
字号:
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 1   


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

line level    source

   1          /*******************************************************************************
   2          *  标题:  student2000单片机开发系统演示程序                                    *
   3          *  文件:  fun.C                                                                *
   4          *  日期:  2007-5-4                                                             *
   5          *  版本:  1.0                                                                  *
   6          
   7            ********************************************************************************
   8            *  描述:                                                                       *
   9            *        大部分通用函数集合                                                      *     
  10          *        RS232,RS485,延时函数,协议框架演示等                                 */
  11          #include <reg52.h>
  12          #include <intrins.h>
  13          #include <string.h>
  14          #include <absacc.h>
  15          #include <stdio.h>
  16          #include "SYBXT1.h"
  17          sbit     ds_scl=P1^1; 
  18          sbit     ds_rst=P1^3;
  19          sbit     ds_sda= P1^0;
  20          sbit    ACC7=ACC^7;
  21          sbit    ACC0=ACC^0;
  22          DateTime dt;
  23          xdata DateTime dtset;
  24          xdata uchar str[50];
  25          //xdata SetJdqTime dtjdq;
  26          bit clock_12h=0;//24小时
  27          bit clock_am_pm=0;//上午
  28          bit clockset_12h=0;//24小时
  29          bit clockset_am_pm=0;//上午
  30          static    void    wt_byte(uchar    xx)
  31          {
  32   1          uchar    i=8;
  33   1          ACC=xx;
  34   1          do
  35   1          {
  36   2              ds_scl=0;
  37   2              ds_sda=ACC0;
  38   2              ACC>>=1;
  39   2                      _nop_();
  40   2              ds_scl=1;
  41   2          }
  42   1          while (--i);
  43   1      }
  44          
  45          static    uchar    rd_byte(void)
  46          {
  47   1          uchar    i=8;
  48   1          do
  49   1          {
  50   2              ds_scl=1;
  51   2              ACC>>=1;
  52   2              ds_scl=0;
  53   2              _nop_();
  54   2              ACC7=ds_sda;
  55   2          }
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 2   

  56   1          while (--i);
  57   1          return (ACC);
  58   1      }
  59          void    ds_read(uchar    command,uchar    idata    *time)
  60          {
  61   1              uchar command1;
  62   1              command1=command;
  63   1              command=command|0x01;
  64   1              
  65   1              ds_scl=0;
  66   1          ds_rst=1;
  67   1          wt_byte(command);
  68   1          *time=rd_byte();
  69   1          ds_rst=0;
  70   1              if(command1== SECOND_ADDR)
  71   1              {
  72   2                      *time &= 0x7f;
  73   2              }
  74   1              else if(command1 == HOUR_ADDR)
  75   1              {
  76   2                      if((*time & 0x80) != 0)//
  77   2                      {//12小时
  78   3                              clock_12h = 1;
  79   3                              //确定是上午还是下午?
  80   3                              if((*time&0x20) != 0)
  81   3                                      clock_am_pm = 1;//下午
  82   3                              
  83   3                              else
  84   3                                      clock_am_pm = 0;//上午
  85   3                              
  86   3                              *time  &= 0x1f;//范围0——12的bcd数
  87   3                      }
  88   2                      else
  89   2                      {//24小时
  90   3                              clock_12h = 1;
  91   3                              *time  &= 0x3f;
  92   3                      }
  93   2              }
  94   1              *time =bcd2_hex(*time);
  95   1      }
  96          //用bcd输入如:0x00~0x59:表示00~59的十进制数
  97          void    ds_write(uchar    command,uchar    idata    *time)
  98          {
  99   1              uchar i;
 100   1              clock_12h=0;//24小时
 101   1              clock_am_pm=0;//上午
 102   1              
 103   1              i = *time / 10;
 104   1              i <<= 4;
 105   1              i |= (*time % 10);
 106   1              *time = i;
 107   1              
 108   1              if(command == HOUR_ADDR)
 109   1              {
 110   2                      if(clock_12h)
 111   2                      {
 112   3                              if(clock_am_pm)
 113   3                                      *time |= 0xa0;
 114   3                              else
 115   3                              {
 116   4                                      *time &= 0x1f;
 117   4                                      *time |= 0x80;
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 3   

 118   4                              }
 119   3                      }
 120   2                      else
 121   2                              *time &= 0x7f;
 122   2              }
 123   1              command &= 0xfe;//set write state
 124   1          ds_scl=0;
 125   1          ds_rst=1;
 126   1          wt_byte(command);
 127   1          wt_byte(*time);
 128   1          ds_rst=0;
 129   1      }
 130          
 131          uchar bcd2_hex(uchar val)
 132          {
 133   1              uchar i;
 134   1              i = val&0x0f;
 135   1              val >>= 4;
 136   1              val &= 0x0f;
 137   1              val *= 10;
 138   1              i += val;
 139   1              return i;
 140   1      }
 141          /*
 142          void    ds_checktime(void)
 143          {
 144          //设置年月日是分秒
 145          
 146            
 147                  uchar i;
 148                  uchar n;
 149                  
 150                    i=0;
 151                    dt.second=0;
 152                    dt.year=07;
 153                    dt.month=02;
 154                    dt.day=10;
 155                    dt.week=3;
 156                    dt.hour=13;
 157                    dt.minute=20;
 158                    dt.second=0;
 159                    ds_write(CONTROL_ADDR, (uchar *)&i);
 160                    
 161                          i=dt.second&0x7f;
 162                          ds_write(SECOND_ADDR, (uchar *)&i);
 163                          //i=0;
 164                          ds_write(MINUTE_ADDR,(uchar *) &dt.minute);
 165                          //i=12;
 166                          ds_write(HOUR_ADDR, (uchar *)&dt.hour);
 167                          //i=31;
 168                          ds_write(DAY_ADDR, (uchar *)&dt.day);
 169                          //i=5;
 170                          ds_write(MONTH_ADDR,(uchar *)&dt.month);
 171                          //i=06;
 172                          ds_write(YEAR_ADDR,(uchar *)&dt.year);
 173                          
 174                            
 175                                  i=0;
 176                                  ds_write(0x8e,(uchar *)&i);     
 177                                  n=0;
 178                                  n =sprintf(str, "%02bd-",dt.year);
 179                                  n+=sprintf(str+n,"%02bd-",dt.month);
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 4   

 180                                  n+=sprintf(str+n,"%02bd ",dt.day);
 181                                  n+=sprintf(str+n,"%02bd:",dt.hour);
 182                                  n+=sprintf(str+n,"%02bd:",dt.minute);
 183                                  n+=sprintf(str+n,"%02bd",dt.second);
 184                                  //send_bytes(str);
 185                                  
 186                                    
 187          }
 188          */
 189          void    ds_init(void)
 190          {
 191   1              xdata uchar ss[5];
 192   1          uchar    i;
 193   1          ds_scl=0;
 194   1          ds_rst=0;
 195   1              ds_sda=0;
 196   1          ds_read(0x81,(uchar *)&i);
 197   1          if (i&0x80)
 198   1          {
 199   2                      //              send_bytes("clock has been stop!\n");
 200   2                      //              send_bytes("it's running!\n");
 201   2                      i=0;
 202   2              ds_write(0x8e,(uchar*)&i);
 203   2              i=0;
 204   2              ds_write(0x80,(uchar*)&i);
 205   2              i=0xa5;
 206   2              ds_write(0x90,(uchar*)&i);
 207   2          }
 208   1               //read ram 
 209   1              ds_read(0xc1,(uchar *)&i);
 210   1              ss[0]=i;
 211   1              ds_read(0xc3,(uchar *)&i);
 212   1              ss[1]=i;
 213   1              if(strncmp(ss,"ok",2)==0)
 214   1              {
 215   2                      //不需要初始化; 
 216   2              }
 217   1              else
 218   1              {
 219   2                      
 220   2              //设置年月日是分秒
 221   2              i=0;
 222   2              ds_write(CONTROL_ADDR, (uchar *)&i);
 223   2                      i=0;
 224   2              ds_write(SECOND_ADDR, (uchar *)&i);
 225   2                      i=0;
 226   2              ds_write(MINUTE_ADDR,(uchar *) &i);
 227   2                      i=12;
 228   2              ds_write(HOUR_ADDR, (uchar *)&i);
 229   2                      i=31;
 230   2              ds_write(DAY_ADDR, (uchar *)&i);
 231   2                      i=5;
 232   2              ds_write(MONTH_ADDR,(uchar *)&i);
 233   2                      i=06;
 234   2              ds_write(YEAR_ADDR,(uchar *)&i);
 235   2                      
 236   2                      
 237   2              i=0;
 238   2              ds_write(0x8e,(uchar *)&i);
 239   2                      
 240   2                      
 241   2              i=0xa5;
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 5   

 242   2              ds_write(0x90,(uchar *)&i);
 243   2                      i='o';
 244   2                      ds_write(0xc0,(uchar *)&i);
 245   2                      i='k';
 246   2                      ds_write(0xc2,(uchar *)&i);
 247   2                      send_bytes("set default time!\n");
 248   2                      
 249   2                      //Delay_msec(5);
 250   2              }
 251   1              send_bytes("time format error,has modify\n\n");
 252   1              //      ds_checktime();  
 253   1      }
 254          bit bgo=1;
 255          void timeoutput()
 256          {
 257   1              uchar i;
 258   1              int n;
 259   1              int second;
 260   1              ds_read(SECOND_ADDR+1,(uchar *)&i);
 261   1              dt.second =i;
 262   1              ds_read(MINUTE_ADDR+1,(uchar *)&i);
 263   1              dt.minute=i;
 264   1              ds_read(HOUR_ADDR+1,(uchar *)&i);
 265   1              dt.hour=i;
 266   1              ds_read(DAY_ADDR+1,(uchar *)&i);
 267   1              dt.day=i;
 268   1              ds_read(MONTH_ADDR+1,(uchar *)&i);
 269   1              dt.month=i;
 270   1              ds_read(YEAR_ADDR+1,(uchar *)&i);
 271   1              dt.year=i;
 272   1              if(bgo)
 273   1              {
 274   2                      n=sprintf(str,"%02bd-",0x07f&dt.year);      
 275   2                      n+=sprintf(str+n,"%02bd-",0x07f&dt.month);    
 276   2                      n+=sprintf(str+n,"%02bd ",0x07f&dt.day);      
 277   2                      n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);      
 278   2                      n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);      
 279   2                      n+=sprintf(str+n,"%02bd\n",0x07f&dt.second); 
 280   2                      send_bytes(str);
 281   2                      bgo=0;
 282   2              }
 283   1              if(second!=dt.second)
 284   1              {
 285   2                      n=0;
 286   2                      n=sprintf(str,"%02bd-",0x07f&dt.year);      
 287   2                      n+=sprintf(str+n,"%02bd-",0x07f&dt.month);    
 288   2                      n+=sprintf(str+n,"%02bd ",0x07f&dt.day);      
 289   2                      n+=sprintf(str+n,"%02bd:",0x07f&dt.hour);      
 290   2                      n+=sprintf(str+n,"%02bd:",0x07f&dt.minute);      
 291   2                      n+=sprintf(str+n,"%02bd\n",0x07f&dt.second); 
 292   2                      send_bytes(str);
 293   2              }
 294   1              second=dt.second;
 295   1              
 296   1              
 297   1      }
 298          
 299          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    966    ----
C51 COMPILER V7.50   RTC                                                                   05/27/2007 09:00:08 PAGE 6   

   CONSTANT SIZE    =     81    ----
   XDATA SIZE       =     57       5
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       7
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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