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

📄 i2c_slaver.lst

📁 I2C slaver 的8051源码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 562   1              {
 563   2                      if(TF0 == 1)
 564   2                              {
 565   3                                      return;
 566   3                              }
 567   2                              
 568   2              }
 569   1              
 570   1              SDA_LEVEL = SDA_PIN;//读SDA数据
 571   1              if(SDA_LEVEL== 1)
 572   1                      {
 573   2                              *Recevie_Pointer  |= 0x01;
 574   2                              *Recevie_Pointer =*Recevie_Pointer << 1;
 575   2                      }
 576   1              else
 577   1                      {
 578   2                              *Recevie_Pointer  &= 0xfe;
 579   2                              *Recevie_Pointer =*Recevie_Pointer << 1;
 580   2                      }
 581   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 582   1              TL0 =0xef;                      
 583   1              TF0 = 0;
 584   1              while(CLK_PIN == 1)//等待CLK 的 1完成
 585   1              {
 586   2                      if(TF0 == 1)
 587   2                              {
 588   3                                      return;
 589   3                              }
 590   2                              
 591   2              }
 592   1              
 593   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 594   1              TL0 =0xef;                      
 595   1              TF0 = 0;
 596   1              while(CLK_PIN == 0)//等待CLK 的0完成
 597   1              {
 598   2                      if(TF0 == 1)
 599   2                              {
 600   3                                      return;
 601   3                              }
 602   2                              
 603   2              }
 604   1              
 605   1              SDA_LEVEL = SDA_PIN;//读SDA数据
 606   1              if(SDA_LEVEL== 1)
 607   1                      {
 608   2                              *Recevie_Pointer  |= 0x01;
 609   2                              *Recevie_Pointer =*Recevie_Pointer << 1;
 610   2                      }
 611   1              else
 612   1                      {
 613   2                              *Recevie_Pointer  &= 0xfe;
C51 COMPILER V7.50   I2C_SLAVER                                                            03/02/2009 14:25:10 PAGE 11  

 614   2                              *Recevie_Pointer =*Recevie_Pointer << 1;
 615   2                      }
 616   1              
 617   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 618   1              TL0 =0xef;                      
 619   1              TR0  = 1; 
 620   1              TF0 = 0;
 621   1              while(CLK_PIN == 1)//等待CLK 的 1完成
 622   1              {
 623   2                      if(TF0 == 1)
 624   2                              {
 625   3                                      return;
 626   3                              }
 627   2                              
 628   2              }
 629   1              
 630   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 631   1              TL0 =0xef;                      
 632   1              TF0 = 0;
 633   1              while(CLK_PIN == 0)//等待CLK 的0完成
 634   1              {
 635   2                      if(TF0 == 1)
 636   2                              {
 637   3                                      return;
 638   3                              }
 639   2                              
 640   2              }                       
 641   1                                      
 642   1              SDA_LEVEL = SDA_PIN;//读SDA数据
 643   1              if(SDA_LEVEL == 1)
 644   1                      {
 645   2                              *Recevie_Pointer  |= 0x01;
 646   2                              
 647   2                      }
 648   1              else
 649   1                      {
 650   2                              *Recevie_Pointer  &= 0xfe;
 651   2                      }
 652   1              
 653   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 654   1              TL0 =0xef;                      
 655   1              TF0 = 0;
 656   1              while(CLK_PIN == 1)//等待CLK 的 1完成
 657   1              {
 658   2                      if(TF0 == 1)
 659   2                              {
 660   3                                      return;
 661   3                              }
 662   2                              
 663   2              }               
 664   1              
 665   1              //处理应答
 666   1              _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
 667   1              SDA_PIN = 0;//应答
 668   1              
 669   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 670   1              TL0 =0xef;                      
 671   1              TF0 = 0;
 672   1              while(CLK_PIN == 0)//等待应答的 CLK 的0完成
 673   1              {
 674   2                      if(TF0 == 1)
 675   2                              {
C51 COMPILER V7.50   I2C_SLAVER                                                            03/02/2009 14:25:10 PAGE 12  

 676   3                                      return;
 677   3                              }
 678   2                              
 679   2              }
 680   1              
 681   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 682   1              TL0 =0xef;                      
 683   1              TF0 = 0;
 684   1              while(CLK_PIN == 1)//等待应答的CLK的1完成
 685   1              {
 686   2                      if(TF0 == 1)
 687   2                              {
 688   3                                      return;
 689   3                              }
 690   2                              
 691   2              }
 692   1              
 693   1              SDA_PIN = 1;//完成应答,
 694   1      
 695   1              //检测是否stop
 696   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 697   1              TL0 =0xef;                      
 698   1              TF0 = 0;
 699   1              while(CLK_PIN == 0)//等待CLK 0 的完成
 700   1              {
 701   2                      if(TF0 == 1)
 702   2                              {
 703   3                                      return;
 704   3                              }
 705   2                              
 706   2              }
 707   1              //CLK的0完成了, 接下来检测是否在1期间SDA有上升沿
 708   1      
 709   1              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 710   1              TL0 =0xef;      
 711   1              TF0 = 0;                
 712   1              SDA_LEVEL= SDA_PIN;     
 713   1              if(SDA_LEVEL == 1) 
 714   1                      {
 715   2                              SDA_LEVEL_BAK = 1;
 716   2                              while(CLK_PIN == 1)//如果 第一次就是1,肯定不是stop,等待1完
 717   2                                      {
 718   3                                              if(TF0 == 1)
 719   3                                              {
 720   4                                                      return;
 721   4                                              }
 722   3                                      }
 723   2                      }
 724   1              else//(SDA_LEVEL == 0) 
 725   1              {
 726   2                      SDA_LEVEL_BAK = 0;
 727   2                      while(CLK_PIN == 1)//等和读
 728   2                              {
 729   3                                      if(TF0 == 1)
 730   3                                              {
 731   4                                                      return;
 732   4                                              }
 733   3                                      SDA_LEVEL= SDA_PIN;
 734   3                                      
 735   3                                      if(SDA_LEVEL == 1)//是stop
 736   3                                              {
 737   4      /*
C51 COMPILER V7.50   I2C_SLAVER                                                            03/02/2009 14:25:10 PAGE 13  

 738   4                                              Recevie_Pointer--;
 739   4                                              SBUF = *Recevie_Pointer;
 740   4                                              while(TI == 0);
 741   4                                              TI = 0;
 742   4                                              
 743   4                                              *Recevie_Pointer = 0;
 744   4                                              
 745   4                                              Recevie_Pointer++;
 746   4                                              SBUF = *Recevie_Pointer;
 747   4                                              while(TI == 0);
 748   4                                              TI = 0;
 749   4                                              
 750   4                                              *Recevie_Pointer = 0;*/
 751   4                                                      var = (Recevie_Pointer - SDA_DATA) + 1;//需要更新var给下一次中断Recevie_Byte()调用
 752   4      
 753   4                                                      Byte_var1= (Recevie_Pointer - SDA_DATA) ;//必须要的
 754   4                                                      //if(Byte_var1 >= 199)//就是0-199,返回到buffer开头放入数据
 755   4                                                      if(Byte_var1 >= (Buffer_Len - 1))
 756   4                                                      {
 757   5                                                                      Buffer_Return = 1;//返回标记置位
 758   5                                                                      var = 0;
 759   5                                                              }
 760   4                                                      return;
 761   4                                              }                                                       
 762   3                              }
 763   2                              
 764   2              }
 765   1              Recevie_Pointer++;
 766   1              Byte_var1= (Recevie_Pointer - SDA_DATA) ;
 767   1              //if(Byte_var1 > 199)//就是0-199(共200字节),返回到buffer开头放入数据
 768   1              if(Byte_var1 > (Buffer_Len - 1))
 769   1              {
 770   2                              Recevie_Pointer = SDA_DATA;
 771   2              }                                                                               
 772   1              Recevie_Byte(Recevie_Pointer);
 773   1      }
 774          
 775          
 776          
 777          void INT0_SDA_INT(void) interrupt 0 using 1
 778          {
 779   1              /***************************************************
 780   1      
 781   1              //SDA 下降沿产生 了我们看SCL  是否为1
 782   1      
 783   1              //SDA --------\                   /-----------\                                
 784   1                                           \________/____________\____...........
 785   1      
 786   1              //SCL--------------\              /------\                           
 787   1                                                     \______/              \______...........
 788   1      
 789   1              *****************************************************/
 790   1                      
 791   1              //LED1 = !LED1; //已经进入中断  
 792   1              
 793   1              EX0 = 0;//关外部0 (SDA)中断
 794   1              CLK_LEVEL = CLK_PIN;
 795   1              if(CLK_LEVEL == 1)//SDA下降沿时SCL为1,说明I2C start开始了
 796   1                      {                       
 797   2                              //LED2 = 0;//是start                    
 798   2                              TH0 =0xed;//18.432MHz晶体,16位方式3ms
 799   2                              TL0 =0xef;                      
C51 COMPILER V7.50   I2C_SLAVER                                                            03/02/2009 14:25:10 PAGE 14  

 800   2                              TF0 = 0;
 801   2                              while(CLK_PIN == 1)//等待CLK 的start 1完成
 802   2                              {
 803   3                                      if(TF0 == 1)
 804   3                                              {
 805   4                                                      goto end;                                               
 806   4                                              }
 807   3                                              
 808   3                              }                       
 809   2                              Recevie_Byte1();                                                                
 810   2                      }
 811   1              else
 812   1                      {
 813   2                              EX0 = 1;
 814   2                              //LED2 = 1;//不是start
 815   2                      }
 816   1              end:
 817   1              EX0 = 1;
 818   1              //LED1 = 1;     
 819   1      }
 820          
 821          #if 0
              void T0_INT(void)  interrupt 1 using 2
              {
                      
                      TH0 =0xed;//18.432MHz晶体,16位方式3ms,重装计数初值
                      TL0 =0xef;
              }
              #endif
 829          
 830          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1539    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       3
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -