📄 part.lst
字号:
C51 COMPILER V8.08 PART 06/11/2009 09:37:40 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE PART
OBJECT MODULE PLACED IN part.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE part.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 /********************************************************************
3 时间:2009年3月22日22:36:10
4 ********************************************************************/
5 #ifndef _DS1302_H_
6 #define _DS1302_H_
7
8 sbit DS1302_CLK = P3^0; //实时时钟时钟线引脚
9 sbit DS1302_IO = P3^1; //实时时钟数据线引脚
10 sbit DS1302_RST = P3^2; //实时时钟复位线引脚
11 sbit ACC0 = ACC^0;
12 sbit ACC7 = ACC^7;
13
14 #define Time_24_Hour 0x00 //24时制控制
15 #define Time_Start 0x00 //开始走时
16 #define Time_Stop 0x80 //停止走时
17
18 #define DS1302_SECOND 0x80 //DS1302各寄存器操作命令定义
19 #define DS1302_MINUTE 0x82
20 #define DS1302_HOUR 0x84
21 #define DS1302_WEEK 0x8A
22 #define DS1302_DAY 0x86
23 #define DS1302_MONTH 0x88
24 #define DS1302_YEAR 0x8C
25 #define DS1302_WRITE 0x8E
26 #define DS1302_POWER 0x90
27
28 #define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
29 #define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于将十进制转成BCD码的宏
30
31 typedef struct __SYSTEMTIME__ //定义的时间类型结构体,全部数为十进制
32 {
33 unsigned char Second;
34 unsigned char Minute;
35 unsigned char Hour;
36 unsigned char Week;
37 unsigned char Day;
38 unsigned char Month;
39 unsigned char Year;
40 }SYSTEMTIME;
41
42 //实时时钟写入一字节(内部函数)
43 void DS1302InputByte(unsigned char d)
44 {
45 1 unsigned char i;
46 1 ACC = d;
47 1 for(i=8; i>0; i--)
48 1 {
49 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
50 2 DS1302_CLK = 1;
51 2 DS1302_CLK = 0;
52 2 ACC = ACC >> 1;
53 2 }
54 1 }
55
C51 COMPILER V8.08 PART 06/11/2009 09:37:40 PAGE 2
56 //实时时钟读取一字节(内部函数)
57 unsigned char DS1302OutputByte(void)
58 {
59 1 unsigned char i;
60 1 for(i=8; i>0; i--)
61 1 {
62 2 ACC = ACC >>1; //相当于汇编中的 RRC
63 2 ACC7 = DS1302_IO;
64 2 DS1302_CLK = 1;
65 2 DS1302_CLK = 0;
66 2 }
67 1 return(ACC);
68 1 }
69
70 //写DS1302,ucAddr: DS1302地址, ucData: 要写的数据
71 void Write1302(unsigned char ucAddr, unsigned char ucDa)
72 {
73 1 DS1302_RST = 0;
74 1 DS1302_CLK = 0;
75 1 DS1302_RST = 1;
76 1 DS1302InputByte(ucAddr); // 地址,命令
77 1 DS1302InputByte(ucDa); // 写1Byte数据
78 1 DS1302_CLK = 1;
79 1 DS1302_RST = 0;
80 1 }
81
82 //读取DS1302某地址的数据
83 unsigned char Read1302(unsigned char ucAddr)
84 {
85 1 unsigned char ucData;
86 1 DS1302_RST = 0;
87 1 DS1302_CLK = 0;
88 1 DS1302_RST = 1;
89 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
90 1 ucData = DS1302OutputByte(); // 读1Byte数据
91 1 DS1302_CLK = 1;
92 1 DS1302_RST = 0;
93 1 return(ucData);
94 1 }
95
96 //读取时间函数
97 void DS1302_GetTime(SYSTEMTIME *Time)
98 {
99 1 unsigned char ReadValue;
100 1 ReadValue = Read1302(DS1302_SECOND);
101 1 Time->Second = BCD2DEC(ReadValue&0x7F);
102 1
103 1 ReadValue = Read1302(DS1302_MINUTE);
104 1 Time->Minute = BCD2DEC(ReadValue);
105 1
106 1 ReadValue = Read1302(DS1302_HOUR);
107 1 Time->Hour = BCD2DEC(ReadValue&0x7F);
108 1
109 1 ReadValue = Read1302(DS1302_DAY);
110 1 Time->Day = BCD2DEC(ReadValue);
111 1
112 1 ReadValue = Read1302(DS1302_WEEK);
113 1 Time->Week = BCD2DEC(ReadValue);
114 1
115 1 ReadValue = Read1302(DS1302_MONTH);
116 1 Time->Month = BCD2DEC(ReadValue);
117 1
C51 COMPILER V8.08 PART 06/11/2009 09:37:40 PAGE 3
118 1 ReadValue = Read1302(DS1302_YEAR);
119 1 Time->Year = BCD2DEC(ReadValue);
120 1 }
121
122 //设置时间函数
123 void DS1302_SetTime(SYSTEMTIME *Time)
124 {
125 1 Write1302(DS1302_WRITE,0x00); //关闭写保护
126 1
127 1 Write1302(DS1302_YEAR,DEC2BCD(Time->Year));
128 1 Write1302(DS1302_MONTH,DEC2BCD(Time->Month));
129 1 Write1302(DS1302_WEEK,DEC2BCD(Time->Week));
130 1 Write1302(DS1302_DAY,DEC2BCD(Time->Day));
131 1 Write1302(DS1302_HOUR,DEC2BCD(Time->Hour)|Time_24_Hour);
132 1 Write1302(DS1302_MINUTE,DEC2BCD(Time->Minute));
133 1 Write1302(DS1302_SECOND,DEC2BCD(Time->Second)|Time_Start);
134 1
135 1 Write1302(DS1302_WRITE,0x80); //打开写保护
136 1 }
137
138 //初始化DS1302
139 void DS1302_Initial(void)
140 {
141 1 Write1302(DS1302_WRITE,0x00); //关闭写保护
142 1 Write1302(DS1302_SECOND,Time_Stop);//停止计时
143 1 Write1302(DS1302_HOUR,Time_24_Hour);//24时制
144 1 Write1302(DS1302_POWER,0xA6); //单二极管,4K电阻充电
145 1 // Write1302(DS1302_SECOND,DEC2BCD(Time_Start));
146 1 Write1302(DS1302_WRITE,0x80); //打开写保护
147 1 }
148
149 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 494 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -