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

📄 ad7416_new.lst

📁 温度传感器AD7416C程序(能帮你了解I2C原理
💻 LST
字号:
C51 COMPILER V7.10   AD7416_NEW                                                            11/04/2004 13:44:45 PAGE 1   


C51 COMPILER V7.10, COMPILATION OF MODULE AD7416_NEW
OBJECT MODULE PLACED IN ad7416_new.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ad7416_new.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*AD7416温度传感器接口程序*/
   2          /*2004年11月4日*/
   3          #include <reg51.h>
   4          #include <intrins.h>
   5          #include <string.h>
   6          #include <stdio.h>
   7          sbit SDA = P3^5;
   8          sbit SCL = P3^4;
   9          
  10          char Start()                                            //当SCL为高时,SDA由高到低跳变,认为开始
  11          {
  12   1              SCL=1;
  13   1              SDA=1; 
  14   1              _nop_();
  15   1              _nop_();
  16   1              _nop_();
  17   1              _nop_();
  18   1              if( SCL==0 || SDA==0 ) return 0; //如果不满足条件,开始错误
  19   1              else
  20   1              {
  21   2                      SCL=1;                                           //建立开始条件
  22   2                      _nop_();
  23   2                      _nop_();                                         //开始条件为:当时钟SCL为高时,SDA产生一个由高到低的跳变
  24   2                      _nop_();
  25   2                      _nop_();
  26   2                      _nop_();
  27   2                      _nop_();
  28   2                      SDA=0;
  29   2                      _nop_();
  30   2                      _nop_();
  31   2                      _nop_(); 
  32   2                      _nop_();
  33   2                      _nop_();
  34   2                      SCL=0;
  35   2                      _nop_();
  36   2                      _nop_();
  37   2                      _nop_();
  38   2                      _nop_();
  39   2                      _nop_();
  40   2                      SDA=1; 
  41   2              }
  42   1      } 
  43          
  44          void Stop()       //当SCL为高时,SDA由低到高发生跳变,这认为停止
  45          {
  46   1              SDA=0;
  47   1              _nop_();
  48   1              _nop_();
  49   1              _nop_();
  50   1              _nop_();
  51   1              _nop_();
  52   1              SCL=1;
  53   1              _nop_();
  54   1              _nop_();
  55   1              _nop_();
C51 COMPILER V7.10   AD7416_NEW                                                            11/04/2004 13:44:45 PAGE 2   

  56   1              _nop_();
  57   1              _nop_();
  58   1              _nop_();
  59   1              _nop_();
  60   1              SDA=1; 
  61   1      }
  62          
  63          char Shin()       //读入一个字节的数据
  64          {
  65   1              char i,RetByte;
  66   1              for(i=0;i<8;i++)
  67   1              {
  68   2                      SCL=0;
  69   2                      _nop_();
  70   2                      _nop_();
  71   2                      _nop_();
  72   2                      _nop_();
  73   2                      _nop_();
  74   2                      SCL=1;
  75   2                      _nop_();
  76   2                      _nop_();
  77   2                      RetByte=RetByte<<1;
  78   2                      if( SDA==1 ) RetByte=RetByte|0x01;
  79   2              }
  80   1              SCL=0;
  81   1              _nop_();
  82   1              _nop_();
  83   1              SDA=1;
  84   1              return RetByte;
  85   1      }
  86          
  87          void Shout( char Byte )//写一个字节的数据
  88          {               
  89   1              char i;
  90   1              for(i=0;i<8;i++)
  91   1              {
  92   2                      SCL=0;
  93   2                      _nop_();
  94   2                      _nop_();
  95   2                      if( Byte&0x80 ) SDA=1;
  96   2                      else SDA=0;
  97   2                      _nop_();
  98   2                      _nop_();
  99   2                      Byte=Byte<<1;
 100   2                      SCL=1;
 101   2                      _nop_();
 102   2                      _nop_();
 103   2                      _nop_();
 104   2                      _nop_();
 105   2                      _nop_();
 106   2              }
 107   1              SCL=0;
 108   1              _nop_();
 109   1              _nop_();
 110   1              _nop_();
 111   1              _nop_();
 112   1              SDA=1; 
 113   1      }
 114          
 115          char TestAck()  //检察是否有应答信号
 116          {
 117   1              char rf=0; //是否应答标志
C51 COMPILER V7.10   AD7416_NEW                                                            11/04/2004 13:44:45 PAGE 3   

 118   1              SCL=0;
 119   1              _nop_();   //应答是在时钟的低时期将SDA拉低来产生应答
 120   1              _nop_();
 121   1              _nop_();
 122   1              SDA=1; 
 123   1              _nop_();
 124   1              _nop_();
 125   1              SCL=1;
 126   1              _nop_();
 127   1              _nop_();
 128   1              _nop_();
 129   1              _nop_();
 130   1              if( SDA==1 ) rf=1;//没有应答信号,置标志为高
 131   1              else rf=0;
 132   1                      SCL=0;
 133   1                      _nop_();
 134   1                      _nop_();
 135   1                      _nop_();
 136   1              return rf;
 137   1      }
 138          
 139          //unsigned int LM74_Read(void)
 140          float LM74_Read(void)
 141          {
 142   1              unsigned char rc_h=0, rc_l=0,i;
 143   1      //      unsigned int bbData,sum;
 144   1              float hight,low,sum,d1,d2,tempt;
 145   1              unsigned char a,b;
 146   1      
 147   1              Start();
 148   1              Shout( 0x90 );          //发送地址信号:地址为000
 149   1              if( !TestAck() )
 150   1              {
 151   2                      Shout(0);           //选中温度数据寄存器
 152   2                      TestAck();
 153   2              }
 154   1              Stop();
 155   1      
 156   1              sum=0.0;
 157   1              for(i=0;i<10;i++)
 158   1              {
 159   2                      Start();
 160   2                      Shout( 0x91 );    //读温度寄存器中的数据
 161   2                      if( !TestAck() )
 162   2                      {
 163   3                              rc_h=Shin();  //温度数据高8位
 164   3                              if( !TestAck() )
 165   3                              rc_l=Shin();  //温度数据低8位
 166   3                              TestAck();
 167   3                      }
 168   2                      Stop();
 169   2      
 170   2      //              bbData=rc_h;
 171   2      //              bbData=_irol_(bbData,8);
 172   2      //              bbData=bbData|rc_l;
 173   2      //              bbData=_iror_(bbData,6);
 174   2      //              bbData=bbData&0x0FFF;
 175   2                      hight=rc_h;
 176   2                      a=rc_l&0x80;
 177   2                      b=rc_l&0x40;
 178   2                      if(a==1)
 179   2                              d1=0.5;
C51 COMPILER V7.10   AD7416_NEW                                                            11/04/2004 13:44:45 PAGE 4   

 180   2                      else d1=0.0;
 181   2                      if(b==1)
 182   2                              d2=0.25;
 183   2                      else d2=0.0;
 184   2                      low=d1+d2;
 185   2                      sum+=(hight+low);
 186   2              
 187   2      
 188   2      //              sum+=bbData;
 189   2              }
 190   1      //      bbData=sum/10;
 191   1      //      return (bbData);
 192   1              tempt=sum/10.0;
 193   1              return(tempt);
 194   1      }
 195          
 196          void LM74_Set()
 197          {
 198   1              unsigned char  rc_l;
 199   1      //      unsigned char rc_h, rc_l;
 200   1      //      unsigned int bbData;
 201   1      
 202   1              Start();
 203   1              Shout( 0x90 );         //发送地址信号,并为写
 204   1              if( !TestAck() )
 205   1              {
 206   2                      Shout( 1 );        //设置配置寄存器
 207   2                      if( !TestAck() )
 208   2                      {
 209   3                              Shout(0x0);        //写配置寄存器内容
 210   3                              TestAck();
 211   3                      }
 212   2              }
 213   1              Stop();
 214   1      
 215   1              Start();
 216   1              Shout( 0x91 );        //读数据
 217   1              if( !TestAck() )
 218   1              {
 219   2              rc_l=Shin();
 220   2              TestAck();
 221   2              }
 222   1              Stop();
 223   1      
 224   1      }
 225          main()
 226          {
 227   1              float temp;
 228   1              TMOD=0x20|TMOD;
 229   1          TL1=0xfd;
 230   1          TH1=0xfd;
 231   1          TR1=1;
 232   1          SCON=0x50;
 233   1              TI=1;
 234   1              puts("the temp is;\r\n");
 235   1              LM74_Set();
 236   1              temp=LM74_Read();
 237   1              printf("%.2f\r\n",temp);
 238   1      
 239   1      }
 240          

C51 COMPILER V7.10   AD7416_NEW                                                            11/04/2004 13:44:45 PAGE 5   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    521    ----
   CONSTANT SIZE    =     22    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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