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

📄 ds1631.lst

📁 ds1631温度传感器程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   DS1631                                                                12/18/2006 13:06:56 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE DS1631
OBJECT MODULE PLACED IN C:\DOCUME~1\GMLTT\桌面\WENDU\DS1631.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\GMLTT\桌面\WENDU\DS1631.C DB SB OE

line level    source

   1          
   2          #include <reg52.h>                      // 引用标准库的头文件
   3          #include <intrins.h>
   4          
   5          #define uchar unsigned char
   6          #define uint unsigned int
   7          #define READ  1
   8          #define WRITE 0
   9          
  10          sbit SDA = P1^4;                        // 串行数据
  11          sbit SCL = P1^6;                        // 串行时钟
  12          
  13          uchar idata SLAdd;              // 从器件地址
  14          uchar idata SLAdd1;
  15          uchar idata sbuf[8];            // 数据发送缓冲区
  16          uchar idata rbuf[8];            // 数据接收缓冲区
  17          bit   bdata NACK;               // 器件坏或错误标志位
  18          bit   bdata nackFlag;           // 非应答标志位
  19          bit   ackFlag;                   //应答标志
  20          float temp_c;                // temperature in deg. C
  21          float temp_f;                // temperature in deg. F
  22          unsigned char MSB;            // temp byte MSB
  23          unsigned char LSB;            // temp byte LSB
  24          unsigned char Config;
  25          
  26          /* 延时约5微秒,对于12M时钟 */
  27          void delay5us()
  28          {
  29   1              uint i;
  30   1              for (i=0;i<5;i++)
  31   1                      _nop_();
  32   1      }
  33          /*延时约3微秒,对12M时钟*/
  34          void delay3us()
  35          {
  36   1          uint i;
  37   1              for(i=0;i<3;i++)
  38   1                  _nop_();
  39   1      }
  40          
  41          /* 起始条件子函数:SCL为高电平,SDA产生一个下降沿*/
  42          void start(void)
  43          {
  44   1              SDA = 1;                        // 启动I2C总线
  45   1              SCL = 1;
  46   1              delay5us();
  47   1              SDA = 0;            //SCL为高,SDA出现下降沿后起始条件成立
  48   1              delay5us();
  49   1              SCL = 0;
  50   1              delay3us();
  51   1      }
  52          
  53          /* 停止条件子函数:SCL为高电平,SDA产生一个上升沿 */
  54          void stop(void)
  55          {
C51 COMPILER V7.50   DS1631                                                                12/18/2006 13:06:56 PAGE 2   

  56   1              SDA = 0;                        // 停止I2C总线数据传送
  57   1              SCL = 1;
  58   1              delay5us();
  59   1              SDA = 1;            //SCL为高,SDA出现上升沿后起停止条件成立
  60   1              delay5us();
  61   1              SCL = 0;
  62   1              delay3us();
  63   1      }
  64          
  65          /* 主机发送ACK */
  66          void ack(void)
  67          {
  68   1              SDA = 0;                        // 主机发送应答位
  69   1              SCL = 1;
  70   1              delay5us();
  71   1              SDA = 1;
  72   1              SCL = 0;
  73   1              delay3us();
  74   1      }
  75          
  76          /* 发送非应答子函数 */
  77          void n_ack(void)
  78          {
  79   1              SDA = 1;                        // 发送非应答位
  80   1              SCL = 1;
  81   1              delay5us();
  82   1              SDA = 0;
  83   1              SCL = 0;
  84   1              delay3us();
  85   1      }
  86          
  87          /* 应答位检查子函数 */
  88          void checkack(void)
  89          {
  90   1      
  91   1              SDA = 1;                // 应答位检查(将p1.4设置成输入,必须先向端口写1)
  92   1              _nop_();
  93   1              _nop_();
  94   1              SCL = 1;
  95   1              _nop_();
  96   1              _nop_();
  97   1              _nop_();
  98   1      
  99   1              if(SDA == 1)            // 若SDA=1表明非应答,置位非应答标志F0(F0是程序状态字PSW.5用户可以根据需要置位或者复位)
 100   1                ackFlag = 0;
 101   1              else ackFlag = 1;      //SDA拉低应答
 102   1      
 103   1              SCL = 0;
 104   1              //delay3us();
 105   1      }
 106          
 107          void I2CBitDly(void)                            // wait approximately 4.7uS
 108          {                                               // tune to xtal. This works at 11.0592MHz
 109   1              unsigned int time_end = 10;
 110   1              unsigned int index;
 111   1      
 112   1              for (index = 0; index < time_end; index++);
 113   1              return;
 114   1      }
 115          
 116          /* 发送一个字节数据子函数 */
 117          void sendbyte(uchar idata ch)
C51 COMPILER V7.50   DS1631                                                                12/18/2006 13:06:56 PAGE 3   

 118          {
 119   1              uchar idata n = 8;
 120   1              uchar idata temp;
 121   1              temp = ch;  //8f  1000 1111
 122   1              while(n--)
 123   1              {
 124   2                      if((temp&0x80) == 0x80)    // 若要temp最高位为1则发送1;否则就发送0
 125   2                      {
 126   3                              SDA = 1;       //发送1
 127   3                              SCL = 1;
 128   3                              delay5us();
 129   3                              SDA = 0;
 130   3                              SCL = 0;
 131   3                      }
 132   2                      else
 133   2                      {
 134   3                              SDA = 0;       // 发送0
 135   3                              SCL = 1;
 136   3                              delay5us();
 137   3                              SCL = 0;
 138   3                      }
 139   2                      temp = temp<<1;    // 数据左移一位
 140   2              }
 141   1      
 142   1      }
 143          
 144          
 145          /* 发送n字节数据子程序
 146          void sendnbyte(uchar idata *sla, uchar n)
 147          {
 148                  uchar idata *p;
 149                  start();                                // 发送启动信号
 150                  sendbyte(sla);                  // 发送从器件地址字节,控制字
 151                  checkack();                     // 检查应答位
 152                  if(ackFlag == 0)            // 如果非应答
 153                  {
 154                          NACK = 1;
 155                          return;                     // 若非应答表明器件错误或已坏,置错误标志位NACK
 156                  }
 157                  p = sbuf;               //发送命令字,数据字节
 158          
 159                  while(n--)
 160                  {
 161                          sendbyte(p);
 162                          checkack();         // 检查应答位
 163                          if (ackFlag == 0)
 164                          {
 165                                  NACK=1;
 166                                  return;             // 若非应答表明器件错误或已坏,置错误标志位NACK
 167                          }
 168                          p++;
 169                  }
 170          //      stop();                             // 全部发完则停止
 171          }*/
 172          
 173          
 174          
 175          /* 接收一字节子程序 */
 176          uchar recbyte()
 177          {
 178   1              uchar idata n=8;               // 从SDA线上读取一位数据字节,共8位
 179   1              uchar idata temp = 0;
C51 COMPILER V7.50   DS1631                                                                12/18/2006 13:06:56 PAGE 4   

 180   1              while(n--)
 181   1              {
 182   2                      SDA = 1;
 183   2                      SCL = 1;
 184   2                      temp = temp<<1;          // 左移一位
 185   2                      if(SDA == 1)
 186   2                              temp = temp|0x01;    // 若接收到的数为1,则temp最后一位置1
 187   2                      else
 188   2                              temp = temp&0xfe;    // 否则temp最后一位置0
 189   2                      SCL=0;                   //???
 190   2              }
 191   1              return(temp);
 192   1      }
 193          
 194          
 195          
 196          void I2CSCLHigh(void)    // Set SCL high, and wait for it to go high
 197          {
 198   1              register int err;
 199   1              SCL = 1;
 200   1              while (! SCL)
 201   1              {
 202   2                err++;
 203   2                      if (!err)
 204   2                      {
 205   3                      return;
 206   3                      }
 207   2              }
 208   1      }
 209          
 210          
 211          void I2CSendByte(unsigned char bt)
 212          {
 213   1              register unsigned char i;
 214   1              for (i=0; i<8; i++)
 215   1              {
 216   2                      if (bt & 0x80) SDA = 1; // Send each bit, MSB first changed 0x80 to 0x01
 217   2                      else SDA = 0;
 218   2                      I2CSCLHigh();

⌨️ 快捷键说明

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