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

📄 at89s52.lst

📁 制作编程器Easy 51串行编程器源程序C
💻 LST
字号:
C51 COMPILER V7.01  AT89S52                                                                03/09/2008 14:28:43 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE AT89S52
OBJECT MODULE PLACED IN AT89S52.OBJ
COMPILER INVOKED BY: D:\c51\C51\BIN\C51.EXE AT89S52.c BROWSE DEBUG OBJECTEXTEND TABS(10)

stmt 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          BYTE OutBuf[4];//发送命令缓冲
  15          BYTE InBuf[4];//接收缓冲
  16          
  17          void SendInstrc(BYTE nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
  18          {
  19   1                BYTE n;
  20   1                for(n=0;n<nByte;n++)//发送nByte个字节
  21   1                {
  22   2                          ACC=OutBuf[n];
  23   2                          SCK=0;
  24   2                          MOSI=A_7;//低电平时输出一位
  25   2                          SCK=1;
  26   2                          B_7=MISO;//高电平时接收一位
  27   2                          SCK=0;
  28   2                          MOSI=A_6;
  29   2                          SCK=1;
  30   2                          B_6=MISO;
  31   2                          SCK=0;
  32   2                          MOSI=A_5;
  33   2                          SCK=1;
  34   2                          B_5=MISO;
  35   2                          SCK=0;
  36   2                          MOSI=A_4;
  37   2                          SCK=1;
  38   2                          B_4=MISO;
  39   2                          SCK=0;
  40   2                          MOSI=A_3;
  41   2                          SCK=1;
  42   2                          B_3=MISO;
  43   2                          SCK=0;
  44   2                          MOSI=A_2;
  45   2                          SCK=1;
  46   2                          B_2=MISO;
  47   2                          SCK=0;
  48   2                          MOSI=A_1;
  49   2                          SCK=1;
  50   2                          B_1=MISO;
  51   2                          SCK=0;
  52   2                          MOSI=A_0;
  53   2                          SCK=1;
  54   2                          B_0=MISO;
  55   2                          SCK=0;
C51 COMPILER V7.01  AT89S52                                                                03/09/2008 14:28:43 PAGE 2   

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

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

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


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


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

⌨️ 快捷键说明

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