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

📄 ad.lst

📁 手把手教你单片机
💻 LST
字号:
C51 COMPILER V8.02   AD                                                                    09/28/2011 09:35:49 PAGE 1   


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

line level    source

   1          /*
   2           * AD PCF8591
   3           *
   4           * 旋转电位器,串口助手将收到不同的数据
   5          */
   6          
   7          #include <reg51.h>
   8          #include <intrins.h>
   9          
  10          typedef unsigned char uint8;
  11          typedef unsigned int uint16;
  12          
  13          #define SLAVEADDR  0x90
  14          #define nops()  do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0) //定义空指令
  15          
  16          
  17          sbit SCL = P3^7;       //I2C  时钟 
  18          sbit SDA = P3^6;       //I2C  数据 
  19          
  20          void delay(uint16 n)
  21          {
  22   1              while (n--);
  23   1      }
  24          /**
  25           * 函数: i2c_start()
  26           * 功能: 启动i2c
  27          */
  28          void i2c_start()
  29          {
  30   1              SCL = 1;
  31   1              nops();
  32   1              SDA = 1;
  33   1              nops();
  34   1              SDA = 0;
  35   1              nops();
  36   1              SCL = 0;
  37   1      }
  38          
  39          /**
  40           * 函数: i2c_stop()
  41           * 功能: 停止i2c
  42          */
  43          void i2c_stop()
  44          {
  45   1              SCL = 0;
  46   1              nops();
  47   1              SDA = 0;
  48   1              nops();
  49   1              SCL = 1;
  50   1              nops();
  51   1              SDA = 1;
  52   1              nops();
  53   1      }
  54          
  55          /**
C51 COMPILER V8.02   AD                                                                    09/28/2011 09:35:49 PAGE 2   

  56           * 函数: i2c_ACK(bit ck)
  57           * 功能: ck为1时发送应答信号ACK,
  58           *       ck为0时不发送ACK
  59          */
  60          void i2c_ACK(bit ck)
  61          {
  62   1          if (ck)
  63   1                      SDA = 0;
  64   1          else
  65   1                      SDA = 1;
  66   1          nops();
  67   1          SCL = 1;
  68   1          nops();
  69   1          SCL = 0;
  70   1              nops();
  71   1          SDA = 1;
  72   1          nops();
  73   1      }
  74          
  75          /**
  76           * 函数: i2c_waitACK()
  77           * 功能: 返回为0时收到ACK
  78           *       返回为1时没收到ACK
  79          */
  80          bit i2c_waitACK()
  81          {
  82   1              SDA = 1;
  83   1              nops();
  84   1              SCL = 1;
  85   1              nops();
  86   1              if (SDA)
  87   1              {   
  88   2                      SCL = 0;
  89   2                      i2c_stop();
  90   2                      return 1;
  91   2              }
  92   1              else
  93   1              {  
  94   2                      SCL = 0;
  95   2                      return 0;
  96   2              }
  97   1      }
  98          
  99          /**
 100           * 函数: i2c_sendbyte(uint8 bt)
 101           * 功能: 将输入的一字节数据bt发送
 102          */
 103          void i2c_sendbyte(uint8 bt)
 104          {
 105   1          uint8 i;
 106   1          
 107   1          for(i=0; i<8; i++)
 108   1          {  
 109   2              if (bt & 0x80) 
 110   2                              SDA = 1;
 111   2              else 
 112   2                              SDA = 0;
 113   2              nops();
 114   2              SCL = 1;
 115   2              bt <<= 1;
 116   2              nops();       
 117   2              SCL = 0;
C51 COMPILER V8.02   AD                                                                    09/28/2011 09:35:49 PAGE 3   

 118   2          }
 119   1      }
 120          
 121          /**
 122           * 函数: i2c_recbyte( )
 123           * 功能: 从总线上接收1字节数据
 124          */
 125          uint8 i2c_recbyte()
 126          {
 127   1              uint8 dee, i;
 128   1              
 129   1              for (i=0; i<8; i++)
 130   1              {
 131   2                      SCL = 1;    
 132   2                      nops();
 133   2                      dee <<= 1;
 134   2                      if (SDA) 
 135   2                              dee = dee | 0x01;
 136   2                      SCL = 0;
 137   2                      nops();
 138   2              }
 139   1              
 140   1              return dee;
 141   1      }
 142          
 143          /**
 144           * 函数: i2c_readbyte
 145           * 输入: addr
 146           * 功能: 读出一字节数据
 147           * 返回值: 0->成功  1->失败
 148          */
 149          bit i2c_readbyte(uint8 com, uint8 *dat)
 150          {       
 151   1              i2c_start();
 152   1              i2c_sendbyte(SLAVEADDR);    //地址
 153   1          if (i2c_waitACK())
 154   1                      return 1;
 155   1              i2c_sendbyte(com);        //控制字节
 156   1          if (i2c_waitACK())
 157   1                      return 1;
 158   1              i2c_start();
 159   1              i2c_sendbyte(SLAVEADDR+1); //地址
 160   1          if (i2c_waitACK())
 161   1                      return 1;
 162   1              *dat = i2c_recbyte();      //读数据
 163   1              i2c_ACK(0);                //因为只读一字节数据,不发送ACK信号
 164   1              i2c_stop();   
 165   1              
 166   1              return 0;
 167   1      }
 168          
 169          /**
 170           * UART初始化
 171           * 波特率:9600
 172          */
 173          void uart_init(void)
 174          {
 175   1          ET1=0;
 176   1          TMOD = 0x21;        // 定时器1工作在方式2(自动重装)
 177   1          SCON = 0x50;        // 10位uart,允许串行接受
 178   1      
 179   1          TH1 = 0xFD;
C51 COMPILER V8.02   AD                                                                    09/28/2011 09:35:49 PAGE 4   

 180   1          TL1 = 0xFD;
 181   1      
 182   1          TR1 = 1;
 183   1      }
 184          
 185          /**
 186           * UART 发送一字节
 187          */
 188          void UART_Send_Byte(uint8 dat)
 189          {
 190   1              SBUF = dat;
 191   1              while (TI == 0);
 192   1              TI = 0;
 193   1      }
 194          
 195          
 196          main()
 197          {
 198   1              uint8 ans;
 199   1      
 200   1              uart_init();
 201   1      
 202   1              while(1)
 203   1              {
 204   2      
 205   2                      i2c_readbyte(0x40, &ans);
 206   2                  
 207   2                      UART_Send_Byte(ans);
 208   2                      delay(50000);
 209   2              }
 210   1      }


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


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

⌨️ 快捷键说明

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