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

📄 remote.lst

📁 使用ME300B开发板通过51单片机读取AD数据并通过串口将数据上传到PC
💻 LST
字号:
C51 COMPILER V8.05a   REMOTE                                                               08/15/2008 12:15:21 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE REMOTE
OBJECT MODULE PLACED IN remote.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE remote.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          
   4          sbit SDA=P1^1;                   // 将p1.1口模拟数据口
   5          sbit SCL=P1^0;                   // 将p1.0口模拟时钟口
   6          
   7          #define uchar unsigned char
   8          #define uint  unsigned int
   9          #define disdata  P0              //显示数据码输出口
  10          #define PCF8591_WRITE   0x90
  11          #define PCF8591_READ    0x91
  12          #define  NUM  4                     //接收和发送缓存区的深度
  13          uchar idata receivebuf[NUM];    //数据接收缓冲区
  14          
  15          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  16          bit   bdata SystemError;                //从机错误标志位
  17          
  18          
  19          unsigned char key_s, key_v, tmp;
  20          
  21          char code str[] = "welcome! www.willar.com \n\r";
  22          
  23          
  24          void send_str();
  25          bit     scan_key();
  26          void proc_key();
  27          void delayms(unsigned char ms);
  28          void send_char(unsigned char txd);
  29          
  30          sbit    K1 = P1^4;
  31          
  32          
  33          //-------------------------------------------------------------------
  34          // 函数名称: iic_start()
  35          // 函数功能: 启动I2C总线子程序
  36          //-------------------------------------------------------------------
  37          void iic_start(void)
  38          { //时钟保持高,数据线从高到低一次跳变,I2C通信开始
  39   1              SDA = 1;     
  40   1              SCL = 1;
  41   1              delayNOP();      // 延时5us 
  42   1              SDA = 0;
  43   1              delayNOP();
  44   1          SCL = 0;
  45   1      }
  46          //-------------------------------------------------------------------
  47          // 函数名称: iic_stop()
  48          // 函数功能: 停止I2C总线数据传送子程序
  49          //-------------------------------------------------------------------
  50          void iic_stop(void)
  51          {       
  52   1              SDA = 0;           //时钟保持高,数据线从低到高一次跳变,I2C通信停止
  53   1              SCL = 1;
  54   1              delayNOP();
  55   1              SDA = 1;
C51 COMPILER V8.05a   REMOTE                                                               08/15/2008 12:15:21 PAGE 2   

  56   1              delayNOP();
  57   1          SCL = 0;
  58   1      }
  59          //------------------------------------------------------------------
  60          // 函数名称: iicInit_()
  61          // 函数功能: 初始化I2C总线子程序
  62          //------------------------------------------------------------------
  63           void iicInit(void)
  64             {
  65   1         SCL = 0;
  66   1         iic_stop();  
  67   1         }  
  68          //-------------------------------------------------------------------
  69          // 函数名称: slave_ACK
  70          // 函数功能: 从机发送应答位子程序
  71          //-------------------------------------------------------------------
  72          void slave_ACK(void)
  73          {
  74   1              SDA = 0;  
  75   1              SCL = 1;
  76   1              delayNOP();     
  77   1              SCL = 0;
  78   1      }
  79          //-------------------------------------------------------------------
  80          // 函数名称: slave_NOACK
  81          // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
  82          //-------------------------------------------------------------------
  83          void slave_NOACK(void)
  84          { 
  85   1              SDA = 1;
  86   1              SCL = 1;
  87   1              delayNOP();
  88   1              SDA = 0;
  89   1          SCL = 0;  
  90   1      }
  91          //-------------------------------------------------------------------
  92          // 函数名称: check_ACK
  93          // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
  94          //-------------------------------------------------------------------
  95          void check_ACK(void)
  96          {           
  97   1          SDA = 1;        // 将p1.1设置成输入,必须先向端口写1
  98   1              SCL = 1;
  99   1              F0 = 0;
 100   1              delayNOP();   
 101   1              if(SDA == 1)    // 若SDA=1表明非应答,置位非应答标志F0
 102   1          F0 = 1;
 103   1              SCL = 0;
 104   1      }
 105          //-------------------------------------------------------------------
 106          // 函数名称: IICSendByte
 107          // 入口参数: ch
 108          // 函数功能: 发送一个字节
 109          //-------------------------------------------------------------------
 110          void IICSendByte(uchar ch)
 111           
 112          {
 113   1              unsigned char idata n=8;     // 向SDA上发送一位数据字节,共八位
 114   1      
 115   1              while(n--)
 116   1              { 
 117   2              if((ch&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1
C51 COMPILER V8.05a   REMOTE                                                               08/15/2008 12:15:21 PAGE 3   

 118   2                 {
 119   3                              SDA = 1;    // 传送位1
 120   3                              SCL = 1;
 121   3                          delayNOP();
 122   3                      //      SDA = 0;        
 123   3                              SCL = 0; 
 124   3                 }
 125   2                      else
 126   2                      {  
 127   3                              SDA = 0;    // 否则传送位0
 128   3                              SCL = 1;
 129   3                              delayNOP();
 130   3                              SCL = 0;
 131   3                      }
 132   2                      ch = ch<<1;    // 数据左移一位
 133   2              }
 134   1      }
 135          //-------------------------------------------------------------------
 136          // 函数名称: IICreceiveByte
 137          // 返回接收的数据
 138          // 函数功能: 接收一字节子程序
 139          //-------------------------------------------------------------------
 140          uchar IICreceiveByte(void)
 141          {
 142   1              uchar idata n=8;     // 从SDA线上读取一上数据字节,共八位
 143   1              uchar tdata=0;
 144   1              while(n--)
 145   1              {
 146   2                 SDA = 1;
 147   2                 SCL = 1;
 148   2                 tdata =tdata<<1;                 //左移一位
 149   2                      if(SDA == 1)
 150   2                        tdata = tdata|0x01;   // 若接收到的位为1,则数据的最后一位置1
 151   2                      else 
 152   2                        tdata = tdata&0xfe;   // 否则数据的最后一位置0
 153   2                 SCL = 0;
 154   2               }
 155   1      
 156   1               return(tdata);
 157   1      }
 158          
 159          //-------------------------------------------------------------------
 160          // 函数名称: ADC_PCF8591
 161          // 入口参数: controlbyte控制字
 162          // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
 163          //-------------------------------------------------------------------
 164          void ADC_PCF8591(uchar controlbyte)
 165          { 
 166   1          uchar idata receive_da,i=0;
 167   1      
 168   1              iic_start();
 169   1      
 170   1              IICSendByte(PCF8591_WRITE);     //控制字
 171   1              check_ACK();
 172   1              if(F0 == 1)
 173   1              {
 174   2                      SystemError = 1;
 175   2                      return;
 176   2              }
 177   1      
 178   1              IICSendByte(controlbyte);       //控制字
 179   1              check_ACK();
C51 COMPILER V8.05a   REMOTE                                                               08/15/2008 12:15:21 PAGE 4   

 180   1              if(F0 == 1)
 181   1              {
 182   2                      SystemError = 1;
 183   2                      return;
 184   2              }
 185   1      
 186   1          iic_start();                //重新发送开始命令
 187   1              IICSendByte(PCF8591_READ);      //控制字
 188   1              check_ACK();
 189   1              if(F0 == 1)
 190   1              {
 191   2                      SystemError = 1;
 192   2                      return;
 193   2              }
 194   1               
 195   1          IICreceiveByte();   //空读一次,调整读顺序
 196   1          slave_ACK();        //收到一个字节后发送一个应答位
 197   1      
 198   1              while(i<4)
 199   1              {  
 200   2                receive_da=IICreceiveByte();
 201   2                receivebuf[i++]=receive_da;
 202   2                slave_ACK();       //收到一个字节后发送一个应答位
 203   2              }
 204   1              slave_NOACK();       //收到最后一个字节后发送一个非应答位
 205   1              iic_stop();
 206   1      }
 207          
 208          
 209          main()
 210          {
 211   1              TMOD = 0x20;                    // 定时器1工作于8位自动重载模式, 用于产生波特率
 212   1              TH1 = 0xFD;                             // 波特率9600
 213   1              TL1 = 0xFD;
 214   1              
 215   1              SCON = 0x50;                    // 设定串行口工作方式
 216   1              PCON &= 0xef;                   // 波特率不倍增
 217   1                      
 218   1              TR1 = 1;                                // 启动定时器1
 219   1              IE = 0x0;                               // 禁止任何中断
 220   1              
 221   1              while(1)
 222   1              {
 223   2                      if(RI)                                          // 是否有数据到来
 224   2                      {
 225   3                              RI = 0;
 226   3                              tmp = SBUF;                             // 暂存接收到的数据
 227   3                              P0 = tmp;                               // 数据传送到P0口
 228   3                              //send_char(tmp);                       // 回传接收到的数据
 229   3                      }
 230   2                      if(P0==0x30)
 231   2                      while(1)
 232   2                         { iicInit();               //I2C总线初始化
 233   3                   ADC_PCF8591(0x04);
 234   3                       send_char(receivebuf[1]);    
 235   3                           //delayms(5);
 236   3                               if(RI)                                         // 是否有数据到来
 237   3                               {
 238   4                                    RI = 0;
 239   4                                    tmp = SBUF;                               // 暂存接收到的数据
 240   4                                    P0 = tmp;                         // 数据传送到P0口
 241   4                                    //send_char(tmp);                 // 回传接收到的数据
C51 COMPILER V8.05a   REMOTE                                                               08/15/2008 12:15:21 PAGE 5   

 242   4                               }
 243   3                               //if(P0==0)
 244   3                                   
 245   3                           if(P0==0xff)
 246   3                                   break;
 247   3                         }            
 248   2              }
 249   1      }
 250          
 251          
 252          void send_char(unsigned char txd)
 253          // 传送一个字符
 254          {
 255   1              SBUF = txd;
 256   1              while(!TI);                             // 等特数据传送
 257   1              TI = 0;                                 // 清除数据传送标志
 258   1      } 
 259          
 260          /*void send_str()
 261          // 传送字串
 262          {
 263                  unsigned char i = 0;
 264                  while(str[i] != '\0')
 265                  {
 266                          SBUF = str[i];
 267                          while(!TI);                             // 等特数据传送
 268                          TI = 0;                                 // 清除数据传送标志
 269                          i++;                                    // 下一个字符
 270                  }       
 271          } 
 272          
 273          void delayms(unsigned char ms)  
 274          // 延时子程序
 275          {                                               
 276                  unsigned char i;
 277                  while(ms--)
 278                  {
 279                          for(i = 0; i < 120; i++);
 280                  }
 281          }  */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    323    ----
   CONSTANT SIZE    =     27    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3    ----
   IDATA SIZE       =      4       4
   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 + -