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

📄 at89s51pro.lst

📁 AT89系列单片机ISP在线编程的AT89C2051的源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.08   AT89S51PRO                                                            03/13/2008 14:53:30 PAGE 1   


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

line level    source

   1          ///////////////////////////////////////////////////////////////////////////////////////////////////
   2          //FID=02:AT89S51系列编程器
   3          //实现编程的读,写,擦等细节
   4          //特殊处:采用ISP编程方式,只需对P1.5,P1.6,P1.7,RST引脚控制;用MOSI串行发送命令的同时用MISO接收相关数据
   5          //SCK输出同步时钟脉冲
   6          ///////////////////////////////////////////////////////////////////////////////////////////////////
   7          
   8          #include <e51pro.h>
   9          
  10          #define MOSI    P1_5
  11          #define MISO    P1_6
  12          #define SCK             P1_7
  13          
  14          #define RST     P1_4    
  15          
  16          BYTE OutBuf[4];//发送命令缓冲
  17          BYTE InBuf[4];//接收缓冲
  18          
  19          void SendInstrc(BYTE nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
  20          {
  21   1              BYTE n;
  22   1              for(n=0;n<nByte;n++)//发送nByte个字节
  23   1              {
  24   2                      ACC=OutBuf[n];
  25   2                      SCK=0;
  26   2                      MOSI=A_7;//低电平时输出一位
  27   2                      SCK=1;
  28   2                      B_7=MISO;//高电平时接收一位
  29   2                      SCK=0;
  30   2                      MOSI=A_6;
  31   2                      SCK=1;
  32   2                      B_6=MISO;
  33   2                      SCK=0;
  34   2                      MOSI=A_5;
  35   2                      SCK=1;
  36   2                      B_5=MISO;
  37   2                      SCK=0;
  38   2                      MOSI=A_4;
  39   2                      SCK=1;
  40   2                      B_4=MISO;
  41   2                      SCK=0;
  42   2                      MOSI=A_3;
  43   2                      SCK=1;
  44   2                      B_3=MISO;
  45   2                      SCK=0;
  46   2                      MOSI=A_2;
  47   2                      SCK=1;
  48   2                      B_2=MISO;
  49   2                      SCK=0;
  50   2                      MOSI=A_1;
  51   2                      SCK=1;
  52   2                      B_1=MISO;
  53   2                      SCK=0;
  54   2                      MOSI=A_0;
C51 COMPILER V7.08   AT89S51PRO                                                            03/13/2008 14:53:30 PAGE 2   

  55   2                      SCK=1;
  56   2                      B_0=MISO;
  57   2                      SCK=0;
  58   2                      InBuf[n]=B;
  59   2              }
  60   1      }
  61          
  62          void InitPro02()//编程前的准备工作
  63          {
  64   1      //      SetVpp5V();
  65   1      //      P0=0xff;
  66   1      //      P1=0xff;
  67   1      //      P3=0xff;
  68   1              //P1_3=0;//p1.4接RST
  69   1              //P3_2=1;//p3.2接PROG   //原作如此,此处在K5i是悬空未接,故注销
  70   1              RST=0;
  71   1              Delay_ms(20);
  72   1              RST=1;
  73   1              MOSI=0;
  74   1              MISO=1;
  75   1              SCK=1;
  76   1              Delay_ms(10);
  77   1              nAddress=0x0000;
  78   1              OutBuf[0]=0xac;//正好在这里可以安排DataSheet上所规定的
  79   1              OutBuf[1]=0x53;//Eanable Programming命令
  80   1              OutBuf[2]=0;
  81   1              OutBuf[3]=0;
  82   1              SendInstrc(4);
  83   1      }
  84          
  85          void ProOver02()//编程结束后的工作,设置合适的引脚电平
  86          {
  87   1      //      SetVpp5V();
  88   1      //      P0=0xff;
  89   1      //      P1=0xff;
  90   1      //      P2=0xff;
  91   1      //      P3_6=1;
  92   1      //      P3_7=1;
  93   1      //      P1_3=0;//RST=0;
  94   1      //      P3_2=2;//PROG=0    //原作如此,此处在K5i是悬空未接,故注销
  95   1          RST=1;
  96   1              MOSI=1;
  97   1              MISO=1;
  98   1              SCK=1;
  99   1      
 100   1      }
 101          
 102          BYTE Read02()
 103          {
 104   1              OutBuf[0]=0x20;
 105   1              OutBuf[1]=((BYTE*)&nAddress)[0];
 106   1              OutBuf[2]=((BYTE*)&nAddress)[1];
 107   1              SendInstrc(4);
 108   1              return InBuf[3];
 109   1      }
 110          
 111          void ReadSign02()//读特征字
 112          {
 113   1              InitPro02();//先设置成编程状态
 114   1      //-----------------------------------------------------------------------------
 115   1              //根据器件的DataSheet,设置相应的编程控制信号
 116   1              OutBuf[0]=0x28;
C51 COMPILER V7.08   AT89S51PRO                                                            03/13/2008 14:53:30 PAGE 3   

 117   1              OutBuf[1]=0x00;
 118   1              OutBuf[2]=0x00;
 119   1              OutBuf[3]=0x00;
 120   1              SendInstrc(4);
 121   1              ComBuf[2]=InBuf[3];
 122   1              OutBuf[1]=0x01;
 123   1              SendInstrc(4);
 124   1              ComBuf[3]=InBuf[3];
 125   1              OutBuf[1]=0x02;
 126   1              SendInstrc(4);
 127   1              ComBuf[4]=InBuf[3];
 128   1      //-----------------------------------------------------------------------------
 129   1              ProOver02();
 130   1      }
 131          
 132          void Erase02()//擦除器件
 133          {
 134   1              InitPro02();
 135   1      //-----------------------------------------------------------------------------
 136   1              //根据器件的DataSheet,设置相应的编程控制信号
 137   1              OutBuf[0]=0xac;
 138   1              OutBuf[1]=0x80;
 139   1              SendInstrc(4);
 140   1              Delay_ms(500);  
 141   1      //-----------------------------------------------------------------------------
 142   1              ProOver02();
 143   1      }
 144          
 145          BOOL Write02(BYTE Data)//写器件
 146          {
 147   1      
 148   1      //-----------------------------------------------------------------------------
 149   1              //根据器件的DataSheet,设置相应的编程控制信号
 150   1              //写一个单元
 151   1              OutBuf[0]=0x40;
 152   1              OutBuf[1]=((BYTE*)&nAddress)[0];
 153   1              OutBuf[2]=((BYTE*)&nAddress)[1];
 154   1              OutBuf[3]=Data;
 155   1              SendInstrc(4);
 156   1              nTimeOut=0;
 157   1              while(Read02()!=Data)//效验:循环读,直到读出与写入的数相同
 158   1              {
 159   2                      nTimeOut++;
 160   2                      if(nTimeOut>1000)//超时了
 161   2                      {
 162   3                              return  0;
 163   3                      }
 164   2                                      
 165   2              }
 166   1      //-----------------------------------------------------------------------------
 167   1              return 1;
 168   1      }
 169          
 170          void Lock02()//写锁定位
 171          {
 172   1      //-----------------------------------------------------------------------------
 173   1              //根据器件的DataSheet,设置相应的编程控制信号
 174   1              if(ComBuf[2]>=1)//ComBuf[2]为锁定位
 175   1              {
 176   2                      InitPro02();
 177   2                      OutBuf[0]=0xac;
 178   2                      OutBuf[1]=0xe1;
C51 COMPILER V7.08   AT89S51PRO                                                            03/13/2008 14:53:30 PAGE 4   

 179   2                      SendInstrc(4);
 180   2                      Delay_ms(1);
 181   2              }
 182   1              if(ComBuf[2]>=2)
 183   1              {
 184   2                      InitPro02();
 185   2                      OutBuf[0]=0xac;
 186   2                      OutBuf[1]=0xe2;
 187   2                      SendInstrc(4);
 188   2                      Delay_ms(1);
 189   2              }
 190   1              if(ComBuf[2]==3)
 191   1              {
 192   2                      InitPro02();
 193   2                      OutBuf[0]=0xac;
 194   2                      OutBuf[1]=0xe3;
 195   2                      SendInstrc(4);
 196   2                      Delay_ms(1);
 197   2              }
 198   1      //-----------------------------------------------------------------------------
 199   1              ProOver02();
 200   1      }
 201          
 202          void PreparePro02()//设置pw中的函数指针,让主程序可以调用上面的函数
 203          {
 204   1              pw.fpInitPro=InitPro02;
 205   1              pw.fpReadSign=ReadSign02;

⌨️ 快捷键说明

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