📄 comm.lst
字号:
252 1 if(ack==0)return(0);
253 1
254 1 Start_I2c();
255 1 SendByte(sla+1);
256 1 if(ack==0)return(0);
257 1
258 1 for(i=0;i<no-1;i++)
259 1 {
260 2 kaohao[i]=RcvByte(); /*发送数据*/
261 2 Ack_I2c(0); /*发送就答位*/
262 2 //s++;
263 2 }
264 1 kaohao[i]=RcvByte();
265 1 Ack_I2c(1); /*发送非应位*/
266 1 Stop_I2c(); /*结束总线*/
267 1 return(1);
268 1 }
*** WARNING C280 IN LINE 247 OF C:\COMM_D\COMM.C: 's': unreferenced local variable
269
270 /*******************************************************************
271 向有子地址器件发送多字节数据函数
272 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
273 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
274 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
275 如果返回1表示操作成功,否则操作有误。
276 注意: 使用前必须已结束总线。
277 ********************************************************************/
278 unsigned char ISendStr(unsigned char sla,unsigned char suba,unsigned char no)
279 {
280 1 unsigned char i;
281 1 //unsigned char *s;
282 1 Start_I2c(); /*启动总线*/
283 1 SendByte(sla); /*发送器件地址*/
284 1 if(ack==0)return(0);
285 1 SendByte(suba); /*发送器件子地址*/
286 1 if(ack==0)return(0);
287 1
288 1 for(i=0;i<no;i++)
289 1 {
290 2 SendByte(kaohao[i]); /*发送数据*/
291 2 if(ack==0)return(0);
292 2 //s++;
293 2 }
294 1 Stop_I2c(); /*结束总线*/
295 1 return(1);
296 1 }
297 /********************************************************************
298 应答子函数
299 原型: void Ack_I2c(bit a);
C51 COMPILER V6.02 COMM 07/15/2004 11:07:07 PAGE 6
300
301 功能:主控器进行应答信号,(可以是应答或非应答信号)
302 ********************************************************************/
303 void Ack_I2c(bit a)
304 {
305 1
306 1 if(a==0) SDA=0; /*在此发出应答或非应答信号 */
307 1 else SDA=1;
308 1 _nop_();
309 1 _nop_();
310 1 _nop_();
311 1 SCL=1;
312 1 _nop_();
313 1 _nop_(); /*时钟低电平周期大于4μs*/
314 1 _nop_();
315 1 _nop_();
316 1 _nop_();
317 1 SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
318 1 _nop_();
319 1 _nop_();
320 1 }
321
322 /*******************************************************************
323 起动总线函数
324 函数原型: void Start_I2c();
325 功能: 启动I2C总线,即发送I2C起始条件.
326
327 ********************************************************************/
328 void Start_I2c()
329 {
330 1 SDA=1; /*发送起始条件的数据信号*/
331 1 _nop_();
332 1 SCL=1;
333 1 _nop_(); /*起始条件建立时间大于4.7us,延时*/
334 1 _nop_();
335 1 _nop_();
336 1 _nop_();
337 1 _nop_();
338 1 SDA=0; /*发送起始信号*/
339 1 _nop_(); /* 起始条件锁定时间大于4μs*/
340 1 _nop_();
341 1 _nop_();
342 1 _nop_();
343 1 _nop_();
344 1 SCL=0; /*钳住I2C总线,准备发送或接收数据 */
345 1 _nop_();
346 1 _nop_();
347 1 }
348
349
350
351
352 /*******************************************************************
353 结束总线函数
354 函数原型: void Stop_I2c();
355 功能: 结束I2C总线,即发送I2C结束条件.
356
357 ********************************************************************/
358 void Stop_I2c()
359 {
360 1 SDA=0; /*发送结束条件的数据信号*/
361 1 _nop_(); /*发送结束条件的时钟信号*/
C51 COMPILER V6.02 COMM 07/15/2004 11:07:07 PAGE 7
362 1 SCL=1; /*结束条件建立时间大于4μs*/
363 1 _nop_();
364 1 _nop_();
365 1 _nop_();
366 1 _nop_();
367 1 _nop_();
368 1 SDA=1; /*发送I2C总线结束信号*/
369 1 _nop_();
370 1 _nop_();
371 1 _nop_();
372 1 _nop_();
373 1 }
374 /*******************************************************************
375 字节数据传送函数
376 函数原型: void SendByte(uchar c);
377 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
378 此状态位进行操作.(不应答或非应答都使ack=0 假)
379 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
380 ********************************************************************/
381 void SendByte(unsigned char c)
382 {
383 1 unsigned char BitCnt;
384 1
385 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
386 1 {
387 2 if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/
388 2 else SDA=0;
389 2 SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/
390 2 _nop_();
391 2 _nop_(); /*保证时钟高电平周期大于4μs*/
392 2 _nop_();
393 2 _nop_();
394 2 _nop_();
395 2 dlu();
396 2 SCL=0;
397 2 }
398 1
399 1 _nop_();
400 1 _nop_();
401 1 SDA=1; /*8位发送完后释放数据线,准备接收应答位*/
402 1 _nop_();
403 1 _nop_();
404 1 SCL=1;
405 1 _nop_();
406 1 _nop_();
407 1 _nop_();
408 1 if(SDA==1)ack=0;
409 1 else ack=1; /*判断是否接收到应答信号*/
410 1 SCL=0;
411 1 _nop_();
412 1 _nop_();
413 1 }
414
415 /*******************************************************************
416 字节数据传送函数
417 函数原型: uchar RcvByte();
418 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
419 发完后请用应答函数。
420 ********************************************************************/
421 unsigned char RcvByte()
422 {
423 1 unsigned char retc;
C51 COMPILER V6.02 COMM 07/15/2004 11:07:07 PAGE 8
424 1 unsigned char BitCnt;
425 1
426 1 retc=0;
427 1 SDA=1; /*置数据线为输入方式*/
428 1 for(BitCnt=0;BitCnt<8;BitCnt++)
429 1 {
430 2 _nop_();
431 2 SCL=0; /*置时钟线为低,准备接收数据位*/
432 2 _nop_();
433 2 _nop_(); /*时钟低电平周期大于4.7μs*/
434 2 _nop_();
435 2 _nop_();
436 2 _nop_();
437 2 SCL=1; /*置时钟线为高使数据线上数据有效*/
438 2 _nop_();
439 2 _nop_();
440 2 retc=retc<<1;
441 2 if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
442 2 _nop_();
443 2 _nop_();
444 2 }
445 1 SCL=0;
446 1 _nop_();
447 1 _nop_();
448 1 return(retc);
449 1 }
450 void dlu()
451 {
452 1 _nop_();
453 1 _nop_();
454 1 _nop_();
455 1 _nop_();
456 1 _nop_();
457 1 _nop_();
458 1 _nop_();
459 1 _nop_();
460 1 }
461 void gettime()
462 {
463 1 unsigned char i;
464 1 //unsigned char con[7];
465 1 i=0;
466 1 sfgr1:
467 1 i++;
468 1 TR1=0;
469 1 IRcvStr(0xa2,0x02,7);
470 1 second=kaohao[0]&0x7f;
471 1 minutes=kaohao[1]&0x7f;
472 1 hour=kaohao[2]&0x3f;
473 1 day=kaohao[3]&0x3f;
474 1 month=kaohao[5]&0x1f;
475 1 year=kaohao[6];
476 1 sjback[0]=kaohao[0]&0x7f;
477 1 sjback[1]=kaohao[1]&0x7f;
478 1 sjback[2]=kaohao[2]&0x3f;
479 1 sjback[3]=kaohao[3]&0x3f;
480 1 sjback[4]=kaohao[5]&0x1f;
481 1 sjback[5]=kaohao[6];
482 1 // if (i>5)
483 1 // {
484 1 // TR1=1;
485 1 // return;
C51 COMPILER V6.02 COMM 07/15/2004 11:07:07 PAGE 9
486 1 // }
487 1 // dog();
488 1 // if ((month==0)||(day==0))
489 1 // {
490 1 /* second=sjback[0];
491 1 minutes=sjback[1];
492 1 hour=sjback[2];
493 1 day=sjback[3];
494 1 month=sjback[4];
495 1 year=sjback[5];
496 1 settime();*/
497 1 // dog();
498 1 // goto sfgr1;
499 1 // }
500 1 //goto sfgr1;
501 1 // dog();
502 1 // if ((year<0x04)||(month>0x12)||(day>0x31)||(hour>0x24)||(minutes>0x60)||(second>0x60))
503 1 // {
504 1 /*second=sjback[0];
505 1 minutes=sjback[1];
506 1 hour=sjback[2];
507 1 day=sjback[3];
508 1 month=sjback[4];
509 1 year=sjback[5];
510 1 settime(); */
511 1 // dog();
512 1 // goto sfgr1;
513 1 // }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -