📄 od2101.lst
字号:
263 1 //serial_out(retc); //test
264 1 return(retc);
265 1 }
266
267
268
269
270 /********************************************************************
271 应答子函数
272 原型: void Ack_I2c(bit a);
273
274 功能:主控器进行应答信号,(可以是应答或非应答信号)
275 ********************************************************************/
276 void Ack_I2c(bit a)
277 {
278 1
279 1 if(a==0)VI2C_SDA=0; /*在此发出应答或非应答信号 */
280 1 else VI2C_SDA=1;
281 1 _nop_();
282 1 _nop_();
283 1 _nop_();
284 1 VI2C_SCL=1; TestSCL();
285 1 _nop_();
286 1 _nop_(); /*时钟低电平周期大于4μs*/
287 1 _nop_();
288 1 _nop_();
289 1 _nop_();
290 1
291 1 VI2C_SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/
292 1 _nop_();
293 1 _nop_();
294 1 }
295
296
297
298
299
300
301 /*******************************************************************
302 向无子地址器件发送字节数据函数
303 函数原型: bit ISendByte(uchar sla,ucahr c);
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 6
304 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.
305 如果返回1表示操作成功,否则操作有误。
306 注意: 使用前必须已结束总线。
307 ********************************************************************/
308
309
310
311
312
313
314 /*******************************************************************
315 向有子地址器件发送多字节数据函数
316 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
317 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
318 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
319 如果返回1表示操作成功,否则操作有误。
320 注意: 使用前必须已结束总线。
321 ********************************************************************/
322 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
323 {
324 1 uchar data i;
325 1
326 1 Start_I2c(); /*启动总线*/
327 1 SendByte(sla); /*发送器件地址*/
328 1 if(ack==0) return(0);
329 1
330 1
331 1 SendByte(suba); /*发送器件子地址*/
332 1 if(ack==0) return(0);
333 1
334 1
335 1 for(i=0;i<no;i++)
336 1 {
337 2 SendByte(*s); /*发送数据*/
338 2 if(ack==0)return(0);
339 2 s++;
340 2 }
341 1 Stop_I2c(); /*结束总线*/
342 1
343 1 return(1);
344 1 }
345
346
347
348
349
350
351 /*******************************************************************
352 向无子地址器件读字节数据函数
353 函数原型: bit IRcvByte(uchar sla,ucahr *c);
354 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地
355 址sla,返回值在c.
356 如果返回1表示操作成功,否则操作有误。
357 注意: 使用前必须已结束总线。
358 ********************************************************************/
359
360
361
362
363 /*******************************************************************
364 向有子地址器件读取多字节数据函数
365 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 7
366 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
367 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
368 如果返回1表示操作成功,否则操作有误。
369 注意: 使用前必须已结束总线。
370 ********************************************************************/
371 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
372 {
373 1 uchar data i;
374 1
375 1 Start_I2c(); /*启动总线*/
376 1 SendByte(sla); /*发送器件地址*/
377 1 if(ack==0)return(0);
378 1 SendByte(suba); /*发送器件子地址*/
379 1 if(ack==0)return(0);
380 1
381 1 Start_I2c();
382 1 SendByte(sla+1);
383 1 if(ack==0)return(0);
384 1
385 1 for(i=0;i<no-1;i++)
386 1 {
387 2 *s=RcvByte(); /*发送数据*/
388 2 Ack_I2c(0); /*发送就答位*/
389 2 s++;
390 2 }
391 1 *s=RcvByte();
392 1 Ack_I2c(1); /*发送非应位*/
393 1 Stop_I2c(); /*结束总线*/
394 1 //i=*s;
395 1 return(1);
396 1 }
397
398 //===============================================
399
400 //串行中断接收
401 void receive() interrupt 4
402 {
403 1 if(RI)
404 1 {
405 2 RI = 0;
406 2 ES = 0;
407 2 PC_COMMAND = SBUF;
408 2 //delay5ms();
409 2
410 2 //serial_out(PC_COMMAND);
411 2
412 2 ISendStr(OD2101, WR, &PC_COMMAND, 1);
413 2 delay5ms();
414 2
415 2 //RX_BUFFER[RX_index] = PC_COMMAND; //保存数据到数组里面
416 2 //RX_index++;
417 2
418 2 }
419 1
420 1 ES = 1;
421 1
422 1 }
423
424 void int_0() interrupt 0 //P3.2
425 {
426 1 //unsigned char i;
427 1 EX0=0;
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 8
428 1
429 1 delay5ms();
430 1 delay5ms();
431 1 delay5ms();
432 1 IRQ_VALUE=0;
433 1
434 1
435 1 IT0=1;
436 1 EX0=1;
437 1 EA=1;
438 1 }
439
440
441 void main()
442 {
443 1 uchar i;
444 1
445 1
446 1 P1M0 = 0xff; //设置STC的 IO 为标准51 IO模式
447 1 P1M1 = 0xff;
448 1 P3M0 = 0xff;
449 1 P3M1 = 0xff;
450 1
451 1 P1=0xff;
452 1 P3=0xff;
453 1
454 1 // IRQ = 1 ; /*将IRQ管脚设置成输入状态*/
455 1
456 1 EA=1;
457 1 EX0=1;
458 1 IT0=1;
459 1
460 1 init_serialcomm();
461 1
462 1 LED=1;
463 1
464 1 if(IRcvStr( OD2101 , CTRL , &in_dat , 1 )) //; /*读取OD2101控制寄存器*/
465 1
466 1
467 1 in_dat = ( in_dat & 0xf0 ) | UART_4800 ; /*设置OD2101UART波特率为9600*/
468 1 if(ISendStr( OD2101 , CTRL, &in_dat , 1))// ; /*发送控制字节*/
469 1
470 1
471 1 ISendStr( OD2101 , WR , "message from OD2101\n", 19); /*发送"good"字节到OD2101*/
472 1 send_string_com("message from TEST CPU\n",21);
473 1
474 1 //serial_out(0x55); //test
475 1 IRQ_VALUE=1;
476 1 while(1)
477 1 {
478 2
479 2
480 2 if( !IRQ_VALUE) /*判断是否有接收中断产生*/
481 2 {
482 3
483 3 IRQ_VALUE=1;
484 3 LED=0; //test
485 3 if (IRcvStr(OD2101,UARTBUF,&in_dat,1)) //;/*UART接收缓存接收字节*/
486 3 {
487 4 //serial_out(in_dat); //test
488 4 for( i = 0 ; i <in_dat ; i++ ) /*将接收缓冲区的数据读出*/ // in_dat
489 4 {
C51 COMPILER V7.10 OD2101 04/27/2009 16:02:33 PAGE 9
490 5 if(IRcvStr( OD2101 , RD , &in_dat1 , 1 )) /*读取一个字节数据*/
491 5 /*将读取出的数据进行大小写转换*/
492 5 {
493 6 //serial_out(in_dat1); //test
494 6 // DelayNs(100); //test
495 6 /* if( (in_dat1>='A')&&(in_dat1<='Z') )
496 6 {
497 6 in_dat1 += 'a'-'A' ;
498 6 }
499 6 else if( (in_dat1>='a')&&(in_dat1<='z') )
500 6 {
501 6 in_dat1 -= 'a'-'A' ;
502 6 } */
503 6
504 6
505 6 //ISendStr(OD2101, WR, &in_dat1, 1);/*将转换后的数据发送给I2C总线*/
506 6 serial_out(in_dat1); //serial_out(in_dat);send_string_com(&in_dat1,1);//test
507 6 }
508 5
509 5 }
510 4
511 4 }
512 3
513 3
514 3 // }
515 3 }else LED=1; //test
516 2 }
517 1
518 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 777 ----
CONSTANT SIZE = 44 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 11 21
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -