📄 ds1302.lst
字号:
C51 COMPILER V8.02 DS1302 03/13/2008 15:39:35 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 //===========================================================
2
3 // 文件名: ds1302.c
4 // 创建日期: 080303
5 // 创建: 神之吻
6 // 试验难度: 入门级试验
7 // 描述: 该文件包含了操作ds1302时钟芯片的底层驱动函数,
8 // 自底向上依次为:
9 // 1.向I/O引脚发送/接受一个字节的数据(可为命令/地址或是数据)
10 // 2.向ds1302芯片的寄存器读/写一个字节数据
11 // 3.设置初始时间以及读出当前时间(秒,分,小时,日,月,星期,年
12 //
13 //------------------------------------------------------------
14
15 //********************************************************
16 //* 头文件
17 //********************************************************
18
19 #include <reg52.h>
20 #include "main.h"
21
22
23 //*******************************************************
24 //* WriteByte
25 //*
26 //*功能描述:该函数是最底层的驱动函数,负责向ds1302的I/0口
27 // 发送一个字节的数据
28 //*输入参数: ByteData,
29 //*返回值:无
30 //*******************************************************
31
32 void WriteByte(uint8 ByteData)
33 {
34 1 uint8 i,DataTmp;
35 1 DataTmp = ByteData; //缓存数据
36 1 //NOP
37 1 //由低位(bit0)到高位(bit7)依次向I/O引脚写入数据
38 1 for(i = 0;i < 8;i ++)
39 1 {
40 2 SCLK = 0;
41 2 //NOP //此处延时函数待定,手册给出的最小值为100ns
42 2 //在SCLK上升沿之前,向I/O口准备好数据
43 2 if((DataTmp & 0x01) == 1)
44 2 IO = 1;
45 2 else
46 2 IO = 0;
47 2 //NOP //延时建立时间tDC,手册上给出最小值位50ns
48 2 SCLK = 1; //SCLK的上升沿向写入字节中的一位数据
49 2 DataTmp >>= 1; //右移一位,以便下一位写入
50 2 }
51 1 }
52
53 //*******************************************************
54 //* ReadByte
55 //*
C51 COMPILER V8.02 DS1302 03/13/2008 15:39:35 PAGE 2
56 //*功能描述:该函数是最底层的驱动函数,负责从ds1302的I/0口
57 // 接收一个字节的数据
58 //*输入参数:无
59 //*返回值:读出的一个字节数据
60 //*******************************************************
61 uint8 ReadByte()
62 {
63 1 uint8 i,DataTmp;
64 1 DataTmp = 0; //数据缓冲初始化为0
65 1 for(i = 0;i < 8;i ++)
66 1 {
67 2 SCLK = 0; //下降沿触发I/O口读出一位数据
68 2 //NOP //延迟至少Tcdd时间,以等待输出数据有效,手册上给出Tcdd最大值为200ns
69 2 DataTmp += ((uint8)IO<<7); //读出I/O输出的一位数据,置于dataTmp的最高位(由于数据是按bit0~bit7读出)
70 2 DataTmp >>= 1; //右移一位,以便存储读出后续数据
71 2 SCLK = 1;
72 2 }
73 1 return DataTmp; //返回读出的一个字节数据
74 1 }
75
76 //*******************************************************
77 //* WriteReg
78 //*
79 //*功能描述: 1.该函数通过调用最底层驱动函数WriteByte,向ds1302
80 // 的RAM中写入一个字节数据
81 // 2.写入方法为:在连续的十六个SCLK时钟内,
82 // 前八个时钟周期写入一个字节的命令/地址,后八个
83 // 时钟周期写入一个字节的数据
84 // 3.每一位在时钟周期的上升沿写入
85 //*输入参数:
86 // Addr:待写入寄存器的地址
87 // Data:待写入的一个字节数据
88 //*返回值:无
89 //*******************************************************
90 void WriteReg(uint8 Addr,uint8 Data)
91 {
92 1 RST = 1; //拉高RST,以使能读写操作
93 1 //NOP //延时tCC后方可拉高SCLK,手册上给出Vcc=5V的条件下,tCC的最小值为1us
94 1 WriteByte(Addr); //写入地址
95 1 WriteByte(Data); //写入数据
96 1 RST = 0; //RST复位为0,以便下一次读写操作
97 1 SCLK = 0; //SCLK复位为0,以便下一次读写操作
98 1 }
99
100 //*******************************************************
101 //* ReadReg
102 //*
103 //*功能描述: 1.该函数通过调用最底层驱动函数WriteByte和ReadByte,从ds1302
104 // 的RAM中读出一个字节数据
105 // 2.写入方法为:在连续的十六个SCLK时钟内,
106 // 前八个时钟周期写入一个字节的命令/地址,后八个
107 // 时钟周期写入一个字节的数据
108 // 3.其中地址在前八个时钟周期上升沿写入,数据在后八个
109 // 时钟周期的下降沿读出
110 //*输入参数:
111 // Addr:待读出数据的目的寄存器的地址
112 //*返回值: Data:读出的一个字节数据
113 //*******************************************************
114 uint8 ReadReg(uint8 Addr)
115 {
116 1 uint8 ReadData; //缓冲读出的一个字节数据
117 1 RST = 1; //拉高RST,以使能读写操作
C51 COMPILER V8.02 DS1302 03/13/2008 15:39:35 PAGE 3
118 1 //NOP //延时tCC后方可拉高SCLK,手册上给出Vcc=5V的条件下,tCC的最小值为1us
119 1 WriteByte(Addr); //写入地址
120 1 ReadData = ReadByte(); //读出寄存器内容
121 1 RST = 0; //RST复位为0,以便下一次读写操作
122 1 SCLK = 0; //SCLK复位为0,以便下一次读写操作
123 1 return ReadData; //返回读出数据
124 1 }
125
126 //*******************************************************
127 //* SetTime
128 //*
129 //*功能描述: 1.该函数通过调用最驱动函数WriteReg,向ds1302的时间/日历寄存器
130 // 中写入初始化时间(写入顺序为秒 分 时 日 月 星期 年)
131 // 2.写入方法为:先写控制寄存器,将其WP置为0,以解除写保护,然后依次
132 // 写入秒 分 时 日 月 星期 年寄存器
133 //*输入参数:
134 // *TimePtr:指向时间信息区域首地址的指针(格式为秒 分 时 日 月 星期 年)
135 //*返回值: 无
136 //*******************************************************
137 void SetTime(uint8* TimePtr)
138 {
139 1 uint8* TimePtrTmp;
140 1 uint8 CtrRegAddr = 0x8E; //控制寄存器地址,RD/WR位(Bit0)为0,表明对该寄存器进行写操作,
141 1 uint8 CtrRegData = 0x00; //写入控制寄存器的数据,WP为0,以解除写保护
142 1 uint8 InitRegAddr = 0x80; //初始寄存器地址,即秒寄存器地址,RD/WR位(Bit0)为0,表明对该寄存器进行写操作
143 1 uint8 i;
144 1 TimePtrTmp = TimePtr;
145 1 RST = 0;
146 1 WriteReg(CtrRegAddr,CtrRegData); //写控制寄存器,以解除写保护
147 1 //启动写操作(顺序为秒 分 时 日 月 星期 年)
148 1 for( i = 0;i < 7;i ++)
149 1 {
150 2 WriteReg(InitRegAddr,*TimePtrTmp); //将时间信息写入当前寄存器
151 2 InitRegAddr += 0x02; //指向下一个时间/日历寄存器
152 2 TimePtrTmp += 1; //指向下一个数据
153 2 }
154 1 }
155
156 //*******************************************************
157 //* ReadTime
158 //*
159 //*功能描述: 1.该函数通过调用最驱动函数ReadReg,从ds1302的时间/日历寄存器
160 // 中读出当前时间(读出顺序为秒 分 时 日 月 星期 年)
161 // 2.读方法为:依次读出秒 分 时 日 月 星期 年寄存器
162 //*输入参数:
163 // *TimePtr:指向时间信息存储区域首地址的指针(格式为秒 分 时 日 月 星期 年)
164 //*返回值: 无
165 //*******************************************************
166 void ReadTime(uint8 *TimePtr)
167 {
168 1 uint8* TimePtrTmp;
169 1 uint8 InitRegAddr = 0x81; //初始寄存器地址,即秒寄存器地址,RD/WR位(Bit0)为1,表明对该寄存器进行读操作
170 1 uint8 i;
171 1 TimePtrTmp = TimePtr;
172 1 RST = 0; //读写之前将RST复位为0
173 1 //启动读操作(顺序为秒 分 时 日 月 星期 年)
174 1 for( i = 0;i < 7;i ++)
175 1 {
176 2 *TimePtrTmp = ReadReg(InitRegAddr); //读出当前寄存器的值
177 2 InitRegAddr += 0x02; //指向下一个时间/日历寄存器
178 2 TimePtrTmp += 1; //指向下一个数据的存储区域
179 2 }
C51 COMPILER V8.02 DS1302 03/13/2008 15:39:35 PAGE 4
180 1 }
181
182
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 150 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
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 + -