ds1302.lst
来自「3、LCD12864不能显示或不能清楚显示: 1)重新按住复位键和KEY A 2」· LST 代码 · 共 215 行
LST
215 行
C51 COMPILER V7.06 DS1302 11/18/2006 09:36:16 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************/
2 /* */
-
3 /*名称: ds1302读写程序 */
-
-
4 /*功能: 读写DS1302,通过串口返回给电脑 */
-
5 /*难度等级: 中 */
-
6 /* 作者: zengrenliang */
7 /* 版权: http://www.51kaifa.com */
8 /*编写日期: 2006.05.21 */
-
-
9 /*****************************************************************/
10
11 #include<reg52.h>
12 #define uchar unsigned char
13
14 /***********************************延时函数*******************************/
15
16 void delay(unsigned int i)
17 {
18 1 unsigned int j;
19 1 for(j=0;j<i;j++);
20 1 }
21 /*********************************************************************/
22 /* */
23 /* 实时时钟模块 时钟芯片型号:DS1302 */
24 /* */
25 /*********************************************************************/
26 sbit T_CLK = P1^1; /*实时时钟时钟线引脚 */
27 sbit T_IO = P1^2; /*实时时钟数据线引脚 */
28 sbit lck = P3^5;
29 sbit ACC0 = ACC^0;
30 sbit ACC7 = ACC^7;
31
32
33 /*********************************************************************/
34 /* */
35 /* 名称: v_RTInputByte */
36 /* 说明: */
37 /* 功能: 往DS1302写入1Byte数据 */
38 /* 调用: */
39 /* 输入: ucDa 写入的数据 */
40 /* 返回值: 无 */
41 /*********************************************************************/
42 void v_RTInputByte(uchar ucDa)
43 {
44 1 uchar i;
45 1 ACC = ucDa;
46 1 for(i=8; i>0; i--)
47 1 {
48 2 T_IO = ACC0; /*相当于汇编中的 RRC */
C51 COMPILER V7.06 DS1302 11/18/2006 09:36:16 PAGE 2
49 2 T_CLK = 1;
50 2 T_CLK = 0;
51 2 ACC = ACC >> 1;
52 2 }
53 1 }
54 /*********************************************************************/
55 /* */
56 /* 名称: uchar uc_RTOutputByte */
57 /* 说明: */
58 /* 功能: 从DS1302读取1Byte数据 */
59 /* 调用: */
60 /* 输入: */
61 /* 返回值: ACC */
62 /*********************************************************************/
63 uchar uc_RTOutputByte(void)
64 {
65 1 uchar i;
66 1 for(i=8; i>0; i--)
67 1 {
68 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
69 2 ACC7 = T_IO;
70 2 T_CLK = 1;
71 2 T_CLK = 0;
72 2 }
73 1 return(ACC);
74 1 }
75 /*********************************************************************/
76 /* */
77 /* 名称: v_W1302 */
78 /* 说明: 先写地址,后写命令/数据 */
79 /* 功能: 往DS1302写入数据 */
80 /* 调用: v_RTInputByte() */
81 /* 输入: ucAddr: DS1302地址, ucDa: 要写的数据 */
82 /* 返回值: 无 */
83 /*********************************************************************/
84 void v_W1302(uchar ucAddr, uchar ucDa)
85 {
86 1 lck = 0;
87 1 P1 = 0x00;
88 1 lck = 1;
89 1
90 1 T_CLK = 0;
91 1
92 1 lck = 0;
93 1 P1 = 0x10;
94 1 lck = 1;
95 1 v_RTInputByte(ucAddr); /* 地址,命令 */
96 1 v_RTInputByte(ucDa); /* 写1Byte数据*/
97 1 T_CLK = 1;
98 1 lck = 0;
99 1 P1 = 0x00;
100 1 lck = 1;
101 1 }
102 /*********************************************************************/
103 /* */
104 /* 名称: uc_R1302 */
105 /* 说明: 先写地址,后读命令/数据 */
106 /* 功能: 读取DS1302某地址的数据 */
107 /* 调用: v_RTInputByte() , uc_RTOutputByte() */
108 /* 输入: ucAddr: DS1302地址 */
109 /* 返回值: ucDa :读取的数据 */
110 /*********************************************************************/
C51 COMPILER V7.06 DS1302 11/18/2006 09:36:16 PAGE 3
111 uchar uc_R1302(uchar ucAddr)
112 {
113 1 uchar ucDa;
114 1
115 1 lck = 0;
116 1 P1 = 0x00;
117 1 lck = 1;
118 1
119 1 T_CLK = 0;
120 1
121 1 lck = 0;
122 1 P1 = 0x10;
123 1 lck = 1;
124 1 v_RTInputByte(ucAddr); /* 地址,命令 */
125 1 ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
126 1 T_CLK = 1;
127 1 lck = 0;
128 1 P1 = 0x00;
129 1 lck = 1;
130 1 return(ucDa);
131 1 }
132
133 /*********************************************************************/
134 /* */
135 /* 名称: v_Set1302 */
136 /* 说明: */
137 /* 功能: 设置初始时间 */
138 /* 调用: v_W1302() */
139 /* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年*/
140 /* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B */
141 /* 返回值: 无 */
142 /*********************************************************************/
143 void v_Set1302(uchar *pSecDa)
144 {
145 1 uchar i;
146 1 uchar ucAddr = 0x80;
147 1 v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
148 1 for(i =7;i>0;i--)
149 1 {
150 2 v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
151 2
152 2 pSecDa++;
153 2 ucAddr +=2;
154 2 }
155 1 v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
156 1 }
157 /******************************************************************************/
158 /* */
159 /* 名称: v_Get1302 */
160 /* 说明: */
161 /* 功能: 读取DS1302当前时间 */
162 /* 调用: uc_R1302() */
163 /* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 */
164 /* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B */
165 /* 返回值: 无 */
166 /******************************************************************************/
167 void v_Get1302(uchar ucCurtime[])
168 {
169 1 uchar i;
170 1 uchar ucAddr = 0x81;
171 1 for (i=0;i<7;i++)
172 1 {
C51 COMPILER V7.06 DS1302 11/18/2006 09:36:16 PAGE 4
173 2 ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
174 2 ucAddr += 2;
175 2 delay(100);
176 2 }
177 1 }
178 /**************************************结束**************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 197 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?