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

📄 main.lst

📁 本程序为89S52的IAP下载监控程序
💻 LST
字号:
C51 COMPILER V7.07   MAIN                                                                  06/01/2004 12:59:40 PAGE 1   


C51 COMPILER V7.07, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: c:\Keil7\C51\BIN\C51.EXE main.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //**********************************************************************************
   2          //本函数模块89S52的IAP下载监控程序,作者聂小猛(丁丁),主页地址http://www.mcu51.com
   3          //本程序为89S52的IAP下载监控程序,可使用89C2051,89C51,89C52等等51单片机做监控芯片。
   4          //P10-P13接89s52的IAP接口,具体见程序中的定义。
   5          //监控芯片的串口经232电平转换接电脑串口,计算机使用串口调试工具控制烧写过程,如sscom32。
   6          //本工具操作简单,只需按照监控程序返回到计算机的提示操作即可。
   7          //本工具有检测设备连接,烧写,擦除,读出,复位目标单片机运行,等功能。
   8          //本工具可以从程序运行状态直接进行烧写等动作,烧完后发指令直接运行,可用在远程升级场合。
   9          //本工具烧写速度极快,通讯波特率38400bps,烧写整片89s52的8K程序仅需5.7秒!
  10          //"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途!
  11          //**********************************************************************************
  12          #define uchar unsigned char
  13          #define uint  unsigned int
  14          #define ulong unsigned long
  15          #include <reg52.h>
  16          
  17          //定义控制IAP烧写的IO脚
  18          sbit SRST=P1^0;  //控制器发出复位信号
  19          sbit SCLK=P1^1;  //控制器发出时钟信号 
  20          sbit SDOUT=P1^3; //控制器发出命令
  21          sbit SDIN=P1^2;  //控制器接收数据
  22          
  23          extern char getbyte(void);//从串口取一个字节
  24          extern putbyte(char c);//发送一个字节
  25          extern putstring(uchar  *puts);//发送一个字符串到串口
  26          extern puthex(uchar c);//发送一个字节的hex码,分成两个字节发。
  27          #define CR putstring("\r\n")//发送一个回车换行
  28          extern void serial_init (void);
  29          uchar code help[]="\r\n\r\nISP of AT89S52 bye DingDing(丁丁),WWW.MCU51.COM"
  30                                          "\r\n-----------------------------------------------"
  31                                          "\r\n'r'-read eprom"
  32                                          "\r\n'w'-write data to 89S52"
  33                                          "\r\n'e'-chip erase"
  34                                          "\r\n'g'-Run 89s52\r\n\r\n";
  35          //**************************************
  36          //使能ISP,同时检测设备是否准备好
  37          uchar bdata DATAOUT;
  38          sbit BITOUT=DATAOUT^7;
  39          sbit BITIN=DATAOUT^0;
  40          void enable(void)
  41          {
  42   1              uchar i;
  43   1              uint n;
  44   1              P1=0xff;
  45   1              SCLK=0;
  46   1              SRST=0;  
  47   1              for(n=0;n<1000;n++);
  48   1              SRST=1;  //拉高S52的RST脚
  49   1              for(n=0;n<1000;n++);
  50   1              
  51   1              DATAOUT=0xac;//10101100
  52   1              for(i=0;i<8;i++)        
  53   1              {
  54   2                      SDOUT=BITOUT;
  55   2                      SCLK=1;SCLK=1;
C51 COMPILER V7.07   MAIN                                                                  06/01/2004 12:59:40 PAGE 2   

  56   2                      SCLK=0;SCLK=0;
  57   2                      DATAOUT=DATAOUT<<1;
  58   2              }
  59   1      
  60   1              DATAOUT=0x53;//01010011
  61   1              for(i=0;i<8;i++)        
  62   1              {
  63   2                      SDOUT=BITOUT;
  64   2                      SCLK=1;SCLK=1;
  65   2                      SCLK=0;SCLK=0;
  66   2                      DATAOUT=DATAOUT<<1;
  67   2              }
  68   1      
  69   1              for(i=0;i<8;i++)        
  70   1              {
  71   2                      SCLK=1;SCLK=1;
  72   2                      SCLK=0;SCLK=0;
  73   2              }
  74   1      
  75   1              for(i=0;i<8;i++)
  76   1              {
  77   2                      DATAOUT=DATAOUT<<1; //移位8次取到采样的值
  78   2                      BITIN=SDIN;
  79   2                      SCLK=1;SCLK=1;
  80   2                      SCLK=0;SCLK=0;
  81   2              }
  82   1              if(DATAOUT==0x69)putstring("89S52 device ready! \r\n");
  83   1              else putstring("Device ERROR!!!!!!!!!!!!! \r\n");
  84   1      }
  85          //********************************
  86          //片擦
  87          void chiperase(void)
  88          {
  89   1              uchar i;
  90   1              ulong n;
  91   1              
  92   1              DATAOUT=0xac;//10101100
  93   1              for(i=0;i<8;i++)        
  94   1              {
  95   2                      
  96   2                      SDOUT=BITOUT;
  97   2                      SCLK=1;SCLK=1;
  98   2                      SCLK=0;SCLK=0;
  99   2                      DATAOUT=DATAOUT<<1;
 100   2              }
 101   1      
 102   1              DATAOUT=0x80;//100XXXXX
 103   1              for(i=0;i<8;i++)        
 104   1              {
 105   2                      
 106   2                      SDOUT=BITOUT;
 107   2                      SCLK=1;SCLK=1;
 108   2                      SCLK=0;SCLK=0;
 109   2                      DATAOUT=DATAOUT<<1;
 110   2              }
 111   1              for(i=0;i<16;i++)       
 112   1              {
 113   2                      SCLK=1;SCLK=1;
 114   2                      SCLK=0;SCLK=0;
 115   2              }
 116   1              for(n=0;n<0x2000;n++);
 117   1              putstring("Erased OK!\r\n");
C51 COMPILER V7.07   MAIN                                                                  06/01/2004 12:59:40 PAGE 3   

 118   1      }
 119          //*********************************
 120          //读89s52中的内容并输出到串口
 121          readeprom()
 122          {
 123   1              uchar i;
 124   1              uint n,n_all;
 125   1              for(n_all=0;n_all<0x2000;)
 126   1              {
 127   2                      DATAOUT=0x30;//00110000
 128   2                      for(i=0;i<8;i++)        
 129   2                      {
 130   3                              SDOUT=BITOUT;
 131   3                              SCLK=1;SCLK=1;
 132   3                              SCLK=0;SCLK=0;
 133   3                              DATAOUT=DATAOUT<<1;
 134   3                      }
 135   2                      DATAOUT=n_all/256;//XXX00000
 136   2                      for(i=0;i<8;i++)        
 137   2                      {
 138   3                              SDOUT=BITOUT;
 139   3                              SCLK=1;SCLK=1;
 140   3                              SCLK=0;SCLK=0;
 141   3                              DATAOUT=DATAOUT<<1;
 142   3                      }
 143   2                      for(n=0;n<256;n++)
 144   2                      {
 145   3                              for(i=0;i<8;i++)
 146   3                              {
 147   4                                      DATAOUT=DATAOUT<<1; //移位8次取到采样的值
 148   4                                      BITIN=SDIN;
 149   4                                      SCLK=1;SCLK=1;
 150   4                                      SCLK=0;SCLK=0;
 151   4                              }
 152   3                              if(n%16==0){CR;puthex(n_all/256);puthex(n_all%256);putbyte(':');}
 153   3                              puthex(DATAOUT);
 154   3                              n_all++;
 155   3                      }
 156   2                      if(RI){getbyte();putstring(help);return;}
 157   2              }
 158   1              putstring(help);
 159   1      }
 160          //***********************************
 161          //将两个HEX字节转换成一个字节   (2 hexbytes = 1 byte)
 162          uchar code hex_c[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,10,11,12,13,14,15};             
 163          uchar hextochar(uchar c0,c1)
 164          {
 165   1              return((hex_c[c0-0x30]<<4)+hex_c[c1-0x30]);
 166   1      }
 167          //****************************************************
 168          //从串口接收HEX文件并写入单片机
 169          loadfile()
 170          {
 171   1              uchar c1,c0,i,n_of_line;
 172   1              union {uint addrhl;struct {uchar h,l;}addr;} idata address; //定义现在写入的地址
 173   1              union {uint addrhl;struct {uchar h,l;}addr;} idata addressall; //定义已经写入的总数
 174   1              unsigned  char  free[8];     //定义行首处理空间
 175   1      
 176   1              chiperase();
 177   1      
 178   1              putstring("\r\n请发送您要烧的HEX文件!");
 179   1              while (!(getbyte()==':'));  //等待下一行开始
C51 COMPILER V7.07   MAIN                                                                  06/01/2004 12:59:40 PAGE 4   

 180   1      
 181   1              addressall.addrhl=0; //已经写入的总数清0
 182   1              for(i=0;i!=8;i++)      //读取第一行的行首,8字节
 183   1              {
 184   2                      free[i]=getbyte();       
 185   2              }
 186   1              n_of_line=hextochar(free[0],free[1]);  //分析行首,解出行字节总数及行首址
 187   1              address.addr.h=hextochar(free[2],free[3]); //高位地址
 188   1              address.addr.l=hextochar(free[4],free[5]); //底位地址
 189   1              do //大循环,行总数为0时停止,此时文件结束
 190   1              {
 191   2                              do                      //小循环,每行一个循环
 192   2                              {
 193   3                                      c1=getbyte();c0=getbyte();              //取两个HEX数据
 194   3                                      c0=hextochar(c1,c0);           
 195   3                                      addressall.addrhl++;                    //已经写入的地址加1
 196   3      
 197   3                                      DATAOUT=0x40;//01000000
 198   3                                      for(i=0;i<8;i++)        
 199   3                                      {
 200   4                                              SDOUT=BITOUT;
 201   4                                              SCLK=1;SCLK=1;
 202   4                                              SCLK=0;SCLK=0;
 203   4                                              DATAOUT=DATAOUT<<1;
 204   4                                      }
 205   3                                      DATAOUT=address.addr.h;
 206   3                                      for(i=0;i<8;i++)        
 207   3                                      {
 208   4                                              SDOUT=BITOUT;
 209   4                                              SCLK=1;SCLK=1;
 210   4                                              SCLK=0;SCLK=0;
 211   4                                              DATAOUT=DATAOUT<<1;
 212   4                                      }
 213   3                                      DATAOUT=address.addr.l;
 214   3                                      for(i=0;i<8;i++)        
 215   3                                      {
 216   4                                              SDOUT=BITOUT;
 217   4                                              SCLK=1;SCLK=1;
 218   4                                              SCLK=0;SCLK=0;
 219   4                                              DATAOUT=DATAOUT<<1;
 220   4                                      }
 221   3                                      DATAOUT=c0;
 222   3                                      for(i=0;i<8;i++)
 223   3                                      {
 224   4                                              SDOUT=BITOUT;
 225   4                                              SCLK=1;SCLK=1;
 226   4                                              SCLK=0;SCLK=0;
 227   4                                              DATAOUT=DATAOUT<<1;
 228   4                                      }
 229   3                                      //for(t=0;t<120;t++);
 230   3                                      address.addrhl++;//现在写入的地址加1
 231   3                                      n_of_line--;            //该行剩下的字节减一
 232   3                              }while(n_of_line!=0); //写完一行退出该循

⌨️ 快捷键说明

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