📄 ds1302.lst
字号:
C51 COMPILER V8.08 DS1302 04/19/2008 21:34:32 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg52.h> //头文件
2 #include <stdio.h>
3
4 #define uchar unsigned char //宏定义
5
6 sbit SCLK = P1^3; //声明接口引脚
7 sbit I_O = P1^4;
8 sbit RSTB = P1^5;
9
10 void ResetDS1302(); //复位函数声明
11 void InitDS1302(); // DS1302初始化函数声明
12 void WriteClkByte(); //时钟字节写入函数声明
13 void WriteRamByte(); // RAM字节写入函数声明
14 uchar ReadByteDS1302(); //字节读取函数声明
15 void WriteByteDS1302(uchar); //字节写入函数声明
16 void Display(uchar); //显示时钟寄存器内容函数声明
17 void BurstReadRAM(); //多字节突发方式读取RAM函数声明
18 void BurstWriteRAM(); //多字节突发方式写入RAM函数声明
19
20 void main (void) //主函数
21 {
22 1 uchar Key, Key1,Key2;
23 1 SCON = 0x50; //设置串行口: 方式 1, 8位UART, 允许接收
24 1 TMOD |= 0x20; //设置定时器T1, 方式 2, 8位自动重装
25 1 PCON =0x80; //设置SMOD=1
26 1 TL1 =0xF4; //波特率4800bit/s,初值
27 1 TH1 =0xF4;
28 1 TR1 = 1; //开启定时器1
29 1 TI = 1;
30 1
31 1 printf("***********AT89S52 CONTROL DS1302***********\n\n");
32 1 printf("Initialize the DS1302.\n");
33 1 InitDS1302(); //初始化DS1302
34 1 while (1)
35 1 {
36 2 printf("\nEnter DS1302 Menu Selection:");
37 2 printf("c or C: Run the Clock Routine\n");
38 2 printf("i or I: Initialize the DS1302\n");
39 2 printf("r or R: Run the RAM Routine\n");
40 2
41 2 Key = _getkey(); //获取输入字符
42 2 switch(Key)
43 2 {
44 3 case 'c': //执行时钟操作
45 3 case 'C':
46 3 printf("\rRun the Clock Routine\n");
47 3
48 3 Key1 = _getkey(); //获取输入字符
49 3 switch(Key1)
50 3 {
51 4 case 'd': //显示
52 4 case 'D':
53 4 Display(1);
54 4 break;
55 4 case 'w': //时钟字节写入
C51 COMPILER V8.08 DS1302 04/19/2008 21:34:32 PAGE 2
56 4 case 'W':
57 4 WriteClkByte();
58 4 break;
59 4 }
60 3 break;
61 3
62 3 case 'i': //初始化DS1302
63 3 case 'I':
64 3 InitDS1302();
65 3 break;
66 3
67 3 case 'r': //RAM操作
68 3 case 'R':
69 3 printf("\rRun the RAM Routine\n");
70 3
71 3 Key2 = _getkey(); //获取输入字符
72 3 switch(Key2)
73 3 {
74 4 case 'b': //RAM字节写入
75 4 case 'B':
76 4 WriteRamByte();
77 4 break;
78 4 case 'r': //多字节突发方式读取RAM
79 4 case 'R':
80 4 BurstReadRAM();
81 4 break;
82 4 case 'w': //多字节突发方式写入RAM
83 4 case 'W':
84 4 BurstWriteRAM();
85 4 break;
86 4 }
87 3 break;
88 3 }
89 2 }
90 1 }
91
92 void ResetDS1302()
93 {
94 1 SCLK = 0;
95 1 RSTB = 0;
96 1 RSTB = 1;
97 1 }
98
99 uchar ReadByteDS1302()
100 {
101 1 uchar i;
102 1 uchar RByte;
103 1 uchar TempByte;
104 1
105 1 RByte = 0x00;
106 1 I_O = 1;
107 1 for(i=0; i<8; ++i) //逐位读取字节数据
108 1 {
109 2 SCLK = 1; //时钟操作
110 2 SCLK = 0;
111 2 TempByte = (uchar)I_O;
112 2 TempByte <<= 7; //移位
113 2 RByte >>= 1;
114 2 RByte |= TempByte;
115 2 }
116 1 return RByte; //返回结果
117 1 }
C51 COMPILER V8.08 DS1302 04/19/2008 21:34:32 PAGE 3
118
119
120
121 void WriteByteDS1302(uchar W_Byte)
122 {
123 1 uchar i;
124 1 for(i = 0; i < 8; ++i) //循环逐位写入
125 1 {
126 2 I_O = 0;
127 2 if(W_Byte & 0x01) I_O = 1;
128 2 SCLK = 0; //时钟操作
129 2 SCLK = 1;
130 2 W_Byte >>= 1; //移位
131 2 }
132 1 }
133
134
135
136 void WriteClkByte()
137 {
138 1 uchar Address;
139 1 uchar Data;
140 1
141 1 printf("\nWrite Clock Function:");
142 1 printf("\nWrite Clock ADDRESS:");
143 1 scanf("%bu", &Address); //获取地址
144 1 printf("\nWrite Clock DATA:");
145 1 scanf("%bx", &Data); //获取数据
146 1
147 1 Address = ((Address * 2) | 0x80); //时钟数据写入命令
148 1 ResetDS1302(); //复位DS1302
149 1 WriteByteDS1302(Address); //写地址
150 1 WriteByteDS1302(Data); //写数据
151 1 ResetDS1302(); //复位DS1302
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -