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

📄 text.lst

📁 关于51单片机DS18B20的驱动程序
💻 LST
字号:
C51 COMPILER V7.50   TEXT                                                                  02/04/2008 11:15:04 PAGE 1   


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

line level    source

   1          /********************************************************************************************
   2          * 文 件 名:test.c
   3          * 功    能:I2C总线实验(AT24C02读写实验)。
   4          * 硬件条件:1.CPU型号:AT89S52
   5          *           2.晶振:12.0000MHz
   6          *           3.用跳线帽短接SCL__P3.6
   7          *           4.用跳线帽短接SDA__P3.7
   8          *           5.用跳线帽短接BEEP__P1.1
   9          * 作    者:韩泉城
  10          *********************************************************************************************/
  11          #include "reg52.h"                               // 包含头文件    
  12          
  13          /* 与编译器无关的数据类型定义 */
  14          /********************************************************************************************/
  15          typedef unsigned char      uint8;                // 无符号8位整型变量
  16          typedef signed   char      int8;                 // 有符号8位整型变量
  17          typedef unsigned short     uint16;               // 无符号16位整型变量
  18          typedef signed   short     int16;                // 有符号16位整型变量
  19          typedef unsigned long      uint32;               // 无符号32位整型变量
  20          typedef signed   long      int32;                // 有符号32位整型变量
  21          typedef float              fp32;                 // 单精度浮点数(32位长度)
  22          typedef double             fp64;                 // 双精度浮点数(64位长度)
  23          /********************************************************************************************/
  24          
  25          sbit P1_1 = P1 ^ 1;                              // 定义位变量                              
  26          
  27          #define BEEP_ON()        (P1_1=0)                // 定义"BEEP_ON()"为P1.1输出低电平,控制蜂鸣器蜂鸣
  28          #define BEEP_OFF()       (P1_1=1)                // 定义"BEEP_OFF()"为P1.1输出高电平,控制蜂鸣器不蜂鸣
  29          
  30          
  31          /* 定义器件在I2C总线中的地址 */
  32          #define AT24C02_WriteDeviceAddress 0xa0
  33          #define AT24C02_ReadDeviceAddress  0xa1
  34          
  35          /* 定义位变量 */
  36          sbit SCL=P3^6;                                   // I2C总线的时钟信号
  37          sbit SDA=P3^7;                                   // I2C总线的数据信号
  38          
  39          #define TRUE        1
  40          #define FALSE       0
  41          
  42          #define I2C_DelayTime 60                         // 不要小于50,否则可能造成时序混乱
  43          
  44          /********************************************************************************************
  45          * 函数名称:Delay()
  46          * 功    能:软件延时
  47          * 入口参数:count    延时参数,值越大,延时越长
  48          * 出口参数:无
  49          *********************************************************************************************/
  50          void Delay(uint16 count)
  51          {
  52   1        uint8 i;                
  53   1      
  54   1        while(--count != 0)        
  55   1                {
C51 COMPILER V7.50   TEXT                                                                  02/04/2008 11:15:04 PAGE 2   

  56   2                  for(i = 0; i < 125; i++);                // ";" 表示空语句,CPU空转。
  57   2                }                                                      // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
  58   1      }
  59          
  60          /********************************************************************************************
  61          * 函数名称:I2C_Delay()
  62          * 功    能:I2C总线软件延时
  63          * 入口参数:count    延时参数,值越大,延时越长
  64          * 出口参数:无
  65          *********************************************************************************************/
  66          void I2C_Delay(uint16 count)
  67          {
  68   1        while(count!=0) count--;
  69   1      }
  70          
  71          /********************************************************************************************
  72          * 函数名称:I2C_Start()
  73          * 功    能:启动I2C总线
  74          * 入口参数:无
  75          * 出口参数:无
  76          *********************************************************************************************/
  77          void I2C_Start(void)
  78          {
  79   1        SDA=1; 
  80   1        SCL=1; 
  81   1        I2C_Delay(I2C_DelayTime);
  82   1        SDA=0; 
  83   1        I2C_Delay(I2C_DelayTime);
  84   1        SCL=0;
  85   1        I2C_Delay(I2C_DelayTime);
  86   1      }
  87          
  88          /********************************************************************************************
  89          * 函数名称:I2C_Stop()
  90          * 功    能:终止I2C总线
  91          * 入口参数:无
  92          * 出口参数:无
  93          *********************************************************************************************/
  94          void I2C_Stop(void)
  95          {
  96   1        SDA=0;
  97   1        SCL=1;
  98   1        I2C_Delay(I2C_DelayTime);
  99   1        SDA=1;
 100   1        I2C_Delay(I2C_DelayTime);
 101   1        SCL=0;
 102   1        I2C_Delay(I2C_DelayTime);
 103   1      }
 104          
 105          /********************************************************************************************
 106          * 函数名称:I2C_Send_Bit_0()
 107          * 功    能:发送比特0
 108          * 入口参数:无
 109          * 出口参数:无
 110          *********************************************************************************************/
 111          void I2C_Send_Bit_0(void)
 112          {
 113   1        SDA=0;
 114   1        SCL=1;
 115   1        I2C_Delay(I2C_DelayTime);
 116   1        SCL=0;
 117   1        I2C_Delay(I2C_DelayTime);
C51 COMPILER V7.50   TEXT                                                                  02/04/2008 11:15:04 PAGE 3   

 118   1      }
 119          
 120          /********************************************************************************************
 121          * 函数名称:I2C_Send_Bit_1()
 122          * 功    能:发送比特1
 123          * 入口参数:无
 124          * 出口参数:无
 125          *********************************************************************************************/
 126          void I2C_Send_Bit_1(void)
 127          {
 128   1        SDA=1;
 129   1        SCL=1;
 130   1        I2C_Delay(I2C_DelayTime);
 131   1        SCL=0;
 132   1        I2C_Delay(I2C_DelayTime);
 133   1      }
 134          
 135          /********************************************************************************************
 136          * 函数名称:I2C_Check_Ack()
 137          * 功    能:发送完一个字节后检验设备的应答信号
 138          * 入口参数:无
 139          * 出口参数:返回值为True,成功
 140          *           返回值为False,失败
 141          *********************************************************************************************/
 142          bit I2C_Check_Ack(void)
 143          {
 144   1        SDA=1;
 145   1        SCL=1;
 146   1        I2C_Delay(I2C_DelayTime/2);
 147   1        F0=SDA;
 148   1        I2C_Delay(I2C_DelayTime/2);
 149   1        SCL=0;
 150   1        I2C_Delay(I2C_DelayTime);
 151   1        if(F0==1)     return FALSE;
 152   1        
 153   1        return TRUE;
 154   1      }
 155          
 156          /********************************************************************************************
 157          * 函数名称:I2C_Write8Bit()
 158          * 功    能:向I2C总线写入8bit数据
 159          * 入口参数:I2C_data     将要写入I2C总线的8bit数据 
 160          * 出口参数:无
 161          *********************************************************************************************/
 162          void I2C_Write8Bit(uint8 I2C_data)reentrant
 163          {
 164   1        uint8 i;
 165   1        
 166   1        for(i=0;i<8;i++)
 167   1          {
 168   2                if((I2C_data<<i)&0x80)
 169   2              I2C_Send_Bit_1();
 170   2            else
 171   2              I2C_Send_Bit_0();
 172   2          }
 173   1      }
 174          
 175          /********************************************************************************************
 176          * 函数名称:I2C_Read8Bit()
 177          * 功    能:从I2C总线接收8bit数据
 178          * 入口参数:无
 179          * 出口参数:返回值为从I2C总线上接收到的8bit数据
C51 COMPILER V7.50   TEXT                                                                  02/04/2008 11:15:04 PAGE 4   

 180          *********************************************************************************************/
 181          uint8 I2C_Read8Bit(void)reentrant
 182          {
 183   1        uint8 I2C_data=0,i;
 184   1        
 185   1        for(i=0;i<8;i++)
 186   1          {
 187   2                SDA=1;    
 188   2            SCL=1;    
 189   2            I2C_Delay(10);
 190   2            F0=SDA;
 191   2            I2C_Delay(10);
 192   2            SCL=0;
 193   2            if(F0==1)
 194   2             {
 195   3               I2C_data=I2C_data<<1;
 196   3               I2C_data=I2C_data|0x01;
 197   3             }
 198   2            else
 199   2              I2C_data=I2C_data<<1;
 200   2          }
 201   1          return I2C_data;
 202   1      }
 203          
 204          /********************************************************************************************
 205          * 函数名称:AT24C02_Write1Byte()
 206          * 功    能:向AT24C02指定地址上写入1字节数据
 207          * 入口参数:AT24C02_Address   AT24C02内的地址
 208          *           AT24C02_1Byte     将要写入AT24C02的1字节数据
 209          * 出口参数:无
 210          *********************************************************************************************/
 211          void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)
 212          {
 213   1        bit AckTemp=1;
 214   1        
 215   1        I2C_Start();
 216   1        I2C_Write8Bit(AT24C02_WriteDeviceAddress);
 217   1        AckTemp=I2C_Check_Ack();
 218   1        I2C_Write8Bit(AT24C02_Address);                   
 219   1        AckTemp=I2C_Check_Ack();
 220   1        I2C_Write8Bit(AT24C02_1Byte);                 
 221   1        AckTemp=I2C_Check_Ack();
 222   1        I2C_Stop();
 223   1      }
 224          
 225          /********************************************************************************************
 226          * 函数名称:AT24C02_Read1Byte()
 227          * 功    能:从AT24C02指定地址上读出1字节数据
 228          * 入口参数:AT24C02_Address   AT24C02内的地址
 229          * 出口参数:从AT24C02指定地址上读出的1字节数据
 230          *********************************************************************************************/
 231          uint8 AT24C02_Read1Byte(uint8 AT24C02_Address)
 232          {    
 233   1        bit AckTemp=1;
 234   1        uint8 AT24C02_1Byte;
 235   1      
 236   1        I2C_Start();
 237   1        I2C_Write8Bit(AT24C02_WriteDeviceAddress);
 238   1        AckTemp=I2C_Check_Ack();
 239   1        I2C_Write8Bit(AT24C02_Address);
 240   1        AckTemp=I2C_Check_Ack();
 241   1        I2C_Start();
C51 COMPILER V7.50   TEXT                                                                  02/04/2008 11:15:04 PAGE 5   

 242   1        I2C_Write8Bit(AT24C02_ReadDeviceAddress);
 243   1        AckTemp=I2C_Check_Ack();
 244   1        AT24C02_1Byte=I2C_Read8Bit();
 245   1        AckTemp=I2C_Check_Ack();
 246   1        I2C_Stop();
 247   1      
 248   1        return AT24C02_1Byte;
 249   1      }
 250          
 251          /********************************************************************************************
 252          * 函数名称:main()
 253          * 功    能:写一字节数据0xaa到AT24C02的地址0x02并读回校验,若校验通过,则蜂鸣器响一声;否则,
 254          *           蜂鸣器连续报警。
 255          *********************************************************************************************/          
 256          void main (void)                
 257          {
 258   1        BEEP_OFF();                                    // 蜂鸣器不蜂鸣
 259   1      
 260   1        AT24C02_Write1Byte(0x02,0xaa);                 // 向AT24C02的地址0x02写入0xaa
 261   1      
 262   1        if(AT24C02_Read1Byte(0x02)==0xaa)              // 从AT24C02的地址0x02读出数据,判断是否等于0xaa
 263   1          {                                            // 若相等,则蜂鸣器响一声  
 264   2                BEEP_ON();                                 
 265   2                Delay(300);
 266   2                BEEP_OFF();
 267   2              }
 268   1        else                                           // 若不相等,则蜂鸣器连续报警
 269   1          {
 270   2                while(1)
 271   2                    {
 272   3                          BEEP_ON();
 273   3                      Delay(100);
 274   3                      BEEP_OFF();
 275   3                              Delay(100);
 276   3                        }
 277   2              }
 278   1        
 279   1        while(1);
 280   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    420    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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