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

📄 ds1307.lst

📁 这是8051单片机模拟IIC总线
💻 LST
📖 第 1 页 / 共 3 页
字号:
 545   2              _Nop();
 546   2              _Nop();  
 547   2              SCL=0; 
 548   2          }
 549   1          _Nop();
 550   1          _Nop();
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 10  

 551   1          SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/
 552   1          _Nop();
 553   1          _Nop();   
 554   1          SCL=1;
 555   1          _Nop();
 556   1          _Nop();
 557   1          _Nop();
 558   1          if(SDA==1)ack=0;     
 559   1          else ack=1;        /*判断是否接收到应答信号*/
 560   1          SCL=0;
 561   1          _Nop();
 562   1          _Nop();
 563   1      }
 564          
 565          
 566          
 567          
 568          
 569          
 570          /*******************************************************************
 571                           字节数据传送函数               
 572          函数原型: uchar  RcvByte();
 573          功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),
 574               发完后请用应答函数。  
 575          ********************************************************************/   
 576          uchar  RcvByte()                //字节数据传送函数 receive
 577          {
 578   1              uchar retc;
 579   1              uchar BitCnt;
 580   1          retc=0; 
 581   1              SDA=1;             /*置数据线为输入方式*/
 582   1              for(BitCnt=0;BitCnt<8;BitCnt++)
 583   1          {
 584   2              _Nop();           
 585   2              SCL=0;       /*置时钟线为低,准备接收数据位*/
 586   2              _Nop();
 587   2              _Nop();         /*时钟低电平周期大于4.7μs*/
 588   2              _Nop();
 589   2              _Nop();
 590   2              _Nop();
 591   2              SCL=1;       /*置时钟线为高使数据线上数据有效*/
 592   2              _Nop();
 593   2              _Nop();
 594   2              retc=retc<<1;
 595   2              if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */
 596   2              _Nop();
 597   2              _Nop(); 
 598   2              }
 599   1              SCL=0;    
 600   1              _Nop();
 601   1              _Nop();
 602   1              return(retc);
 603   1      }
 604          
 605          
 606          
 607          
 608          /********************************************************************
 609                               应答子函数
 610          原型:  void Ack_I2c(bit a);
 611           
 612          功能:主控器进行应答信号,(可以是应答或非应答信号)
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 11  

 613          ********************************************************************/
 614          void Ack_I2c(bit a)             //主控器进行应答信号
 615          {
 616   1        
 617   1              if(a==0)SDA=0;     /*在此发出应答或非应答信号 */
 618   1          else SDA=1;
 619   1              _Nop();
 620   1              _Nop();
 621   1              _Nop();      
 622   1              SCL=1;
 623   1          _Nop();
 624   1          _Nop();              //时钟低电平周期大于4μ
 625   1          _Nop();
 626   1          _Nop();
 627   1          _Nop();  
 628   1              SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/
 629   1          _Nop();
 630   1          _Nop();    
 631   1      }
 632          
 633          
 634          
 635          
 636          /*******************************************************************
 637                              向有子地址器件发送多字节数据函数               
 638          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 639          功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
 640                    地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
 641                     如果返回1表示操作成功,否则操作有误。
 642          注意:    使用前必须已结束总线。
 643          ********************************************************************/
 644          //bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)          //向有子地址器件发送多字节数据函数 
 645          //子地址为8位的数据传送
 646          bit ISendStr_8(uchar add,uchar son_add,uchar dat)               //向子地址为8位的器件发送多字节数据函数 
 647          {
 648   1              Start_I2c();               /*启动总线*/
 649   1              SendByte(add);            /*发送器件地址*/
 650   1          if(ack==0)return(0);
 651   1              SendByte(son_add);            /*发送器件子地址*/
 652   1          if(ack==0)return(0);
 653   1          SendByte(dat);               /*发送数据*/
 654   1          if(ack==0)return(0);
 655   1              Stop_I2c();                 /*结束总线*/ 
 656   1              return(1);
 657   1      }
 658          //子地址为16位的数据传送
 659          bit ISendStr_16(uchar add,uint son_add,uchar dat)               //向子地址为16位的器件发送多字节数据函数 
 660          {
 661   1              Start_I2c();               /*启动总线*/
 662   1              SendByte(add);            /*发送器件地址*/
 663   1          if(ack==0)return(0);
 664   1              SendByte(son_add/256);            /*发送器件子地址*/
 665   1          if(ack==0)return(0);
 666   1              SendByte(son_add%256);            /*发送器件子地址*/
 667   1          if(ack==0)return(0);
 668   1          SendByte(dat);               /*发送数据*/
 669   1          if(ack==0)return(0);
 670   1              Stop_I2c();                 /*结束总线*/ 
 671   1              return(1);
 672   1      }
 673          
 674          
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 12  

 675          
 676          
 677          
 678          /*******************************************************************
 679                              向有子地址器件读取多字节数据函数               
 680          函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);  
 681          功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
 682                    地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
 683                     如果返回1表示操作成功,否则操作有误。
 684          注意:    使用前必须已结束总线。
 685          ********************************************************************/
 686          
 687          
 688          //bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)           //向有子地址器件读取多字节数据函数
 689          //子地址为8位的数据传送
 690          uchar IRcvStr_8(uchar add,uchar son_add)                //向子地址为8位的器件读取多字节数据函数
 691          {
 692   1      
 693   1              uchar i;
 694   1              Start_I2c();               /*启动总线*/
 695   1              SendByte(add);            /*发送器件地址*/
 696   1              SendByte(son_add);            /*发送器件子地址2*/
 697   1              Start_I2c();
 698   1              SendByte(add+0x01);
 699   1              i=RcvByte();
 700   1              Ack_I2c(1);                 /*发送非应位*/
 701   1              Stop_I2c();                    /*结束总线*/ 
 702   1              return (i);
 703   1      }
 704          //子地址为16位的数据传送
 705          uchar IRcvStr_16(uchar add,uint son_add)                //向子地址为16位的器件读取多字节数据函数
 706          {
 707   1      
 708   1              uchar i;
 709   1              Start_I2c();               /*启动总线*/
 710   1              SendByte(add);            /*发送器件地址*/
 711   1              SendByte(son_add/256);            /*发送器件子地址1*/
 712   1              SendByte(son_add%256);            /*发送器件子地址2*/
 713   1              Start_I2c();
 714   1              SendByte(add+0x01);
 715   1              i=RcvByte();
 716   1              Ack_I2c(1);                 /*发送非应位*/
 717   1              Stop_I2c();                    /*结束总线*/ 
 718   1              return (i);
 719   1      }
 720          /*完毕*/
 721          
 722          void lcd_dis_time(void)         //时钟显示函数
 723          {
 724   1              uchar i=0;
 725   1              i = IRcvStr_8(0xd0,0x00);
 726   1              i = ((i&0x70)>>4)*10+(i&0x0f);
 727   1              lcd_add(3,7);
 728   1              lcd_dis_num(i);
 729   1              i = IRcvStr_8(0xd0,0x01);
 730   1              i = ((i&0x70)>>4)*10+(i&0x0f);
 731   1              lcd_add(3,4);
 732   1              lcd_dis_num(i);
 733   1              i = IRcvStr_8(0xd0,0x02);
 734   1              i = ((i&0x30)>>4)*10+(i&0x0f);
 735   1              lcd_add(3,1);
 736   1              lcd_dis_num(i);
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 13  

 737   1              i = IRcvStr_8(0xd0,0x03);
 738   1              i = i&0x07;
 739   1              lcd_add(2,1);
 740   1              lcd_dis_num(i);
 741   1              i = IRcvStr_8(0xd0,0x04);
 742   1              i = ((i&0x30)>>4)*10+(i&0x0f);
 743   1              lcd_add(1,7);
 744   1              lcd_dis_num(i);
 745   1              i = IRcvStr_8(0xd0,0x05);
 746   1              i = ((i&0x10)>>4)*10+(i&0x0f);
 747   1              lcd_add(1,4);
 748   1              lcd_dis_num(i);
 749   1              i = IRcvStr_8(0xd0,0x06);
 750   1              i = ((i&0xf0)>>4)*10+(i&0x0f);
 751   1              lcd_add(1,1);
 752   1              lcd_dis_num(i);
 753   1      }
 754          
 755          void set_time(uchar sec, uchar min, uchar hr, uchar dy, uchar dt,uchar mn,uchar yr)             //时钟设置sec, min, h
             -r, dy, dt, mn, yr
 756          {
 757   1              uchar i;
 758   1              lcd_add(4,1);
 759   1              i = ISendStr_8(0xd0,0x00,0);
 760   1              lcd_wrd(0x30+(uchar)i);
 761   1              sec = ((sec/10)<<4)+(sec%10);
 762   1              i = ISendStr_8(0xd0,0x00,sec);
 763   1              lcd_wrd(0x30+(uchar)i);
 764   1              min = ((min/10)<<4)+(min%10);
 765   1              i = ISendStr_8(0xd0,0x01,min);
 766   1              lcd_wrd(0x30+(uchar)i);
 767   1              hr = ((hr/10)<<4)+(hr%10);
 768   1              i = ISendStr_8(0xd0,0x02,hr);
 769   1              lcd_wrd(0x30+(uchar)i);
 770   1      
 771   1              i = ISendStr_8(0xd0,0x03,dy);
 772   1              lcd_wrd(0x30+(uchar)i);
 773   1              dt = ((dt/10)<<4)+(dt%10);
 774   1              i = ISendStr_8(0xd0,0x04,dt);
 775   1              lcd_wrd(0x30+(uchar)i);
 776   1              mn = ((mn/10)<<4)+(mn%10);
 777   1              i = ISendStr_8(0xd0,0x05,mn);
 778   1              lcd_wrd(0x30+(uchar)i);
 779   1              yr = ((yr/10)<<4)+(yr%10);
 780   1              i = ISendStr_8(0xd0,0x06,yr);
 781   1              lcd_wrd(0x30+(uchar)i);
 782   1      }
 783          void lcd_dis_int(long dat,uint int_bits)        //显示一个有符号的整数,显示为dat的低int_bits位
 784          {
 785   1              long a = 0;
 786   1              uchar n = 0;
 787   1              long tmp = 0;
 788   1              if(dat<0)
 789   1              {
 790   2                      lcd_wrd(0x2d);
 791   2              }
 792   1              tmp = pow(10,int_bits);
 793   1              dat = fabs(dat);
 794   1              dat = dat%tmp;
 795   1              for(n=int_bits;n>1;n--)
 796   1              {
 797   2                      tmp = pow(10,n-1);
C51 COMPILER V7.07   DS1307                                                                02/27/2007 10:08:54 PAGE 14  

 798   2                      a = dat/tmp;
 799   2                      lcd_wrd(0x30+a);
 800   2                  dat =dat%tmp;
 801   2              }
 802   1              lcd_wrd(0x30+(uchar)dat);
 803   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1698    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1      37
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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