网站导航: 首页 > 设计参考 > 正文 文章搜索
时钟芯片DS1302 的汇编和C51程序
 
文章编号:
090106152939
文章分类: 单片机 51系列
点 击:
...
关 键 词: DS1302,时钟
文章来源:
网络,作者:zhaojunjie
摘 要:

汇编程序
C程序

以下是汇编程序:

 
  1. ;*********************************************************************  
  2. ; 公司名称:  
  3. ; 模块名称:DS1302.a51  
  4. ; 功    能:实时时钟模块           时钟芯片型号:DS1302   
  5. ; 说    明:(修改版)  
  6. ; 程序设计:zhaojunjie          
  7. ; 设计时间:2002.05.04          
  8. ; 版 本 号:20020504  
  9. ;*********************************************************************/  
  10. T_CLK Bit P2.7                         ;实时时钟时钟线引脚  
  11. T_IO  Bit P1.4                         ;实时时钟数据线引脚  
  12. T_RST Bit P1.5                         ;实时时钟复位线引脚  
  13. ;**********************************************************  
  14. ;子程序名:Set1302  
  15. ;功    能:设置DS1302 初始时间,并启动计时。  
  16. ;说    明:  
  17. ;调    用:RTInputByte  
  18. ;入口参数:初始时间在:Second,Minute,Hour,Day,Month,Week.YearL(地址连续)  
  19. ;出口参数:无  
  20. ;影响资源:A B R0 R1 R4 R7   
  21. ;设    计:zhaojunjie           日    期:2002-03-19  
  22. ;修    改:                     日    期:   
  23. ;**********************************************************  
  24. Set1302:   
  25.           CLR    T_RST   
  26.           CLR    T_CLK   
  27.           SETB   T_RST    
  28.           MOV    B,     #8EH        ;控制寄存器  
  29.           LCALL  RTInputByte     
  30.           MOV    B,     #00H        ;写操作前WP=0  
  31.           LCALL  RTInputByte     
  32.           SETB   T_CLK    
  33.           CLR    T_RST   
  34.           MOV    R0,    #Second;  
  35.           MOV    R7,    #7        ;秒 分 时 日 月 星期 年   
  36.           MOV    R1,    #80H      ;秒写地址  
  37. S13021:   CLR    T_RST   
  38.           CLR    T_CLK   
  39.           SETB   T_RST    
  40.           MOV    B,     R1        ;写秒 分 时 日 月 星期 年 地址  
  41.           LCALL  RTInputByte     
  42.           MOV    A,     @R0       ;写秒数据  
  43.           MOV    B,     A  
  44.           LCALL  RTInputByte     
  45.           INC    R0  
  46.           INC    R1  
  47.           INC    R1  
  48.           SETB   T_CLK    
  49.           CLR    T_RST   
  50.           DJNZ   R7,    S13021   
  51.           CLR    T_RST   
  52.           CLR    T_CLK   
  53.           SETB   T_RST    
  54.           MOV    B,     #8EH        ;控制寄存器  
  55.           LCALL  RTInputByte     
  56.           MOV    B,     #80H        ;控制,WP=1,写保护  
  57.           LCALL  RTInputByte     
  58.           SETB   T_CLK    
  59.           CLR    T_RST   
  60.           RET  
  61. ;**********************************************************  
  62. ;子程序名:Get1302  
  63. ;功    能:从DS1302 读时间  
  64. ;说    明:  
  65. ;调    用:RTInputByte,RTOutputByte  
  66. ;入口参数:时间保存在:Second,Minute,Hour,Day,Month,Week.YearL  
  67. ;出口参数:无  
  68. ;影响资源:A B R0 R1 R4 R7  
  69. ;设    计:zhaojunjie           日    期:2002-03-19  
  70. ;修    改:                     日    期:   
  71. ;**********************************************************  
  72. Get1302:         
  73.           MOV    R0,    #Second;  
  74.           MOV    R7,    #7  
  75.           MOV    R1,    #81H       ;秒地址  
  76. G13021:   CLR    T_RST   
  77.           CLR    T_CLK   
  78.           SETB   T_RST    
  79.           MOV    B,     R1        ;秒 分 时 日 月 星期 年 地址  
  80.           LCALL  RTInputByte     
  81.           LCALL  RTOutputByte   
  82.           MOV    @R0,   A         ;秒  
  83.           INC    R0  
  84.           INC    R1  
  85.           INC    R1  
  86.           SETB   T_CLK    
  87.           CLR    T_RST   
  88.           DJNZ   R7,    G13021   
  89.           RET  
  90. ;**********************************************************  
  91. ;功    能:写1302一字节  (内部子程序)  
  92. ;**********************************************************  
  93. RTInputByte:     
  94.           MOV    R4,    #8  
  95. Inbit1:   MOV    A,     B  
  96.           RRC    A  
  97.           MOV    B,     A  
  98.           MOV    T_IO,  C   
  99.           SETB   T_CLK   
  100.           CLR    T_CLK   
  101.           DJNZ   R4,   Inbit1   
  102.           RET  
  103. ;**********************************************************  
  104. ;功    能:读1302一字节  (内部子程序)  
  105. ;**********************************************************  
  106. RTOutputByte:    
  107.           MOV    R4,    #8  
  108. Outbit1:  MOV    C,     T_IO   
  109.           RRC    A  
  110.           SETB   T_CLK   
  111.           CLR    T_CLK   
  112.           DJNZ   R4,    Outbit1   
  113.           RET  
  114. ;/////////////////////////////////////////////////////////////////////////////  

以下是C程序

 
  1. /*********************************************************************  
  2. 公司名称:  
  3. 模块名称:DS1302.c  
  4. 功    能:实时时钟模块           时钟芯片型号:DS1302   
  5. 说    明:  
  6. 程序设计:zhaojunjie          
  7. 设计时间:2002.03.02          
  8. 版 本 号: 20020302  
  9. *********************************************************************/  
  10. #include    
  11.   
  12. sbit     T_CLK      = P2^7;   /*实时时钟时钟线引脚 */  
  13. sbit     T_IO       = P1^4;   /*实时时钟数据线引脚 */  
  14. sbit     T_RST      = P1^5;   /*实时时钟复位线引脚 */  
  15.   
  16. sbit  ACC0 = ACC^0;   
  17. sbit  ACC7 = ACC^7;   
  18.   
  19.   
  20. void   RTInputByte(uchar);       /* 输入 1Byte */  
  21. uchar  RTOutputByte(void);       /* 输出?1Byte */  
  22. void   W1302(uchar, uchar);   
  23. uchar  R1302(uchar);   
  24. void   Set1302(uchar *);         /* 设置时间 */  
  25. void   Bcd2asc(uchar,uchar *);   
  26. void   Get1302(uchar curtime[]); /* 读取1302当前时间 */  
  27.   
  28. /********************************************************************   
  29. 函 数 名:RTInputByte()  
  30. 功    能:实时时钟写入一字节  
  31. 说    明:往DS1302写入1Byte数据 (内部函数)  
  32. 入口参数:d 写入的数据   
  33. 返 回 值:无    
  34. 设    计:zhaojunjie           日    期:2002-03-19  
  35. 修    改:                     日    期:   
  36. ***********************************************************************/  
  37. void RTInputByte(uchar d)    
  38. {    
  39.     uchar i;   
  40.     ACC = d;   
  41.     for(i=8; i>0; i--)   
  42.     {   
  43.         T_IO = ACC0;           /*相当于汇编中的 RRC */  
  44.         T_CLK = 1;   
  45.         T_CLK = 0;   
  46.         ACC = ACC >> 1;    
  47.     }    
  48. }   
  49. /********************************************************************   
  50. 函 数 名:RTOutputByte()  
  51. 功    能:实时时钟读取一字节  
  52. 说    明:从DS1302读取1Byte数据 (内部函数)  
  53. 入口参数:无    
  54. 返 回 值:ACC  
  55. 设    计:zhaojunjie           日    期:2002-03-19  
  56. 修    改:                     日    期:   
  57. ***********************************************************************/  
  58. uchar RTOutputByte(void)    
  59. {    
  60.     uchar i;   
  61.     for(i=8; i>0; i--)   
  62.     {   
  63.         ACC = ACC >>1;         /*相当于汇编中的 RRC */  
  64.         ACC7 = T_IO;   
  65.         T_CLK = 1;   
  66.         T_CLK = 0;   
  67.     }    
  68.     return(ACC);    
  69. }   
  70. /********************************************************************   
  71. 函 数 名:W1302()  
  72. 功    能:往DS1302写入数据  
  73. 说    明:先写地址,后写命令/数据 (内部函数)  
  74. 调    用:RTInputByte() , RTOutputByte()  
  75. 入口参数:ucAddr: DS1302地址, ucData: 要写的数据  
  76. 返 回 值:无  
  77. 设    计:zhaojunjie           日    期:2002-03-19  
  78. 修    改:                     日    期:   
  79. ***********************************************************************/  
  80. void W1302(uchar ucAddr, uchar ucDa)   
  81. {   
  82.     T_RST = 0;   
  83.     T_CLK = 0;   
  84.     T_RST = 1;   
  85.     RTInputByte(ucAddr);       /* 地址,命令 */  
  86.     RTInputByte(ucDa);       /* 写1Byte数据*/  
  87.     T_CLK = 1;   
  88.     T_RST = 0;   
  89. }    
  90. /********************************************************************   
  91. 函 数 名:R1302()  
  92. 功    能:读取DS1302某地址的数据  
  93. 说    明:先写地址,后读命令/数据 (内部函数)  
  94. 调    用:RTInputByte() , RTOutputByte()  
  95. 入口参数:ucAddr: DS1302地址  
  96. 返 回 值:ucData :读取的数据  
  97. 设    计:zhaojunjie           日    期:2002-03-19  
  98. 修    改:                     日    期:   
  99. ***********************************************************************/  
  100. uchar R1302(uchar ucAddr)   
  101. {   
  102.     uchar ucData;   
  103.     T_RST = 0;   
  104.     T_CLK = 0;   
  105.     T_RST = 1;   
  106.     RTInputByte(ucAddr);             /* 地址,命令 */  
  107.     ucData = RTOutputByte();         /* 读1Byte数据 */  
  108.     T_CLK = 1;   
  109.     T_RST = 0;   
  110.     return(ucData);   
  111. }   
  112. /********************************************************************   
  113. 函 数 名:BurstW1302T()  
  114. 功    能:往DS1302写入时钟数据(多字节方式)  
  115. 说    明:先写地址,后写命令/数据  
  116. 调    用:RTInputByte()   
  117. 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制  
  118.                             8Byte (BCD码)1B 1B 1B 1B 1B  1B  1B 1B  
  119. 返 回 值:无  
  120. 设    计:zhaojunjie           日    期:2002-03-19  
  121. 修    改:                     日    期:   
  122. ***********************************************************************/  
  123. void BurstW1302T(uchar *pWClock)   
  124. {   
  125.     uchar i;   
  126.     W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作?*/  
  127.     T_RST = 0;   
  128.     T_CLK = 0;   
  129.     T_RST = 1;   
  130.     RTInputByte(0xbe);        /* 0xbe:时钟多字节写命令 */  
  131.     for (i = 8; i>0; i--)     /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/  
  132.     {   
  133.         RTInputByte(*pWClock); /* 写1Byte数据*/  
  134.         pWClock++;   
  135.     }   
  136.     T_CLK = 1;   
  137.     T_RST = 0;   
  138. }    
  139. /********************************************************************   
  140. 函 数 名:BurstR1302T()  
  141. 功    能:读取DS1302时钟数据  
  142. 说    明:先写地址/命令,后读数据(时钟多字节方式)  
  143. 调    用:RTInputByte() , RTOutputByte()  
  144. 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年  
  145.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B  
  146. 返 回 值:无  
  147. 设    计:zhaojunjie           日    期:2002-03-19  
  148. 修    改:                     日    期:   
  149. ***********************************************************************/  
  150. void BurstR1302T(uchar *pRClock)   
  151. {   
  152.     uchar i;   
  153.     T_RST = 0;   
  154.     T_CLK = 0;   
  155.     T_RST = 1;   
  156.     RTInputByte(0xbf);             /* 0xbf:时钟多字节读命令 */  
  157.     for (i=8; i>0; i--)    
  158.     {   
  159.        *pRClock = RTOutputByte();   /* 读1Byte数据 */  
  160.        pRClock++;   
  161.     }   
  162.     T_CLK = 1;   
  163.     T_RST = 0;   
  164. }   
  165. /********************************************************************   
  166. 函 数 名:BurstW1302R()  
  167. 功    能:往DS1302寄存器数写入数据(多字节方式)  
  168. 说    明:先写地址,后写数据(寄存器多字节方式)  
  169. 调    用:RTInputByte()  
  170. 入口参数:pWReg: 寄存器数据地址  
  171. 返 回 值:无  
  172. 设    计:zhaojunjie           日    期:2002-03-19  
  173. 修    改:                     日    期:   
  174. ***********************************************************************/  
  175. void BurstW1302R(uchar *pWReg)   
  176. {   
  177.     uchar i;   
  178.     W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/  
  179.     T_RST = 0;   
  180.     T_CLK = 0;   
  181.     T_RST = 1;   
  182.     RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */  
  183.     for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */  
  184.     {   
  185.         RTInputByte(*pWReg);    /* 写1Byte数据*/  
  186.         pWReg++;   
  187.     }   
  188.     T_CLK = 1;   
  189.     T_RST = 0;   
  190. }    
  191. /********************************************************************   
  192. 函 数 名:BurstR1302R()  
  193. 功    能:读取DS1302寄存器数据  
  194. 说    明:先写地址,后读命令/数据(寄存器多字节方式)  
  195. 调    用:RTInputByte() , RTOutputByte()  
  196. 入口参数:pRReg: 寄存器数据地址  
  197. 返 回 值:无  
  198. 设    计:zhaojunjie           日    期:2002-03-19  
  199. 修    改:                     日    期:   
  200. ***********************************************************************/  
  201. void BurstR1302R(uchar *pRReg)   
  202. {   
  203.     uchar i;   
  204.     T_RST = 0;   
  205.     T_CLK = 0;   
  206.     T_RST = 1;   
  207.     RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */  
  208.     for (i=31; i>0; i--)          /*31Byte 寄存器数据 */  
  209.     {   
  210.         *pRReg = RTOutputByte();  /* 读1Byte数据 */  
  211.         pRReg++;   
  212.     }   
  213.     T_CLK = 1;   
  214.     T_RST = 0;   
  215. }   
  216. /********************************************************************   
  217. 函 数 名:Set1302()  
  218. 功    能:设置初始时间  
  219. 说    明:先写地址,后读命令/数据(寄存器多字节方式)  
  220. 调    用:W1302()  
  221. 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年  
  222.                                7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B  
  223. 返 回 值:无  
  224. 设    计:zhaojunjie           日    期:2002-03-19  
  225. 修    改:                     日    期:   
  226. ***********************************************************************/  
  227. void Set1302(uchar *pClock)    
  228. {   
  229.     uchar i;   
  230.     uchar ucAddr = 0x80;    
  231.     W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/  
  232.     for(i =7; i>0; i--)   
  233.     {    
  234.         W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */    
  235.         pClock++;   
  236.         ucAddr +=2;   
  237.     }   
  238.     W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/  
  239. }   
  240. /********************************************************************   
  241. 函 数 名:Get1302()  
  242. 功    能:读取DS1302当前时间  
  243. 说    明:  
  244. 调    用:R1302()   
  245. 入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年   
  246.                                         7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B  
  247. 返 回 值:无  
  248. 设    计:zhaojunjie           日    期:2002-03-19  
  249. 修    改:                     日    期:   
  250. ***********************************************************************/  
  251. void Get1302(uchar ucCurtime[])    
  252. {   
  253.     uchar i;   
  254.     uchar ucAddr = 0x81;   
  255.     for (i=0; i<7; i++)   
  256.     {   
  257.         ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */  
  258.         ucAddr += 2;   
  259.     }   
  260. }   
  261. /*//////////////////////////////////////////////////////////////////////*/  
  262.     
  263.   

(jyh.h头文件) 
 

  1. #include    
  2. #include    
  3. #include    
  4. #include    
  5.   
  6. #define  uchar     unsigned char   
  7. #define  uint      unsigned int   
  8. #define  byte      unsigned char   
  9. #define  word      unsigned int   
  10.   
  11. extern void   Set1302(uchar *);          /* 设置时间 */  
  12. extern void   Get1302(uchar curtime[]);  /* 读取1302当前时间 */  
  13. extern void   Bcd2asc(uchar,uchar *);  
 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4