📄 time.lst
字号:
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE TIME
OBJECT MODULE PLACED IN time.OBJ
COMPILER INVOKED BY: C:\TOOLS\Keil\C51\BIN\C51.EXE time.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <intrins.h>
2 #include<AT89x52.h>
3 #define Uchar unsigned char
4 #define Uint unsigned int
5 #define SomeNOP(); _nop_();_nop_();_nop_();
6 /*I2C要用到的口线定意*/
7 sbit SDA = P2^7;
8 sbit SCL = P2^6;
9
10 //LCD的口线
11 sbit E=P3^5;
12 sbit RW=P3^6;
13 sbit RS=P3^7;
14 //8字LED的连接方法
15 //P0.7 P.06 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
16 // H G F E D C B A
17
18 unsigned char code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
19 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //数码管段码表
20
21 Uchar idata led[6];
22 Uchar ledcount;
23
24 /*定义一个接收的数组*/
25 Uchar idata recdata[8]; //
26 Uchar idata clockdata[7]; //系统时钟
27 Uchar pcpointer,timecount,*gettimeip; //用于设定从PC接收和发的指针
28 Uchar bdata myflag;
29 sbit newtimebit = myflag^0;
30 sbit recpcokbit = myflag^1;
31 //I2C驱动要用到的一些函数
32 void Delay_1ms(Uchar time);
33 void I2CStart(void);
34 void I2CStop(void);
35 void ACK(void); //Acknowledge信号
36 void NACK(void); //没有Acknowledge信号
37 void AutoACK(void); //在一定的时间内自动确定ACK的信号//
38 void GetPCF8563(Uchar idata *Getip);
39 void SetPCF8563(Uchar idata *Setip);
40 Uchar ReadPCF8563(Uchar AddrePCF);
41 void WritePCF8563(Uchar AddrePCF,Uchar PCFdata);
42
43 void time0(void);
44 void rs232(void);
45
46 void main(void)
47 {
48 1 E=0; //取消LCD对LED的影响
49 1 RW=0;
50 1 RS=1;
51 1 TH0 = 0xf8; //2ms
52 1 TL0 = 0xce;
53 1 TH1 = 0xfd; //以9600Baud的速率和PC机通信
54 1 TL1 = 0xfd;
55 1 TMOD = 0x21; //Time0为16位,Time1为8位常数自装
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 2
56 1 SCON = 0x50;
57 1 IP = 0x10;
58 1 TR0 = 1;
59 1 TR1 = 1;
60 1 ledcount=0x00;
61 1 IE = 0x92;
62 1 led[0]=4;led[1]=5;led[2]=6;led[3]=7;led[4]=8;led[5]=9;
63 1 while(1){}
64 1 }
65
66
67 void time0(void) interrupt 1
68 {
69 1 TH0 = 0xf8;
70 1 TL0 = 0xce;
71 1
72 1 timecount--;
73 1 if(timecount==0)
74 1 {
75 2 timecount = 250;
76 2 gettimeip=&clockdata[0];
77 2 GetPCF8563(gettimeip);
78 2 led[0]=clockdata[0]&0x0f;
79 2 led[1]=(clockdata[0]>>4)&0x0f;
80 2 led[2]=clockdata[1]&0x0f;
81 2 led[3]=(clockdata[1]>>4)&0x0f;
82 2 led[4]=clockdata[2]&0x0f;
83 2 led[5]=(clockdata[2]>>4)&0x0f;
84 2 }
85 1
86 1 P2=0xff;
87 1 ledcount++;
88 1 if(ledcount==0x06){ledcount=0x00;}
89 1 P0=ledcode[led[ledcount]];
90 1 switch(ledcount)
91 1 {
92 2 case 0 : P2=0xdf;break;
93 2 case 1 : P2=0xef;break;
94 2 case 2 : P2=0xf7;P0=P0&0x7f;break;
95 2 case 3 : P2=0xfb;break;
96 2 case 4 : P2=0xfd;P0=P0&0x7f;break;
97 2 case 5 : P2=0xfe;break;
98 2 }
99 1
100 1 }
101
102
103 //以下为串行口中断程序,用于接收串行数据
104 void rs232(void) interrupt 4
105 {
106 1 if(RI==1)
107 1 {
108 2
109 2 //原输入格式为AA 秒,分,时 日,星期,月年
110 2 if (SBUF==0xaa)
111 2 {
112 3 newtimebit=1;
113 3 pcpointer=0;
114 3 }
115 2 RI = 0;
116 2 recdata[pcpointer++]=SBUF;
117 2 if(pcpointer==8)
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 3
118 2 {
119 3 pcpointer =0;
120 3 recpcokbit =1; //指针还原,置收到完整的控制码
121 3 }
122 2 }
123 1 else
124 1 {
125 2 TI = 0;
126 2 }
127 1 }
128
129
130 /*----------------------I2C要用到的一些子程序---------------------------------*/
131 /***********************以下为一些用到的子程序*********************************/
132 /*延时子程序*/
133 void Delay_1ms(Uchar time)
134 {
135 1 Uchar j;
136 1 while(time--)
137 1 {
138 2 for(j=163;j!=0;j--)
139 2 {;}
140 2 }
141 1 }
142
143 /*I2C的起动程序*/
144 void I2CStart(void)
145 {
146 1 SDA = 1;
147 1 SomeNOP();
148 1 SCL = 1;
149 1 SomeNOP();
150 1 SDA = 0;
151 1 SomeNOP();
152 1 SCL = 0;
153 1 SomeNOP();
154 1 }
155
156 /*I2C的停止程序*/
157 void I2CStop(void)
158 {
159 1 SDA = 0;
160 1 SomeNOP();
161 1 SCL = 1;
162 1 SomeNOP();
163 1 SDA = 1;
164 1 SomeNOP();
165 1 }
166
167 void ACK(void) //Acknowledge信号
168 {
169 1 SDA = 0;
170 1 SomeNOP();
171 1 SCL = 1;
172 1 SomeNOP();
173 1 SCL = 0;
174 1 SomeNOP();
175 1 }
176
177 void NACK(void) //没有Acknowledge信号
178 {
179 1 SDA = 1;
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 4
180 1 SomeNOP();
181 1 SCL = 1;
182 1 SomeNOP();
183 1 SCL = 0;
184 1 SomeNOP();
185 1 }
186
187 void AutoACK(void) //在一定的时间内自动确定ACK的信号//
188 {
189 1 Uchar i = 0;
190 1 SCL = 1;
191 1 SomeNOP();
192 1 while((SDA == 1)&&(i<255))i++;
193 1 SCL = 0;
194 1 SomeNOP();
195 1 }
196
197
198 /*I2C写数据程序(向数据线上写一个BYTE)*/
199 void Writex(Uchar j)
200 {
201 1 Uchar i,temp;
202 1 temp = j;
203 1 for (i=0;i<8;i++) //串行移位,先送高位,再送低位//
204 1 {
205 2 temp =temp<<1;
206 2 SCL = 0;
207 2 SomeNOP();
208 2 SDA = CY;
209 2 SomeNOP();
210 2 SCL = 1;
211 2 SomeNOP();
212 2 }
213 1 SCL = 0;
214 1 SomeNOP();
215 1 SDA = 1;
216 1 SomeNOP();
217 1 }
218 /*I2C读数据程序(从数据线上读出一个BYTE)返回值为读出的数据(BYTE型)*/
219 Uchar Readx(void)
220 {
221 1 Uchar i,j,k=0;
222 1 SCL = 0;
223 1 SomeNOP();
224 1 SDA = 1;
225 1 for (i=0;i<8;i++) // 串行移位,先读出高位,后读出低位//
226 1 {
227 2 SomeNOP();
228 2 SCL = 1;
229 2 SomeNOP();
230 2 if(SDA ==1) j=1;
231 2 else j=0;
232 2 k =(k<<1)|j;
233 2 SCL = 0;
234 2 }
235 1 SomeNOP();
236 1 return(k); //返回读出的值//
237 1 }
238
239
240
241 //*******************以下为对PCF8383/PCF8563的读写子程序********************//
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 5
242 //**********时钟片device address的写地址为0A2H,读地址为0A3H******************//
243 /*对PCF8563的时钟读到内存中,以IDATA指针开始的连续7个BYTE*/
244 //****读出的内容依次为“秒,分钟,小时,日,星期,月/世纪,年********************//
245 //PCF8585依次为“秒,分钟,小时,日,星期月
246 void GetPCF8563(Uchar idata *Getip)
247 {
248 1 Uchar i;
249 1 I2CStart();
250 1 Writex(0xA2);
251 1 AutoACK();
252 1 Writex(0x02); //从秒地址开始读//
253 1 AutoACK();
254 1 I2CStart();
255 1 Writex(0xA3);
256 1 AutoACK();
257 1 for(i=0;i<7;i++)
258 1 {
259 2 *Getip = Readx();
260 2 Getip = Getip++;
261 2 ACK();
262 2 }
263 1 *Getip = Readx();
264 1 NACK();
265 1 I2CStop();
266 1 Delay_1ms(0);
267 1 }
268
269
270 /*设定8563/8583的时间内容依次为“秒,分钟,小时,日,星期,月/世纪,年*/
271 //PCF8585依次为“秒,分钟,小时,日,星期月
272 void SetPCF8563(Uchar idata *Setip)
273 {
274 1 Uchar i;
275 1 I2CStart();
276 1 Writex(0xA2);
277 1 AutoACK();
278 1 Writex(0x02);
279 1 AutoACK();
280 1 for(i=0;i<7;i++)
281 1 {
282 2 Writex(*Setip++);
283 2 AutoACK();
284 2 }
285 1 I2CStop();
286 1 }
287
288 Uchar ReadPCF8563(Uchar AddrePCF)
289 {
290 1 Uchar i;
291 1 I2CStart();
292 1 Writex(0xA2);
293 1 AutoACK();
294 1 Writex(AddrePCF);
295 1 AutoACK();
296 1 I2CStart();
297 1 Writex(0xA3);
298 1 AutoACK();
299 1 i =Readx();
300 1 //ACK(); //注意:这里不能有ACK应答信号//
301 1 I2CStop();
302 1 Delay_1ms(0);
303 1 return(i);
C51 COMPILER V7.07 TIME 06/16/2005 23:10:15 PAGE 6
304 1 }
305 void WritePCF8563(Uchar AddrePCF,Uchar PCFdata)
306 {
307 1 I2CStart();
308 1 Writex(0xA2);
309 1 AutoACK();
310 1 Writex(AddrePCF);
311 1 AutoACK();
312 1 Writex(PCFdata);
313 1 AutoACK();
314 1 I2CStop();
315 1 Delay_1ms(10);
316 1 }
317
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 668 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = 21 ----
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 + -