📄 ds1302.lst
字号:
C51 COMPILER V8.02 DS1302 10/27/2008 20:53:15 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 完成日期:2008-10-27
3 */
4 #include<reg52.h>
5 #define uint unsigned int
6 #define uchar unsigned char
7 sbit SCLK=P3^3;
8 sbit IO=P3^4;
9 sbit RST=P3^5;
10 sbit BIT7=ACC^7; //将数据放入ACC便于位寻址,如果用变量没法位寻址
11 sbit BIT0=ACC^0;
12 uchar code table[]=
13 {0x3f,0x06,0x5b,0x4f,0x66,
14 0x6d,0x7d,0x07,0x7f,0x6f};
15 uchar curtime[7];
16 uchar pda[7];
17
18 /*延时程序*/
19 void delay(uint z)
20 {
21 1 uint x,y;
22 1 for(x=z;x>0;x--)
23 1 for(y=110;y>0;y--);
24 1 }
25
26 /*八位数据写入*/
27 void writebyte(uchar dat)
28 {
29 1 uchar i;
30 1 ACC=dat;//将要写入的数放入ACC
31 1 RST=1; //启动数据传送
32 1 for(i=8;i>0;i--)//循环八次,写入八位数据,从低位到高位
33 1 {
34 2 IO=BIT0; //将ACC^0的值赋给时钟数据线
35 2 SCLK=0;
36 2 SCLK=1; //在时钟线的上升沿写入一位数据
37 2 ACC=ACC>>1; //将高一位数据移到ACC^0
38 2 }
39 1 }
40
41 /*八位数据读出*/
42 uchar readbyte(void)
43 {
44 1 uchar i;
45 1 RST=1;//启动数据传送
46 1 for(i=8;i>0;i--) //读出八位数据,从低位到高位
47 1 {
48 2 ACC=ACC>>1; //将前一下降沿读出的数据右移一位,从而该次读出的数放入ACC^7
49 2 IO=1; //P1口输入之前置1
50 2 SCLK=1;
51 2 SCLK=0; //在时钟线的下降升沿读出一位数据
52 2 BIT7=IO;
53 2 }
54 1 return(ACC);
55 1 }
C51 COMPILER V8.02 DS1302 10/27/2008 20:53:15 PAGE 2
56
57 /*将指令或数据写入对应寄存器*/
58 void writereg(uchar addr,uchar dat)
59 {
60 1 RST=0;
61 1 SCLK=0;//只有在SCLK为低电平时,才能将RST置为高电平
62 1 delay(1);
63 1 RST=1;
64 1 writebyte(addr);
65 1 writebyte(dat);
66 1 SCLK=1;
67 1 RST=0;
68 1 delay(1);
69 1 RST=1;
70 1 IO=1;
71 1 }
72
73 /*读出对应寄存器*/
74 uchar readreg(uchar addr)
75 {
76 1 uchar dat;
77 1 RST=0;
78 1 SCLK=0;
79 1 delay(1);
80 1 RST=1;
81 1 writebyte(addr);
82 1 dat=readbyte();
83 1 RST=0;
84 1 return(dat);
85 1 }
86
87 /*设置时间初值*/
88 void settime(uchar *pda)
89 {
90 1 uchar i;
91 1 uchar addr=0x80;//偶数为写操作
92 1 writereg(0x8e,0x00);//将控制寄存器值设为零,最高位WP=0允许写
93 1 for(i=7;i>0;i--) //将7个时间初值写入对应寄存器
94 1 {
95 2 writereg(addr,*pda); //写对应时钟寄存器的值
96 2 pda++;
97 2 addr+=2;
98 2 }
99 1 writereg(0x8e,0x80); //写保护,防止干扰影响时间值
100 1 }
101
102 /*读取当前时间值*/
103 void gettime(uchar curtime[])
104 {
105 1 uchar i,j;
106 1 uchar addr=0x81; //奇数为读操作
107 1 bdata uchar sec; //可位寻址内部数据存储器,允许位与字节混合访问
108 1 for(i=0;i<7;i++)
109 1 {
110 2 curtime[i]=readreg(addr);//读对应时钟寄存器的值
111 2 sec=curtime[i];
112 2 j=sec>>4;//将BCD码转化成为对应十进制数
113 2 j*=10;
114 2 sec=sec&0x0f;
115 2 sec+=j;
116 2 curtime[i]=sec;
117 2 addr+=2;
C51 COMPILER V8.02 DS1302 10/27/2008 20:53:15 PAGE 3
118 2 }
119 1 }
120
121 /*6位数码管显示*/
122 void show(uchar *curtime)
123 {
124 1 P1=0xfe;
125 1 P0=table[curtime[0]%10];
126 1 delay(3);
127 1 P1=0xfd;
128 1 P0=table[curtime[0]/10];
129 1 delay(3);
130 1 P1=0xfb;
131 1 P0=table[curtime[1]%10];
132 1 delay(3);
133 1 P1=0xf7;
134 1 P0=table[curtime[1]/10];
135 1 delay(3);
136 1 P1=0xef;
137 1 P0=table[curtime[2]%10];
138 1 delay(3);
139 1 P1=0xdf;
140 1 P0=table[curtime[2]/10];
141 1 delay(3);
142 1 }
143
144 /*主程序*/
145 void main()
146 {
147 1 settime(pda);
148 1 while(1)
149 1 {
150 2 gettime(curtime);
151 2 show(curtime);
152 2 }
153 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 414 ----
CONSTANT SIZE = 10 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 10
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 + -