📄 ds1302.lst
字号:
C51 COMPILER V8.16 DS1302 12/25/2008 19:46:19 PAGE 1
C51 COMPILER V8.16, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN .\bin\ds1302.obj
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE src\ds1302.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND PRINT(.\b
-in\ds1302.lst) OBJECT(.\bin\ds1302.obj)
line level source
1 #include<reg52.h>
2 #include<rtx51tny.h>
3 #include"inc/define.h"
4 #include"inc/ds1302.h"
5
6 sbit rtc_rst=P1^5;
7 sbit rtc_clk=P1^6;
8 sbit rtc_io=P1^7;
9 sbit ACC_0=ACC^0;
10 sbit ACC_7=ACC^7;
11
12 extern vu8 idata for_showh[6];
13 extern vu8 idata for_showl[6];
14 extern vu8 idata week_tempert[8];
15
16
17 vu8 nowTime[7][2];
18
19
20 /*********************************************************
21 *将获取的当前时间、日期设置为待显示数据
22 *函数名称:setTimeShowData()
23 *说明:这是一个RTX51任务,os_create_task(2)之后开始运行
24 *********************************************************/
25 void setTimeShowData(void ) _task_ 3
26 {
27 1
28 1
29 1 while(1)
30 1 {
31 2 getTime(nowTime);
32 2
33 2 for_showh[0]=nowTime[6][1]; //设置年
34 2 for_showh[1]=nowTime[6][0];
35 2 for_showh[2]=nowTime[4][1]; //设置月
36 2 for_showh[3]=nowTime[4][0];
37 2 for_showh[4]=nowTime[3][1]; //设置日
38 2 for_showh[5]=nowTime[3][0];
39 2
40 2 if(!(nowTime[2][1] & 0x08)) //24时制
41 2 for_showl[0]=(nowTime[2][1] & 0x03); //设置时
42 2 else //12时制
43 2 for_showl[0]=(nowTime[2][1] & 0x01); //设置时
44 2 for_showl[1]=nowTime[2][0];
45 2 for_showl[2]=nowTime[1][1]; //设置分
46 2 for_showl[3]=nowTime[1][0];
47 2 for_showl[4]=nowTime[0][1]; //设置秒
48 2 for_showl[5]=nowTime[0][0];
49 2
50 2 week_tempert[2]=nowTime[5][0]; //设置周
51 2 os_wait(K_TMO,4,0);
52 2 }
53 1 }
54
C51 COMPILER V8.16 DS1302 12/25/2008 19:46:19 PAGE 2
55
56
57 /*********************************************************************
58 *向DS1302输入一个字节
59 *函数名称:DS1302_inputByte()
60 *说明:从低位开始传输
61 **********************************************************************/
62 void DS1302_inputByte(u8 byte)
63 {
64 1 u8 i;
65 1 ACC=byte;
66 1
67 1 for(i=8;i>0;i--)
68 1 {
69 2 rtc_io=ACC_0;
70 2 rtc_clk=1; //上升沿写入一位数据
71 2 rtc_clk=0;
72 2 ACC=ACC>>1;
73 2 }
74 1 }
75
76
77 /*********************************************************************
78 *从DS1302读出一个字节
79 *函数名称:DS1302_output()
80 *说明:从地位开始传输
81 **********************************************************************/
82 u8 DS1302_outputByte()
83 {
84 1 u8 i;
85 1
86 1 for(i=8;i>0;i--)
87 1 {
88 2 // rtc_io=1; //P1为准双向口,作为输入前先置高电平
89 2
90 2 ACC=ACC>>1;
91 2 rtc_clk=0; //下降沿读出一位数据
92 2 ACC_7=rtc_io; //???读一次读不到,应该是proteus设置的问题
93 2 ACC_7=rtc_io;
94 2 rtc_clk=1;
95 2 }
96 1 return ACC;
97 1 }
98
99
100 /***************************************************************
101 *写一个字节的时间数据到DS1302的时间寄存器
102 *函数名称:wr_1302()
103 *说明:
104 ****************************************************************/
105 void wr_1302(u8 cmdw,u8 byte)
106 {
107 1 rtc_rst=0; //复位终止当前数据传输,准备新的数据传输
108 1 rtc_clk=0; //SCLK置低为~RST置高做准备
109 1 rtc_rst=1; //启动数据传送
110 1 DS1302_inputByte(cmdw);
111 1 DS1302_inputByte(byte);
112 1 rtc_rst=0;
113 1 }
114
115
116 /****************************************************************
C51 COMPILER V8.16 DS1302 12/25/2008 19:46:19 PAGE 3
117 *从DS1302的时间寄存器读一个字节的时间数据出来
118 *函数名称:rd_1302()
119 *说明:
120 *****************************************************************/
121 u8 rd_1302(u8 cmdw)
122 {
123 1 u8 byte;
124 1
125 1 rtc_rst=0; //复位终止当前数据传输,准备新的数据传输
126 1 rtc_clk=0; //SCLK置低为~RST置高做准备
127 1 rtc_rst=1; //启动数据传送
128 1 DS1302_inputByte(cmdw);
129 1 byte=DS1302_outputByte();
130 1 rtc_rst=0;
131 1
132 1 return byte;
133 1 }
134
135
136 /*****************************************************************
137 *将给定时间设定为当前时间
138 *函数名称:setTime()
139 *说明:
140 ******************************************************************/
141 void setTime(u8 newTime[7][2])
142 {
143 1 u8 i;
144 1 u8 cmdw=0x80; //
145 1 u8 sect;
146 1 wr_1302(0x8e,0x00); //关闭写保护
147 1 for(i=0;i<7;i++)
148 1 {
149 2 if(i==5) //星期不设置,由芯片自动设置
150 2 ;
151 2 else
152 2 {
153 3 sect=newTime[i][1]<<4;
154 3 sect+=newTime[i][0];
155 3 wr_1302(cmdw,sect);
156 3 }
157 2
158 2 cmdw+=2;
159 2 }
160 1 wr_1302(0x8e,0x80); //开启写保护
161 1 }
162
163
164 /****************************************************************
165 *从DS1302读取当前时间
166 *函数名称:getTime()
167 *说明:
168 *****************************************************************/
169 void getTime(u8 nowTime[7][2])
170 {
171 1 u8 i;
172 1 u8 cmdw=0x81;
173 1 u8 sect;
174 1 for(i=0;i<7;i++)
175 1 {
176 2 sect=rd_1302(cmdw);
177 2 nowTime[i][0]=sect & 0x0F;
178 2 nowTime[i][1]=(sect>>4) & 0x0F;
C51 COMPILER V8.16 DS1302 12/25/2008 19:46:19 PAGE 4
179 2
180 2 cmdw+=2;
181 2 }
182 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 322 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -