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

📄 e51pro.lst

📁 AT89系列单片机ISP在线编程的AT89C2051的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V7.08   E51PRO                                                                03/22/2008 06:47:24 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE E51PRO
OBJECT MODULE PLACED IN e51pro.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE e51pro.c ROM(SMALL) WARNINGLEVEL(1) OPTIMIZE(5,SIZE) REGFILE(.\E51Pro.ORC) 
                    -BROWSE INCDIR(G:\MCU工程\E51Pro\) DEBUG OBJECTEXTEND CODE

line level    source

   1          //////////////////////////////////////////////////////////////////////////////////////////////////
   2          //E51Pro.c
   3          //Easy 51Pro编程器主程序,负责通讯,管理编程操作
   4          ///////////////////////////////////////////////////////////////////////////////////////////////////
   5          
   6          
   7          ///////////////////////////////////////////////////////////////////////////////////////////////////
   8          //2008-01-05由wangafu修改以下功能:
   9          //适应K5i原理图
  10          //目标芯片仅支持AT89S51/52
  11          //烧写母片采用AT89C2051@11.0592Mhz
  12          //增加AT89C2051为编程模式和红外模式
  13          //编程模式下(ISP_MOD)下AT89C2051只做编程器烧写AT89S51/52
  14          //红外模式下(IRD_MOD)下AT89C2051只做红外遥控器按键
  15          ///////////////////////////////////////////////////////////////////////////////////////////////////
  16          
  17          
  18          //////////////////////////////////////////////////////////////////////////////////////////////////
  19          //目前版本日期为2008-03-13
  20          /////////////////////////////////////////////////////////////////////////////////////////////////
  21          
  22          #include <E51Pro.h>
  23          
  24          BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
  25          UINT nAddress;//ROM中地址计数
  26          UINT nTimeOut;//超时计数
  27          ProWork pw;//编程器一般操作
  28          
  29          
  30          void Delay_us(BYTE nUs)//微秒级延时<255us
  31          {
  32   1              TH0=0;
  33   1              TL0=0;
  34   1              TR0=1;
  35   1              while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值
  36   1              {
  37   2              }
  38   1              TR0=0;
  39   1      }
  40          
  41          void Delay_ms(UINT nMs)//毫秒级的延时<65535ms
  42          {
  43   1              UINT n=0;
  44   1              TR0=1;
  45   1              while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值
  46   1              {
  47   2                      TH0=0;
  48   2                      TL0=20;
  49   2                      while(TH0<4)
  50   2                      {
  51   3                      }
  52   2                      n++;
  53   2              }
  54   1              TR0=0;
C51 COMPILER V7.08   E51PRO                                                                03/22/2008 06:47:24 PAGE 2   

  55   1      }
  56           
  57          BOOL WaitComm()//等待上位机的命令,18字节
  58          {
  59   1              BYTE n=0;
  60   1              RI=0;
  61   1              while(!RI){}//等待第一个字节
  62   1              ComBuf[n]=SBUF;
  63   1              RI=0;
  64   1              n++;
  65   1              for(n;n<=17;n++)
  66   1              {
  67   2                      nTimeOut=0;
  68   2                      while(!RI)
  69   2                      {
  70   3                              nTimeOut++;
  71   3                              if(nTimeOut>10000)//后17个字节都有超时限制 
  72   3                                      return 0;
  73   3                      }
  74   2                      ComBuf[n]=SBUF;
  75   2                      RI=0;
  76   2              }
  77   1              return 1;
  78   1      }
  79          
  80          BOOL WaitResp()//等待上位机回应,1字节,有超时限制 
  81          {
  82   1              nTimeOut=0;
  83   1              RI=0;
  84   1              while(!RI)
  85   1              {
  86   2                      nTimeOut++;
  87   2                      if(nTimeOut>50000) 
  88   2                      {
  89   3                              return 0;
  90   3                      }
  91   2              }
  92   1              RI=0;
  93   1              ComBuf[0]=SBUF;
  94   1              return 1;
  95   1      }
  96          
  97          BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制 
  98          {
  99   1              BYTE n;
 100   1              RI=0;
 101   1              for(n=0;n<=17;n++)
 102   1              {
 103   2                      nTimeOut=0;
 104   2                      while(!RI)
 105   2                      {
 106   3                              nTimeOut++;
 107   3                              if(nTimeOut>10000)
 108   3                              {
 109   4                                      return 0;
 110   4                              }
 111   3                      }
 112   2                      RI=0;
 113   2                      ComBuf[n]=SBUF;
 114   2              }
 115   1              return 1;
 116   1      }
C51 COMPILER V7.08   E51PRO                                                                03/22/2008 06:47:24 PAGE 3   

 117          
 118          void SendData()//发送数据或回应操作完成,18字节
 119          {
 120   1              BYTE n=0;
 121   1              for(n;n<=17;n++)
 122   1              {
 123   2                      TI=0;
 124   2                      SBUF=ComBuf[n];
 125   2                      while(!TI){}
 126   2                      TI=0;
 127   2              }
 128   1      }
 129          
 130          void SendResp()//回应上位机1个字节,在写器件函数中使用
 131          {
 132   1              TI=0;
 133   1              SBUF=ComBuf[0];
 134   1              while(!TI){}
 135   1              TI=0;
 136   1      }
 137          
 138          
 139          
 140          void RstPro()//编程器复位
 141          {
 142   1              pw.fpProOver();//直接编程结束
 143   1              SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同
 144   1      }
 145          
 146          void ReadSign()//读特征字
 147          {
 148   1              pw.fpReadSign();
 149   1              SendData();//通知上位机,送出读出器件特征字
 150   1      }
 151          
 152          void Erase()//擦除器件
 153          {
 154   1              pw.fpErase();
 155   1              SendData();//通知上位机,擦除了器件
 156   1      }
 157          
 158          void Write()//写器件
 159          {
 160   1              BYTE n;
 161   1              pw.fpInitPro();//编程前的准备工作
 162   1              SendData();//回应上位机表示进入写器件状态,可以发来数据
 163   1              while(1)
 164   1              {
 165   2                      if(WaitData())//如果等待数据成功
 166   2                      {
 167   3                              if(ComBuf[0]==0x07)//判断是否继续写
 168   3                              {
 169   4                                      for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
 170   4                                      {
 171   5                                              if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
 172   5                                              {
 173   6                                                      pw.fpProOver();//出错了就结束编程
 174   6                                                      ComBuf[0]=0xff;
 175   6                                                      SendResp();//回应上位机一个字节,表示写数据出错了
 176   6                                                      WaitData();//等待上位机的回应后就结束
 177   6                                                      return; 
 178   6                                              }
C51 COMPILER V7.08   E51PRO                                                                03/22/2008 06:47:24 PAGE 4   

 179   5                                              nAddress++;//下一个单元
 180   5                                      }
 181   4                                      ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
 182   4                                      SendResp();
 183   4                              }
 184   3                              else if(ComBuf[0]==0x00)//写器件结束
 185   3                                      break;
 186   3                              else//可能是通讯出错了
 187   3                              {
 188   4                                      pw.fpProOver();
 189   4                                      return;
 190   4                              }
 191   3                      }
 192   2                      else//等待数据失败
 193   2                      {
 194   3                              pw.fpProOver();
 195   3                              return;
 196   3                      }
 197   2              }
 198   1              pw.fpProOver();//编程结束后的工作
 199   1              Delay_ms(50);//延时等待上位机写线程结束
 200   1              ComBuf[0]=0;//通知上位机编程器进入就绪状态
 201   1              SendData();
 202   1      }
 203          
 204          void Read()//读器件
 205          {
 206   1              BYTE n;
 207   1              pw.fpInitPro();//先设置成编程状态
 208   1              SendData();//回应上位机表示进入读状态
 209   1              while(1)
 210   1              {
 211   2                      if(WaitResp())//等待上位机回应1个字节
 212   2                      {
 213   3                              if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
 214   3                              {
 215   4                                      break;
 216   4                              }
 217   3                              else if(ComBuf[0]==0xff)//0xff表示重发
 218   3                              {
 219   4                                      nAddress=nAddress-0x0010;
 220   4                              }
 221   3                              for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
 222   3                              {
 223   4                                      ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
 224   4                                      nAddress++;//下一个单元
 225   4                              }
 226   3                              ComBuf[0]=6;//向上位机发送读出的数据块
 227   3                              SendData();
 228   3                      }
 229   2                      else
 230   2                              break;//等待回应失败    
 231   2      
 232   2              }
 233   1              pw.fpProOver();//操作结束设置为运行状态
 234   1              ComBuf[0]=0;//通知上位机编程器进入就绪状态
 235   1              SendData();
 236   1      }
 237          
 238          void Lock()//写锁定位
 239          {
 240   1              pw.fpLock();
C51 COMPILER V7.08   E51PRO                                                                03/22/2008 06:47:24 PAGE 5   

 241   1              SendData();
 242   1      }
 243          
 244          ///////////////////////////////////////////////////////////////////////////////////////////////////
 245          //所支持的FID,请在这里继续添加
 246          ///////////////////////////////////////////////////////////////////////////////////////////////////
 247          //extern void PreparePro00();//FID=00:AT89C51编程器
 248          //extern void PreparePro01();//FID=01:AT89C2051编程器
 249          
 250          extern void PreparePro02();//FID=02:AT89S51编程器
 251          
 252          //Only For K5i define
 253          #define IRD_LED P1_1
 254          #define ISP_LED P1_2         //for test
 255          
 256          #define ISP_XY  P1_3      //模式控制输出引脚 ISP_MOD : ISP_XY=0 / IRD_MOD :ISP_XY=1
 257          
 258          #define ISP_SL  P3_2      //模式选择输入引脚 ISP_SL=0: ISP_MOD  / ISP_SL=1:IRD_MOD
 259          
 260          #define IRD_K1    P3_3
 261          #define IRD_K2    P3_4
 262          #define IRD_K3    P3_5
 263          #define IRD_K4    P3_7
 264          
 265          #define T_K1    32      //K1按键按下后,IRD_LED发送的脉冲数

⌨️ 快捷键说明

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