📄 020.lst
字号:
C51 COMPILER V7.09 020 09/03/2008 11:18:50 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE 020
OBJECT MODULE PLACED IN 020.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 020.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************
2
3 模块名称:DS1302.c
4 功 能:实时时钟模块
5 时钟芯片型号:DS1302
6 说 明:
7 *********************************************************************/
8 #include <reg52.h>
9 #define uchar unsigned char //宏定义
10 #define uint unsigned int
11
12 sbit T_CLK = P3^4; /*实时时钟时钟线引脚 */
13 sbit T_IO = P3^5; /*实时时钟数据线引脚 */
14 sbit T_RST = P3^3; /*实时时钟复位线引脚 */
15
16 sbit ACC0 = ACC^0;
17 sbit ACC7 = ACC^7;
18 unsigned char code table[]=
19 {0xdf,0x86,0xbb,0xaf,0xe6,0xed,0xfd,0x87,
20 0xff,0xef,0xf7,0xfc,0xd9,0xbe,0xf9,0xf1};
21 uchar ledaddr[]={0x20,0x10,0x08,0x04,0x02,0x01};
22
23 //函数声明
24 void delay_ms(uint x); //延时
25 void RTInputByte(uchar); /* 输入 1Byte */
26 uchar RTOutputByte(void); /* 输出1Byte */
27 void W1302(uchar, uchar); //往DS1302写入数据
28 uchar R1302(uchar); //读取DS1302某地址的数据
29 void Set1302(uchar *); /* 设置时间 */
30 void Bcd2asc(uchar,uchar *);
31 void Get1302(); /* 读取1302当前时间 */
32
33 //uchar time1[7];
34 uchar ucCurtime[7];
35
36 /********************************************************************
37
38 函 数 名:delay1()
39 功 能:延时子程序
40 说 明:通过调整x的值可以改变延时长短
41 入口参数:x
42 返 回 值:无
43 ***********************************************************************/
44 void delay_ms(uint x)
45 {
46 1 uchar tw;
47 1 while (x-->0)
48 1 {
49 2 for (tw=0;tw<125;tw++){;}
50 2 }
51 1 }
52
53
54 /********************************************************************
55
C51 COMPILER V7.09 020 09/03/2008 11:18:50 PAGE 2
56 函 数 名:RTInputByte()
57 功 能:实时时钟写入一字节
58 说 明:往DS1302写入1Byte数据 (内部函数)
59 入口参数:d 写入的数据
60 返 回 值:无
61 ***********************************************************************/
62 void RTInputByte(uchar d)
63 {
64 1 uchar i;
65 1 ACC = d;
66 1 for(i=8; i>0; i--)
67 1 {
68 2 T_IO = ACC0; /*相当于汇编中的 RRC */
69 2 T_CLK = 1;
70 2 T_CLK = 0;
71 2 ACC = ACC >> 1;
72 2 }
73 1 }
74 /********************************************************************
75
76 函 数 名:RTOutputByte()
77 功 能:实时时钟读取一字节
78 说 明:从DS1302读取1Byte数据 (内部函数)
79 入口参数:无
80 返 回 值:ACC
81 ***********************************************************************/
82 uchar RTOutputByte(void)
83 {
84 1 uchar i;
85 1 for(i=8; i>0; i--)
86 1 {
87 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
88 2 ACC7 = T_IO;
89 2 T_CLK = 1;
90 2 T_CLK = 0;
91 2 }
92 1 return(ACC);
93 1 }
94 /********************************************************************
95
96 函 数 名:W1302()
97 功 能:往DS1302写入数据
98 说 明:先写地址,后写命令/数据 (内部函数)
99 调 用:RTInputByte() , RTOutputByte()
100 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
101 返 回 值:无
102 ***********************************************************************/
103 void W1302(uchar ucAddr, uchar ucDa)
104 {
105 1 T_RST = 0;
106 1 T_CLK = 0;
107 1 T_RST = 1;
108 1 RTInputByte(ucAddr); /* 地址,命令 */
109 1 RTInputByte(ucDa); /* 写1Byte数据*/
110 1 T_CLK = 1;
111 1 T_RST = 0;
112 1 }
113 /********************************************************************
114
115 函 数 名:R1302()
116 功 能:读取DS1302某地址的数据
117 说 明:先写地址,后读命令/数据 (内部函数)
C51 COMPILER V7.09 020 09/03/2008 11:18:50 PAGE 3
118 调 用:RTInputByte() , RTOutputByte()
119 入口参数:ucAddr: DS1302地址
120 返 回 值:ucData :读取的数据
121 ***********************************************************************/
122 uchar R1302(uchar ucAddr)
123 {
124 1 uchar ucData;
125 1 T_RST = 0;
126 1 T_CLK = 0;
127 1 T_RST = 1;
128 1 RTInputByte(ucAddr); /* 地址,命令 */
129 1 ucData = RTOutputByte(); /* 读1Byte数据 */
130 1 T_CLK = 1;
131 1 T_RST = 0;
132 1 return(ucData);
133 1 }
134 /********************************************************************
135
136 函 数 名:BurstW1302T()
137 功 能:往DS1302写入时钟数据(多字节方式)
138 说 明:先写地址,后写命令/数据
139 调 用:RTInputByte()
140 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
141 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
142 返 回 值:无
143 ***********************************************************************/
144 void BurstW1302T(uchar *pWClock)
145 {
146 1 uchar i;
147 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
148 1 T_RST = 0;
149 1 T_CLK = 0;
150 1 T_RST = 1;
151 1 RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
152 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
153 1 {
154 2 RTInputByte(*pWClock); /* 写1Byte数据*/
155 2 pWClock++;
156 2 }
157 1 T_CLK = 1;
158 1 T_RST = 0;
159 1 }
160 /********************************************************************
161
162 函 数 名:BurstR1302T()
163 功 能:读取DS1302时钟数据
164 说 明:先写地址/命令,后读数据(时钟多字节方式)
165 调 用:RTInputByte() , RTOutputByte()
166 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
167 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -