You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

137 lines
4.6 KiB

C51 COMPILER V9.56.0.0 DS1302 05/01/2022 12:24:18 PAGE 1
C51 COMPILER V9.56.0.0, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ds1302.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2)
line level source
1 #include"ds1302.h"
2
3 //---DS1302写入和读取时分秒的地址命令---//
4 //---秒分时日月周年 最低位读写位;-------//
5 uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
6 uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
7
8 //---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
9 //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
10
11 uchar TIME[7] = {0X00, 0X24, 0x12, 0x01, 0x05, 0x07, 0x22};
12
13
14 void Ds1302Write(uchar addr, uchar dat)
15 {
16 1 uchar n;
17 1 RST = 0;
18 1 _nop_();
19 1
20 1 SCLK = 0;//先将SCLK置低电平。
21 1 _nop_();
22 1 RST = 1; //然后将RST(CE)置高电平。
23 1 _nop_();
24 1
25 1 for (n=0; n<8; n++)//开始传送八位地址命令
26 1 {
27 2 DSIO = addr & 0x01;//数据从低位开始传送
28 2 addr >>= 1;
29 2 SCLK = 1;//数据在上升沿时,DS1302读取数据
30 2 _nop_();
31 2 SCLK = 0;
32 2 _nop_();
33 2 }
34 1 for (n=0; n<8; n++)//写入8位数据
35 1 {
36 2 DSIO = dat & 0x01;
37 2 dat >>= 1;
38 2 SCLK = 1;//数据在上升沿时,DS1302读取数据
39 2 _nop_();
40 2 SCLK = 0;
41 2 _nop_();
42 2 }
43 1
44 1 RST = 0;//传送数据结束
45 1 _nop_();
46 1 }
47
48 uchar Ds1302Read(uchar addr)
49 {
50 1 uchar n,dat,dat1;
51 1 RST = 0;
52 1 _nop_();
53 1
54 1 SCLK = 0;//先将SCLK置低电平。
55 1 _nop_();
C51 COMPILER V9.56.0.0 DS1302 05/01/2022 12:24:18 PAGE 2
56 1 RST = 1;//然后将RST(CE)置高电平。
57 1 _nop_();
58 1
59 1 for(n=0; n<8; n++)//开始传送八位地址命令
60 1 {
61 2 DSIO = addr & 0x01;//数据从低位开始传送
62 2 addr >>= 1;
63 2 SCLK = 1;//数据在上升沿时,DS1302读取数据
64 2 _nop_();
65 2 SCLK = 0;//DS1302下降沿时,放置数据
66 2 _nop_();
67 2 }
68 1 _nop_();
69 1 for(n=0; n<8; n++)//读取8位数据
70 1 {
71 2 dat1 = DSIO;//从最低位开始接收
72 2 dat = (dat>>1) | (dat1<<7);
73 2 SCLK = 1;
74 2 _nop_();
75 2 SCLK = 0;//DS1302下降沿时,放置数据
76 2 _nop_();
77 2 }
78 1
79 1 RST = 0;
80 1 _nop_(); //以下为DS1302复位的稳定时间,必须的。
81 1 SCLK = 1;
82 1 _nop_();
83 1 DSIO = 0;
84 1 _nop_();
85 1 DSIO = 1;
86 1 _nop_();
87 1 return dat;
88 1 }
89
90 void Ds1302Init()
91 {
92 1 uchar n;
93 1 Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
94 1 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
95 1 {
96 2 //Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
97 2 }
98 1 Ds1302Write(0x8E,0x80); //打开写保护功能
99 1 }
100
101 void Ds1302ReadTime()
102 {
103 1 uchar n;
104 1 for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
105 1 {
106 2 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
107 2 }
108 1 }
109
110
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 169 ----
CONSTANT SIZE = 14 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
C51 COMPILER V9.56.0.0 DS1302 05/01/2022 12:24:18 PAGE 3
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)