📄 222.lst
字号:
C51 COMPILER V8.02 222 03/20/2009 17:22:44 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 222
OBJECT MODULE PLACED IN 222.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 222.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************
2 名称:DS1302_TIME_LED
3 说明:向1302写入起始时间"2008.09.06","14:18:58",并在8位数码管上显示
4 (分两次显示,第1显示年月日,第2显示当前时间)
5 功能:熟练掌握对1302的读写操作。并用其计时
6 调用:
7 输入值:写入数据"2008.09.06","14:18:58"
8 返回值:
9
10 ****************************************************************/
11
12 #include<reg51.h>
13
14 #define uint unsigned int
15 #define uchar unsigned char
16
17
18 /*******************************************************************
19 分别定义控制,年,月,日,时,分,秒寄存器的写数据地址
20 *******************************************************************/
21 #define control_add 0x8e //写保护地址
22 #define year_add 0x8c
23 #define month_add 0x88
24 #define date_add 0x86
25 #define hour_add 0x84
26 #define min_add 0x82
27 #define second_add 0x80
28
29 /*****************************************************************
30 定义起始时间的数据"2008.09.06","14:18:58"
31 ******************************************************************/
32 #define control_unprotect 0x00 //允许写数据
33 #define year_data 0x08 //"08"年
34 #define month_data 0x09 //"09"月
35 #define date_data 0x06 //"06"号
36 #define hour_data 0x14 //"14"点
37 #define min_data 0x58 //"58"分
38 #define second_data 0x58 //"58"秒,同时开始开启时钟
39
40
41
42 uchar data_1byte; //定义1字节数据
43 uchar data_1burst; //定义数据
44 uchar data_buffer1[20]; //定义读取到的年,月,日,时,分,秒数据缓冲区
45 uchar data_buffer2[14]={2,0,0}; //定义显示数据缓冲区
46 uint flag;
47 uchar addar; //定义地址
48 uchar month;
49 uchar display_buffer[8]; //定义显示数据缓冲区
50 uchar code duan_ma[]={0x03,0x9f,0x25,0x0d,0x99,
51 0x49,0x41,0x1f,0x01,0x09};
52 //段码,对应的数字0-9十个数
53
54 sbit DS1302_SCLK=P1^4; //实时时钟控制引脚
55 sbit DS1302_IO=P1^5; //数据输入、输出引脚
C51 COMPILER V8.02 222 03/20/2009 17:22:44 PAGE 2
56 sbit DS1302_RST=P1^7;
57 sbit HC595_RCK=P3^2; //定义74HC595的移位脉冲端
58 sbit BIT7=ACC^7;
59
60
61
62 /**************************************************************
63 us级延时子程序
64 ***************************************************************/
65 void delay_us(uchar i)
66 {
67 1 for(i=250;i>0;i--)
68 1 ;
69 1 }
70
71
72 /**************************************************************
73 MS级延时子程序
74 ***************************************************************/
75 void delay_ms(uchar i)
76 {
77 1 uchar j;
78 1 for(i;i>0;i--)
79 1 for(j=83;j>0;j--)
80 1 ;
81 1 }
82
83
84 /************************************************************
85 名称: write_1302_1byte
86 说明: 发送1byte数据子程序
87 功能: 该指令完成对1302的地址或数据1byte的写操作
88 调用:
89 输入值:1byte数据
90 返回值:无
91 *************************************************************/
92 void write_1302_1byte(uchar j)
93 {
94 1 uint i;
95 1 for(i=8;i>0;i--)
96 1 {
97 2 if(j&0x01==0x01)
98 2 {DS1302_IO=1;} //从A的最低位开始依次发送
99 2 else
100 2 {DS1302_IO=0;}
101 2 DS1302_SCLK=1; //置写移位脉冲有效
102 2 DS1302_SCLK=0;
103 2 j=(j>>1);
104 2 }
105 1 }
106
107
108
109
110 /***********************************************************
111 名称: read_1302_1byte
112 说明: 读取1byte数据子程序
113 功能: 该指令完成对1302的地址或数据1byte的读操作
114 调用:
115 输入值:1byte数据
116 返回值:ACC
117 ************************************************************/
C51 COMPILER V8.02 222 03/20/2009 17:22:44 PAGE 3
118 read_1302_1byte(void)
119 {
120 1 uint i;
121 1 uchar temp;
122 1 for(i=0;i<8;++i)
123 1 {
124 2 temp=temp>>1; //把前一次读取的数据右移一位,下次读取的数据保存到第7位
125 2 if(DS1302_IO==1) //读取1byte的数据保持到temp中
126 2 {temp|=0x80;}
127 2 else
128 2 {temp&=0x7f;}
129 2 DS1302_SCLK=1; //置读移位脉冲有效
130 2 DS1302_SCLK=0;
131 2 }
132 1 return(temp);
133 1 }
134
135
136
137 /************************************************************
138 名称:write_1302
139 说明:先写地址,再写数据
140 功能:完成对1302的写操作
141 调用:write_1302_1byte()
142 输入值:地址,数据
143 返回值:无
144 ************************************************************/
145 void write_1302(unsigned addar,unsigned data_1burst)
146 {
147 1 DS1302_RST=0;
148 1 delay_us(1);
149 1 DS1302_SCLK=0;
150 1 DS1302_RST=1;
151 1 write_1302_1byte(addar); //向1302发送将要写入数据的地址
152 1 write_1302_1byte(data_1burst); //向1302发送将要写入的数据
153 1 DS1302_RST=0;
154 1 }
155
156
157
158 /************************************************************
159 名称:read_1302
160 说明:先写地址,再读取数据
161 功能:完成对1302的数据读取操作
162 调用:read_1302_1byte()
163 输入值:地址
164 返回值:data_1burst
165 *************************************************************/
166 read_1302(char addar)
167 {
168 1 DS1302_RST=0;
169 1 delay_us(1);
170 1 DS1302_SCLK=0;
171 1 DS1302_RST=1;
172 1 write_1302_1byte(addar|0x01); //向1302发送将要读取数据的地址
173 1 data_buffer1[0]=read_1302_1byte(); //把从1302读取到的数据保存到数据缓冲区
174 1 DS1302_RST=0;
175 1 }
176
177
178
179
C51 COMPILER V8.02 222 03/20/2009 17:22:44 PAGE 4
180 /************************************************************
181 名称:DS1302_Write_Time
182 说明:把设定的时间初值写入相应的寄存器中
183 功能:完成对1302的初始时间设定,并打开写保护
184 调用:write_1302()
185 输入值:"2008.09.06","14:18:58"
186 返回值:无
187 ************************************************************/
188 DS1302_Write_Time()
189 {
190 1 read_1302(0x8e); //读取控制寄存器的当前状态
191 1 if(data_buffer1[0]!=0x80) //判断控制寄存器是否写保护
192 1 { //没有写保护,则开始写数据
193 2 write_1302(control_add,0x00);
194 2 write_1302(year_add,year_data);
195 2 write_1302(month_add,month_data);
196 2 write_1302(date_add,date_data);
197 2 write_1302(hour_add,hour_data);
198 2 write_1302(min_add,min_data);
199 2 write_1302(second_add,second_data);
200 2 write_1302(control_add,0x80); //禁止写数据到1302,即开启写保护
201 2 }
202 1 }
203
204
205
206
207 /*************************************************************
208 名称:DS1302_Read_Time
209 说明:从1302中读取当前各寄存器的数据
210 功能:读取当前的时间,并把数据保存以便显示
211 调用:read_1302
212 输入值:各寄存器地址
213 返回值:data_buffer[20]
214 **************************************************************/
215 void DS1302_Read_Time()
216 {
217 1 uint i;
218 1 month=0x88;
219 1 read_1302 (year_add); //依次读取当前的年
220 1 data_buffer1[1]=data_buffer1[0];
221 1 for(i=2;i<7;i++)
222 1 {
223 2 read_1302 (month); //依次读取当前的月,日,时,分,秒
224 2 data_buffer1[i]=data_buffer1[0];
225 2 month=(month-2);
226 2 }
227 1
228 1 }
229
230
231
232
233 /******************************************************
234 名称: Data_processing
235 说明: 把从1302读取到的数据个,十位分离,以便显示
236 功能: 读取到的16进制转换成10进制
237 调用:
238 输入值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -