📄 ds1302.lst
字号:
C51 COMPILER V7.01 DS1302 11/14/2007 11:43:08 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************************************/
2 /* 读入或写入 DATE(0--6) ,分别是:秒,分,时,日,月,年年 . */
3 /* 例如 写入 2003.02.14 08:34:12 (晶振11.0592MHz) */
4 /* date[0]=12;date[1]=34;date[2]=8;date[3]=14;date[4]=2;date[5]=3; */
5 /*********************************************************************************************/
6 #include <reg52.h>
7 #include <intrins.h>
8 /*-------------------------------------------------------------------------------------------*/
9 #define uchar unsigned char
10 #define uint unsigned int
11 /*-------------------------------------------------------------------------------------------*/
12 sbit SCLK=P1^0;
13 sbit IO=P1^1;
14 sbit REST=P1^2;
15 /*********************************************************************************************/
16 void date_write(uchar con1) // 串行写入
17 {
18 1 uchar i;
19 1 /*-------------------------------------------------*/
20 1 REST=1; // 片选
21 1 /*-------------------------------------------------*/
22 1 for (i=1;i<=8;i++) // 一次送8 BIT
23 1 {
24 2 SCLK=0;
25 2 if ((con1 & 0x01)==1) IO=1;else IO=0;
26 2 con1=_cror_(con1,1); // 移位
27 2 SCLK=1;
28 2 }
29 1 }
30 /*---------------------------------------------------------------------------*/
31 uchar data_read() // 串行读出
32 {
33 1 uchar j;
34 1 uchar data_ol,data_oh;
35 1 /*-------------------------------*/
36 1 REST=1;
37 1 /*-------------------------------*/
38 1 data_ol=0;
39 1 for(j=1;j<=4;j++) // 收低4 位
40 1 {
41 2 SCLK=0;
42 2 if (IO==1) data_ol |=0x10;
43 2 data_ol=_cror_(data_ol,1);
44 2 SCLK=1;
45 2 }
46 1 /*-----------------------------------------*/
47 1 data_oh=0;
48 1 for (j=1;j<=4;j++) // 收高4 位
49 1 {
50 2 SCLK=0;
51 2 if (IO==1) data_oh |=0x10;
52 2 data_oh=_cror_(data_oh,1);
53 2 SCLK=1;
54 2 }
55 1 /*-------------------------------*/
C51 COMPILER V7.01 DS1302 11/14/2007 11:43:08 PAGE 2
56 1 return(data_ol+data_oh*10); // 变成二进制数,送入数组
57 1 }
58 /*============================================================================*/
59 void write_ds1302(uchar *date) // 写入数据
60 {
61 1 uchar n;
62 1 /*--------------------------------------------------------------*/
63 1 if (date[0]>60) date[0]=0; // 限制在0秒
64 1 if (date[1]>60) date[1]=1; // 限制在1分
65 1 if (date[2]>24) date[2]=1; // 限制在1点
66 1 if ((date[3]>31)||(date[3]==0)) date[3]=1; // 限制1日
67 1 if ((date[4]>12)||(date[4]==0)) date[4]=1; // 限制在1月
68 1 /*--------------------------------------------------------------*/
69 1 /* 下一位表示星期,我们不用,再下位表示年,再补0 */
70 1 /*--------------------------------------------------------------*/
71 1 date_write(0x8e); // 写允许
72 1 date_write(0x00);
73 1 REST=0;
74 1 SCLK=0;
75 1 /*--------------------------------------------------------------*/
76 1 for (n=0;n<=6;n++)
77 1 {
78 2 date[n]=(date[n]/10)*0x10+date[n]%10; //高于10的倍数上移至高四位
79 2 }
80 1 /*--------------------------------------------------------------*/
81 1 date_write(0xbe); //串行发送连续写入命令
82 1 /*--------------------------------------------------------------*/
83 1 for (n=0;n<=4;n++) date_write(date[n]); //先不写星期和年
84 1 date_write(1); //星期一
85 1 date_write(date[5]); //星期写入年
86 1 date_write(0); //星期写入年
87 1 /*--------------------------------------------------------------*/
88 1 REST=0;
89 1 SCLK=0;
90 1 /*--------------------------------------------------------------*/
91 1 date_write(0x8e); // 写禁止
92 1 date_write(0x80);
93 1 REST=0;
94 1 SCLK=0;
95 1 /*--------------------------------------------------------------*/
96 1 }
97 /*============================================================================*/
98 void read_ds1302(uchar *date) //读到时间
99 {
100 1 uchar n;
101 1 /*--------------------------------------------------------------*/
102 1 date_write(0xbf);
103 1 for (n=0;n<=4;n++) date[n]=data_read(); //读前四位
104 1 n=data_read();
105 1 date[5]=data_read(); //读年(加上2000才是真实年份)
106 1 n=data_read();
107 1 /*--------------------------------------------------------------*/
108 1 REST=0;
109 1 SCLK=0;
110 1 /*--------------------------------------------------------------*/
111 1 }
112 /*----------------------------------------------------------------------------*/
113 void reset_ds1302() //初始化1302
114 {
115 1 /*--------------------------------------------------------------*/
116 1 date_write(0x8e); // 写允许
117 1 date_write(0x00);
C51 COMPILER V7.01 DS1302 11/14/2007 11:43:08 PAGE 3
118 1 REST=0;
119 1 SCLK=0;
120 1 /*--------------------------------------------------------------*/
121 1 date_write(0x80); // 启动震荡器
122 1 date_write(0x00);
123 1 REST=0;
124 1 SCLK=0;
125 1 /*--------------------------------------------------------------*/
126 1 date_write(0x90); // 设置备用电池充电电流
127 1 date_write(0xa5);
128 1 REST=0;
129 1 SCLK=0;
130 1 /*--------------------------------------------------------------*/
131 1 date_write(0x8e); // 写禁止
132 1 date_write(0x80);
133 1 REST=0;
134 1 SCLK=0;
135 1 /*--------------------------------------------------------------*/
136 1 }
137 /*********************************************************************************************/
138
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 446 ----
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -