⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 od2101.lst

📁 OD2101是可以实现I2C与RS232或RS485透传
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -