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

📄 clock_ds1307.lst

📁 一个流量控制仪器的源码
💻 LST
📖 第 1 页 / 共 3 页
字号:
  95      =1  
  96      =1  
  97      =1  /*******************************************************************
  98      =1                          向有子地址器件读取多字节数据函数
  99      =1  函数原型: bit I2C_SendStr(uchar sla,uchar suba,ucahr *s,uchar no);
 100      =1  功能:   从启动总线到发送地址、子地址、读数据、结束总线的全过程,从器件
 101      =1          地址sla,子地址suba,读出的内容放入s指向的存储区读no个字节。
 102      =1          如果返回1,表示操作成功,否则操作有误。
 103      =1  ********************************************************************/
 104      =1  extern bit I2C_RcvStr(uchar sla,uchar suba,uchar *s,uchar no);
 105      =1  
 106      =1  
 107      =1  #ifndef READYDEF_uchar
 108      =1    #undef uchar
 109      =1  #endif
 110      =1  
 111      =1  /*软件包大小  字节*/
  16          
  17          
  18          
  19          #define uchar unsigned char
  20          #define uint unsigned int
  21          
  22          // I2C write address of DS1307
  23          #define DS1307_ADDRESS 0xD0
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 6   

  24          
  25          
  26          enum weekdays { SUNDAY = 1, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
  27                          FRIDAY, SATURDAY };           // define the weekdays
  28          
  29          enum months { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE,
  30                        JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER };
  31                                                        // define the months
  32          
  33          typedef struct                           
  34          {                                             
  35            uchar seconds;
  36            uchar minute;
  37            uchar hour;
  38            uchar weekday;
  39            uchar day;
  40            uchar month;
  41            uchar year;
  42            uchar control;
  43          } DS1307_time;
  44          
  45          
  46          //定义系统日期时间,初始化-2004.1.1.  00:00:00
  47          //DS1307格式
  48          xdata struct DS1307_time current_clock = {0x00, 0x00, 0x00, SUNDAY , 0x01 , JANUARY , 04};
  49          
  50          
  51          
  52          //CL(SYSTEMCLOCK) 系统时钟时间--程序格式
  53          xdata uchar     uc8_SystemDateTime[8];
  54          
  55          //字节序号      0               1               2               3
  56          //时间格式      百小时(0-9)  小时(00-99)  分钟(0-59)   秒(0-59)
  57          //字节序号      4               5               6               7
  58          //时间格式      年(00-99)    月(01-12)    日(01-31)    控制字节
  59          
  60          
  61          // 10进制码-->BCD码
  62          // function chartobcd
  63          // converts a decimal value to the BCD equivalent
  64          // decimal values must be stored in the Real Time Clock in BCD format
  65          // passed is the decimal value to convert
  66          // returned is the BCD equivalent
  67          unsigned char chartobcd(unsigned char n)
  68          {
  69   1        return ((n / 10) << 4) | (n % 10);  
  70   1      }
  71          
  72          
  73          // BCD码-->10进制码
  74          // function bcdtochar
  75          // converts a number in BCD format to the decimal equivalent
  76          // decimal values must be stored in the Real Time Clock in BCD format
  77          // passed is the BCD format value
  78          // returned is the decimal equivalent
  79          uchar bcdtochar(unsigned char bcdnum)
  80          {
  81   1        return (bcdnum & 0x0f) + (bcdnum >> 4) * 10;
  82   1      }
  83          
  84          
  85          /*******************************************************************
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 7   

  86                          系统日期时间设置函数(内部格式转换)
  87          函数原型: void fnSet_SystemClock()
  88          功能:   系统日期时间设置DS1307(内部格式转换),并立即运行!
  89          
  90          涉及变量:      uc8_SystemDateTime[8];
  91                          current_clock
  92          ********************************************************************/
  93          void fnSet_SystemClock()
  94          {
  95   1              //内部格式转换
  96   1              //程序格式-->DS1307格式
  97   1              //10进制码-->BCD码
  98   1              
  99   1              current_clock.year = chartobcd(uc8_SystemDateTime[4]);
 100   1      
 101   1              current_clock.month = chartobcd(uc8_SystemDateTime[5]);
 102   1              
 103   1              current_clock.day = chartobcd(uc8_SystemDateTime[6]);
 104   1              
 105   1              current_clock.hour = chartobcd(uc8_SystemDateTime[1]);
 106   1              
 107   1              current_clock.minute = chartobcd(uc8_SystemDateTime[2]);
 108   1              
 109   1              current_clock.seconds = chartobcd(uc8_SystemDateTime[3]);
 110   1              
 111   1              current_clock.weekday = 1;
 112   1              
 113   1              //强制DS1307运行于24小时模式
 114   1              
 115   1              current_clock.hour = current_clock.hour & 0x3f;
 116   1              
 117   1              // enable the oscillator (CH bit = 0) 
 118   1              
 119   1              current_clock.seconds = current_clock.seconds & 0x7f;
 120   1              
 121   1              current_clock.control = 0x00;
 122   1              
 123   1              //I2C写入
 124   1              I2C_SendStr(DS1307_ADDRESS,0x00,(uchar *)&current_clock ,8);
 125   1              
 126   1      }
 127          
 128          
 129          
 130          /*******************************************************************
 131                          系统日期时间读取函数(内部格式转换)
 132          函数原型: void fnRead_SystemClock()
 133          功能:   系统日期时间读取DS1307(内部格式转换)
 134          
 135          涉及变量:      uc8_SystemDateTime[8];
 136                          current_clock
 137          ********************************************************************/
 138          void fnRead_SystemClock()
 139          {
 140   1              //I2C读取
 141   1              I2C_RcvStr(DS1307_ADDRESS,0x00,(uchar *)&current_clock,8);
 142   1      
 143   1              //内部格式转换
 144   1              //DS1307格式-->程序格式
 145   1              //BCD码-->10进制码
 146   1              
 147   1              uc8_SystemDateTime[4] = bcdtochar(current_clock.year);
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 8   

 148   1              
 149   1              uc8_SystemDateTime[5] = bcdtochar(current_clock.month);
 150   1              
 151   1              uc8_SystemDateTime[6] = bcdtochar(current_clock.day);
 152   1              
 153   1              uc8_SystemDateTime[1] = bcdtochar(current_clock.hour);
 154   1              
 155   1              uc8_SystemDateTime[2] = bcdtochar(current_clock.minute);
 156   1              
 157   1              uc8_SystemDateTime[3] = bcdtochar(current_clock.seconds);
 158   1              
 159   1      
 160   1      }
 161          
 162          
 163          /*******************************************************************
 164                          DS1307的RAM数据操作函数:在某地址写入n字节数据
 165          函数原型: bit fnWrite_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data);
 166          功能:   DS1307的RAM数据操作函数:在DS1307的RAM某地址写入n字节数据
 167                          所有数据的地址范围检查。
 168                          数据地址的范围00H-3FH,注意00H-07H是DS1307的工作寄存器。
 169          涉及变量:      
 170                          ucAddress       写入的RAM地址
 171                          ucSize          写入的数据长度
 172                          *uc_Data        写入数据的指针
 173          返回:  0                       出错
 174                          1                       正常
 175          ********************************************************************/
 176          bit fnWrite_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data)
 177          {
 178   1              //检查所有数据的最终写入地址是否越界00H-3FH
 179   1              if( ucAddress + ucSize > 0x3F)
 180   1                      return(0);
 181   1      
 182   1              //利用I2C总线把数据写入DS1307的RAM
 183   1              //I2C写入
 184   1              I2C_SendStr(DS1307_ADDRESS,ucAddress,uc_Data,ucSize);
 185   1              
 186   1              //返回  正常
 187   1              return(1);
 188   1      }
 189          
 190          
 191          
 192          /*******************************************************************
 193                          DS1307的RAM数据操作函数:在某地址读入n字节数据
 194          函数原型: bit fnRead_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data);
 195          功能:   DS1307的RAM数据操作函数:在DS1307的RAM某地址读入n字节数据
 196                          所有数据的地址范围检查。
 197                          数据地址的范围00H-3FH,注意00H-07H是DS1307的工作寄存器。
 198          涉及变量:      
 199                          ucAddress       读入的RAM地址
 200                          ucSize          读入的数据长度
 201                          *uc_Data        读入数据的指针
 202          返回:  0                       出错
 203                          1                       正常
 204          ********************************************************************/
 205          bit fnRead_DS1307RAM(uchar ucAddress,uchar ucSize, uchar *uc_Data)
 206          {
 207   1              //检查所有数据的最终读入地址是否越界00H-3FH
 208   1              if( ucAddress + ucSize > 0x3F)
 209   1                      return(0);
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 9   

 210   1      
 211   1              //利用I2C总线把数据读入DS1307的RAM
 212   1              //I2C读取
 213   1              I2C_RcvStr(DS1307_ADDRESS,ucAddress,uc_Data,ucSize);
 214   1              
 215   1              //返回  正常
 216   1              return(1);
 217   1      }
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 10  

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION _chartobcd (BEGIN)
                                           ; SOURCE LINE # 67
;---- Variable 'n' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 68
                                           ; SOURCE LINE # 69
0000 EF                MOV     A,R7
0001 75F00A            MOV     B,#0AH
0004 84                DIV     AB
0005 C4                SWAP    A
0006 54F0              ANL     A,#0F0H
0008 FE                MOV     R6,A
0009 EF                MOV     A,R7
000A 75F00A            MOV     B,#0AH
000D 84                DIV     AB
000E E5F0              MOV     A,B
0010 4E                ORL     A,R6
0011 FF                MOV     R7,A
                                           ; SOURCE LINE # 70
0012         ?C0001:
0012 22                RET     
             ; FUNCTION _chartobcd (END)

             ; FUNCTION _bcdtochar (BEGIN)
                                           ; SOURCE LINE # 79
;---- Variable 'bcdnum' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 80
                                           ; SOURCE LINE # 81
0000 EF                MOV     A,R7
0001 C4                SWAP    A
0002 540F              ANL     A,#0FH
0004 75F00A            MOV     B,#0AH
0007 A4                MUL     AB
0008 FE                MOV     R6,A
0009 EF                MOV     A,R7
000A 540F              ANL     A,#0FH
000C 2E                ADD     A,R6
000D FF                MOV     R7,A
                                           ; SOURCE LINE # 82
000E         ?C0002:
000E 22                RET     
             ; FUNCTION _bcdtochar (END)

             ; FUNCTION fnSet_SystemClock (BEGIN)
                                           ; SOURCE LINE # 93
                                           ; SOURCE LINE # 94
                                           ; SOURCE LINE # 99
0000 900000      R     MOV     DPTR,#uc8_SystemDateTime+04H
0003 E0                MOVX    A,@DPTR
0004 FF                MOV     R7,A
0005 120000      R     LCALL   _chartobcd
0008 900000      R     MOV     DPTR,#current_clock+06H
000B EF                MOV     A,R7
000C F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 101
000D 900000      R     MOV     DPTR,#uc8_SystemDateTime+05H
0010 E0                MOVX    A,@DPTR
0011 FF                MOV     R7,A
0012 120000      R     LCALL   _chartobcd
0015 900000      R     MOV     DPTR,#current_clock+05H
C51 COMPILER V7.07   CLOCK_DS1307                                                          07/08/2004 05:56:12 PAGE 11  

0018 EF                MOV     A,R7
0019 F0                MOVX    @DPTR,A

⌨️ 快捷键说明

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