📄 alarm001.lst
字号:
218
219
220
221 void time0(void) interrupt 1
222 {
223 1 TH0=0xF4;TL0=0x48;
224 1 if(discnt>11)discnt=0;// 显示为12位数码管
225 1 if(cnt>200)cnt=0;// 调整时的闪烁周期
226 1 switch(MS)
227 1 {
228 2 case 0:{dis_time(discnt);}break;// 显示走时
229 2 case 1:{dis_adjtime(discnt);}break;// 显示调时
230 2 case 2:{dis_almtime(discnt);}break;
231 2 default: break;
232 2 }
233 1 discnt++;cnt++;
234 1
235 1 }
236
237 void time1(void) interrupt 3 //50ms
238 {uchar temp1,temp2,temp;
239 1 TH1=0X3C;TL1=0XAF;
240 1 time_cnt++;
C51 COMPILER V7.07 ALARM001 02/02/2009 01:27:16 PAGE 5
241 1 if(time_cnt>=20) // 1秒钟计时时间到,读PCF8583的各寄存器的值
242 1 {
243 2 time_cnt=0;
244 2 temp=IRcvByte(PCF8583, 0X02);
245 2 temp1=(temp/16)&0x0f;temp2=temp&0x0f;
246 2 sec=temp1*10+temp2;
247 2 temp=IRcvByte(PCF8583, 0X03);
248 2 temp1=temp>>4;temp2=temp&0x0f;
249 2 min=temp1*10+temp2;
250 2 temp=IRcvByte(PCF8583, 0X04);
251 2 temp1=(temp>>4)&0x03;temp2=temp&0x0f;
252 2 hou=temp1*10+temp2;
253 2 temp=IRcvByte(PCF8583, 0X05);
254 2 temp1=(temp>>4)&0x03;;temp2=temp&0x0f;
255 2 day=temp1*10+temp2;
256 2 temp=IRcvByte(PCF8583, 0X06);
257 2 temp1=(temp>>4)&0x01;temp2=temp&0x0f;
258 2 mon=temp1*10+temp2;
259 2 }
260 1 }
261
262
263
264 void send164(uchar m)
265 {uchar k,i,b;
266 1 k=SEG7[m];
267 1 i=8;
268 1 CLK=0;
269 1 while (i--)
270 1 {b=k>>i;
271 2 if((b&0x01)==0x01)DATA=1;//判断b的最低位的值是多少
272 2 else DATA=0;
273 2 CLK=1; _nop_();
274 2 CLK=0;
275 2 }
276 1
277 1 }
278 //P2 KOU //P1kou
279
280 void dis_time(uchar m)
281 {
282 1 P1&=0XC3;/// 等价于 P1=P1&0xc3;;准备送段码 ,位码口全部清零
283 1 P2=0X00;////准备送段码,位码口全部清零
284 1 {switch(m)
285 2 {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
286 3 case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
287 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
288 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
289 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
290 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
291 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
292 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
293 3 case 8:{send164(sec/10);P1|=act[m];P2=0X00;}break;
294 3 case 9:{send164(sec%10);P1|=act[m];P2=0X00;}break;
295 3 case 10:{send164(0);P1|=act[m];P2=0X00;}break;
296 3 case 11:{send164(0);P1|=act[m];P2=0X00;}break;
297 3 default:break;}
298 2 }
299 1
300 1 }
301
302
C51 COMPILER V7.07 ALARM001 02/02/2009 01:27:16 PAGE 6
303 void dis_adjtime(uchar m)
304 {
305 1 if(cnt>100)
306 1 {
307 2 P1&=0XC3;
308 2 P2=0X00;
309 2 switch(m)
310 2 {case 0:{send164(mon/10);P2|=act[m];P1&=0XC3;}break;
311 3 case 1:{send164(mon%10);P2|=act[m];P1&=0XC3;}break;
312 3 case 2:{send164(day/10);P2|=act[m];P1&=0XC3;}break;
313 3 case 3:{send164(day%10);P2|=act[m];P1&=0XC3;}break;
314 3 case 4:{send164(hou/10);P2|=act[m];P1&=0XC3;}break;
315 3 case 5:{send164(hou%10);P2|=act[m];P1&=0XC3;}break;
316 3 case 6:{send164(min/10);P2|=act[m];P1&=0XC3;}break;
317 3 case 7:{send164(min%10);P2|=act[m];P1&=0XC3;}break;
318 3 case 8:{send164(0);P1&=act[m];P2=0X00;}break;
319 3 case 9:{send164(0);P1&=act[m];P2=0X00;}break;
320 3 case 10:{send164(0);P1&=act[m];P2=0X00;}break;
321 3 case 11:{send164(0);P1&=act[m];P2=0X00;}break;
322 3 default:break;
323 3 }
324 2 }
325 1 else
326 1 {
327 2 P1&=0XC3;
328 2 P2=0X00;
329 2 }
330 1 }
331
332 void dis_almtime(uchar m)
333 {
334 1 if(cnt>100)
335 1 {
336 2 P1&=0XC3;
337 2 P2=0X00;
338 2 switch(m)
339 2 {case 0:{send164(ALM_mon/10);P2|=act[m];P1&=0XC3;}break;
340 3 case 1:{send164(ALM_mon%10);P2|=act[m];P1&=0XC3;}break;
341 3 case 2:{send164(ALM_day/10);P2|=act[m];P1&=0XC3;}break;
342 3 case 3:{send164(ALM_day%10);P2|=act[m];P1&=0XC3;}break;
343 3 case 4:{send164(ALM_hou/10);P2|=act[m];P1&=0XC3;}break;
344 3 case 5:{send164(ALM_hou%10);P2|=act[m];P1&=0XC3;}break;
345 3 case 6:{send164(ALM_min/10);P2|=act[m];P1&=0XC3;}break;
346 3 case 7:{send164(ALM_min%10);P2|=act[m];P1&=0XC3;}break;
347 3 case 8:{send164(0);P1&=act[m];P2=0X00;}break;
348 3 case 9:{send164(0);P1&=act[m];P2=0X00;}break;
349 3 case 10:{send164(0);P1&=act[m];P2=0X00;}break;
350 3 case 11:{send164(0);P1&=act[m];P2=0X00;}break;
351 3 default:break;
352 3 }
353 2 }
354 1 else
355 1 {
356 2 P1&=0XC3;
357 2 P2=0X00;
358 2 }
359 1 }
360
361 void TIMERIni(void)
362 {
363 1 TMOD=0X11;
364 1 TH0=0xF4;TL0=0x48;TH1=0X3C;TL1=0XAF;
C51 COMPILER V7.07 ALARM001 02/02/2009 01:27:16 PAGE 7
365 1 EA=1;
366 1 ET0=1;
367 1 ET1=1;
368 1 TR1=1;TR0=1;
369 1 }
370
371
372
373
374
375 /*******************************************************************
376 起动总线函数
377 函数原型: void Start_I2c();
378 功能: 启动I2C总线,即发送I2C起始条件.
379
380 ********************************************************************/
381 void Start_I2c(void)
382 {
383 1 SDA=1; /*发送起始条件的数据信号*/
384 1 _Nop();
385 1 _Nop();
386 1 SCL=1;
387 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
388 1 _Nop();
389 1 _Nop();
390 1 _Nop();
391 1 _Nop();
392 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
393 1 SDA=0; /*发送起始信号*/
394 1 _Nop(); /* 起始条件锁定时间大于4μs*/
395 1 _Nop();
396 1 _Nop();
397 1 _Nop();
398 1 _Nop();
399 1 _Nop(); /*起始条件建立时间大于4.7us,延时*/
400 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
401 1 _Nop();
402 1 _Nop();
403 1 _Nop();
404 1 _Nop();
405 1 }
406
407
408
409
410 /*******************************************************************
411 结束总线函数
412 函数原型: void Stop_I2c();
413 功能: 结束I2C总线,即发送I2C结束条件.
414
415 ********************************************************************/
416 void Stop_I2c(void)
417 {
418 1 SDA=0; /*发送结束条件的数据信号*/
419 1 _Nop(); /*发送结束条件的时钟信号*/
420 1 _Nop(); /*发送结束条件的时钟信号*/
421 1 SCL=1; /*结束条件建立时间大于4μs*/
422 1 _Nop();
423 1 _Nop();
424 1 _Nop();
425 1 _Nop();
426 1 _Nop();
C51 COMPILER V7.07 ALARM001 02/02/2009 01:27:16 PAGE 8
427 1 SDA=1; /*发送I2C总线结束信号*/
428 1 _Nop();
429 1 _Nop();
430 1 _Nop();
431 1 _Nop();
432 1 _Nop();
433 1 }
434
435
436
437
438 /*******************************************************************
439 字节数据传送函数
440 函数原型: void SendByte(uchar c);
441 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
442 此状态位进行操作.(不应答或非应答都使ack=0 假)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -