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

📄 ad7416c.lst

📁 单片机C语言教程
💻 LST
字号:
C51 COMPILER V8.02   AD7416C                                                               08/10/2007 11:57:33 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE AD7416C
OBJECT MODULE PLACED IN AD7416C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE AD7416C.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*************************************************************/
   2          /* 这是用C51语言编的10位数字温度传感器AD7416驱动程序,文件名 */
   3          /* 为AD7416C.C                                               */
   4          /* 功能:本程序主要是读出温度传感器AD7416芯片的温度值,并把它*/
   5          /*    放在变量ADCH,ADCL中,ADCH中放高8位。注意,这两个8 位共 */
   6          /*    16位中,只有高1O位有效。测温范围是-55℃~125℃。本程序  */
   7          /*    含有计算温度值和判断温度正负的部分。本程序适合AD7416   */ 
   8          /*    和51系列单片机的连接,晶振为12MHZ左右。                 */
   9          /**************************************************************/
  10          #include "reg52.h"
  11          #include "intrins.h"
  12          
  13          #define uchar unsigned char
  14          #define uint unsigned int
  15          
  16          sbit AD7416_SCL= P1^1;
  17          sbit AD7416_SDA= P1^0;
  18          
  19          uchar AD7416_SystemError;
  20          uint Temperature; //温度
  21          uchar ZorF;       //正还是负
  22          uint tt;
  23          
  24          
  25          AD7416_delay()   //延时程序
  26          {
  27   1      uint i=60;
  28   1      while(i--);
  29   1      }
  30          /*---------------------------------------------
  31          调用方式:void AD7416_I2CStart(void) 
  32          函数说明:提供I2C总线工作时序中的起始位。
  33          ----------------------------------------------*/
  34          void AD7416_I2CStart(void)
  35          {
  36   1      EA=0;
  37   1      AD7416_SDA=1; AD7416_SCL=1; AD7416_delay();
  38   1      AD7416_SDA=0; AD7416_delay();//START
  39   1      AD7416_SCL=0; AD7416_delay();
  40   1      }
  41          
  42          /*---------------------------------------------
  43          调用方式:void AD7416_I2CStop(void) 
  44          函数说明:提供I2C总线工作时序中的停止位。
  45          ----------------------------------------------*/
  46          void AD7416_I2CStop(void)
  47          {
  48   1      AD7416_SCL=0; AD7416_SDA=0; AD7416_delay();
  49   1      AD7416_SCL=1; AD7416_delay();//STOP
  50   1      EA=1;
  51   1      }
  52          
  53          /*---------------------------------------------
  54          调用方式:I2CAck(void) 
  55          函数说明:等待从器件接收方的应答
C51 COMPILER V8.02   AD7416C                                                               08/10/2007 11:57:33 PAGE 2   

  56          -----------------------------------------------*/
  57          AD7416_WaitAck(void)
  58          {
  59   1      uchar errtime=255;//因故障接收方无ACK,超时值为255。
  60   1      AD7416_SDA=1;AD7416_delay();
  61   1      AD7416_SCL=1;AD7416_delay();
  62   1      AD7416_SystemError=0x10;
  63   1      while(AD7416_SDA)
  64   1      { errtime--;
  65   2      if(!errtime)
  66   2      { AD7416_I2CStop();
  67   3      AD7416_SystemError=0x11;
  68   3      return;
  69   3      }
  70   2      }
  71   1      AD7416_SCL=0; AD7416_delay();
  72   1      }
  73          /*-----------------------------------------------------
  74          调用方式:void SendAck(void) 
  75          函数说明:主器件为接收方,从器件为发送方时,非应答信号。
  76          -------------------------------------------------------*/
  77          void AD7416_SendNotAck(void)
  78          {
  79   1      AD7416_SDA=1; AD7416_delay();
  80   1      AD7416_SCL=1; AD7416_delay();
  81   1      AD7416_SCL=0; AD7416_delay();
  82   1      }
  83          /*------------------------------------------------------
  84          调用方式:void I2CSend(uchar ch) 
  85          函数说明:向I2C总线发送8位数据。
  86          -------------------------------------------------------*/
  87          void AD7416_I2CSendByte(uchar ch)
  88          {
  89   1      uchar i=8;
  90   1      while(i--)
  91   1      {
  92   2      AD7416_SCL=0;_nop_(); AD7416_delay();
  93   2      AD7416_SDA=(bit)(ch&0x80); ch<<=1; AD7416_delay();
  94   2      AD7416_SCL=1; AD7416_delay();
  95   2      }
  96   1      AD7416_SCL=0; AD7416_delay();
  97   1      }
  98          /*------------------------------------------------------
  99          调用方式:uchar I2CReceive(void) 
 100          函数说明:从I2C总线上接收8位数据信号, 并将接收到8位数据作为一个字节返回
 101          ----------------------------------------------------*/
 102          uchar AD7416_I2CReceiveByte(void)
 103          {
 104   1      uchar i=8;
 105   1      uchar dat=0;
 106   1      AD7416_SDA=1;
 107   1      while(i--)
 108   1      {
 109   2      dat<<=1;
 110   2      AD7416_SCL=0;AD7416_delay();
 111   2      AD7416_SCL=1;AD7416_delay();
 112   2      dat|=AD7416_SDA;
 113   2      }
 114   1      AD7416_SCL=0; AD7416_delay();
 115   1      return(dat);
 116   1      }
 117          
C51 COMPILER V8.02   AD7416C                                                               08/10/2007 11:57:33 PAGE 3   

 118          /*--------------------------------------------
 119          由CPU给传感器一个低,所以这个ACK是来自CPU的。
 120          ---------------------------------------------*/
 121          AD7416_bitout()
 122          {
 123   1      AD7416_SDA=0; AD7416_delay();
 124   1      AD7416_SCL=0; AD7416_delay();
 125   1      AD7416_SDA=0; AD7416_delay();
 126   1      AD7416_SCL=1; AD7416_delay();
 127   1      AD7416_SCL=0; AD7416_delay();
 128   1      }
 129          
 130          
 131          //读温度传感器
 132          /*-----------------------------------------------------
 133          温度值寄存器是一个16位只读寄存器,它的高10位以2的
 134          补码格式储存由AD转换器送来的10位温度读数。位5至0未用
 135          -128℃ 10 0000 0000
 136          -125℃ 10 0000 1100
 137          -100℃ 10 0111 0000
 138          -75℃ 10 1101 0100
 139          -50℃ 11 0011 1000
 140          -25℃ 11 1001 1100
 141          -0.25℃ 11 1111 1111
 142          0℃ 00 0000 0000
 143          +0.25℃ 00 0000 0001
 144          +10℃ 0 0001 01000
 145          +25℃ 0 0011 00100
 146          +50℃ 0 0110 01000
 147          +75℃ 0 1001 01100
 148          +100℃ 0 1100 10000
 149          +125℃ 0 1111 10100
 150          +127℃ 0 1111 11100
 151          ----------------------------------------------------*/
 152          Read7416(uchar address) //读温度传感器的温度值
 153          {
 154   1      uchar h,l,temp,c;
 155   1      uint wendu;
 156   1      
 157   1      AD7416_I2CStart();
 158   1      AD7416_I2CSendByte(address); //写
 159   1      AD7416_WaitAck();
 160   1      AD7416_I2CSendByte(0x00); //指向温度寄存器
 161   1      AD7416_SendNotAck();
 162   1      AD7416_I2CStop();
 163   1      
 164   1      AD7416_I2CStart();
 165   1      AD7416_I2CSendByte(address+1); //读
 166   1      AD7416_WaitAck();
 167   1      h=AD7416_I2CReceiveByte(); //读高8位
 168   1      AD7416_bitout();           //CUP送低
 169   1      l=AD7416_I2CReceiveByte(); //读低8位
 170   1      AD7416_SendNotAck();
 171   1      AD7416_I2CStop();
 172   1      
 173   1      c=2; //循环两次
 174   1      wendu=h;temp=l;
 175   1      //将高8位和低8位的前2位连接
 176   1      while(c--)
 177   1      {
 178   2      if(temp&0x80)
 179   2      {
C51 COMPILER V8.02   AD7416C                                                               08/10/2007 11:57:33 PAGE 4   

 180   3      wendu<<=1;
 181   3      wendu|=0x0001;
 182   3      }
 183   2      else
 184   2      {
 185   3      wendu<<=1;
 186   3      }
 187   2      }
 188   1                 //判断温度正负
 189   1      if(h&0x80) //负
 190   1      {
 191   2      wendu=wendu-0x01;
 192   2      wendu=~wendu; //变回原码
 193   2      wendu=wendu&0x03FF;
 194   2      wendu=wendu*0.25;
 195   2      Temperature=wendu;
 196   2      ZorF=0;
 197   2      }
 198   1      else //正
 199   1      {
 200   2      wendu=wendu*0.25;
 201   2      Temperature=wendu;
 202   2      ZorF=1;
 203   2      }
 204   1      }
 205          
 206          //设定7416的报警温度上下限OTI和HYST
 207          /*------------------------------------------------------
 208          OTI为上限 HYST为下限,7416做为恒温器使用 OTI必须低有效。
 209          当温度高于OTI值时由OTI脚发出低电平,直到温度低于HYST值
 210          OTI脚才发出高电平。
 211          --------------------------------------------------------*/
 212          Setup7416OTI(uchar OTI,uchar HYST,uchar address)
 213          {
 214   1      uchar a,b;
 215   1      a=OTI; //温度转换
 216   1      a=a*4;
 217   1      a>>=2;
 218   1      
 219   1      b=HYST; //温度转换
 220   1      b=b*4;
 221   1      b>>=2;
 222   1      
 223   1      AD7416_I2CStart();
 224   1      AD7416_I2CSendByte(address);//写
 225   1      AD7416_WaitAck();
 226   1      AD7416_I2CSendByte(0x01);   //指向状态寄存器
 227   1      AD7416_WaitAck();
 228   1      AD7416_I2CSendByte(0x18);
 229   1      AD7416_SendNotAck();
 230   1      AD7416_I2CStop();
 231   1      
 232   1      AD7416_I2CStart();
 233   1      AD7416_I2CSendByte(address); //写
 234   1      AD7416_WaitAck();
 235   1      AD7416_I2CSendByte(0x03);   //指向OTI存器
 236   1      AD7416_WaitAck();
 237   1      AD7416_I2CSendByte(a);      //送温度高8位
 238   1      AD7416_WaitAck();
 239   1      AD7416_I2CSendByte(0x00);  //送温度低8位
 240   1      AD7416_SendNotAck();
 241   1      AD7416_I2CStop();
C51 COMPILER V8.02   AD7416C                                                               08/10/2007 11:57:33 PAGE 5   

 242   1      
 243   1      
 244   1      AD7416_I2CStart();
 245   1      AD7416_I2CSendByte(address); //写
 246   1      AD7416_WaitAck();
 247   1      AD7416_I2CSendByte(0x02); //指向HYST寄存器
 248   1      AD7416_WaitAck();
 249   1      AD7416_I2CSendByte(b);    //送温度高8位
 250   1      AD7416_WaitAck();
 251   1      AD7416_I2CSendByte(0x00); //送温度低8位
 252   1      AD7416_SendNotAck();
 253   1      AD7416_I2CStop();
 254   1      }
 255          void main()                   //主程序
 256          {
 257   1            SP=0xcf;
 258   1            AD7416_delay();
 259   1            EA=0;
 260   1            Read7416(0x90);        //读第1片温度传感器AD7416的温度值
 261   1            tt=Temperature;
 262   1      }
 263          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    462    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6       2
   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 + -