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

📄 main.lst

📁 stc单片机读内部eeprom代码
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //////////// 
   2          #include <reg52.h>             ///52的库 
   3          #include <intrins.h> 
   4          ///////////////////// 
   5          //sfr  isp_wdt     = 0xe1; 
   6          sfr  isp_data    = 0xe2; 
   7          sfr  isp_addrh   = 0xe3; 
   8          sfr  isp_addrl   = 0xe4; 
   9          sfr  isp_cmd     = 0xe5; 
  10          sfr  isp_trig    = 0xe6; 
  11          sfr  isp_contr   = 0xe7; 
  12          ///////// 
  13          #define uchar unsigned char
  14          #define uint  unsigned int
  15          #define Dlen 8
  16          uchar Data[Dlen+1]={1};//={1,2,3,4,5,6,7,8,9,0xA,0xB,0x0C,0x0D};
  17          uchar Databak[Dlen+1];
  18          uchar AckData[Dlen+1];
  19          uchar number,flag;
  20          uchar Eeprom_data[Dlen];
  21          sfr WDT=0XE1;
  22          /*sfr ISP_DATA=0XE2;
  23          sfr ISP_ADDRH=0xE3;
  24          sfr ISP_ADDRL=0xE4;
  25          sfr ISP_CMD=0xE5;
  26          sfr ISP_TRIG=0xE6;
  27          sfr ISP_COUNT =0xE7;
  28          sfr ENABLE_ISP=0x80;
  29          uchar DEBUG_DATA =0x5A;
  30          uint DFSA=0x2000; */
  31          
  32          sbit LED=P1^7;
  33          sbit LED1=P3^4;
  34          sbit LED2=P3^5;
  35          bit BeingEnd=1;
  36          uint TimerCount=0,mTcount=0;
  37          bit cansend=0,issend=0,whilerec=0,whilesend=0;
  38          
  39          ///////// 
  40          unsigned char iic_num; 
  41          ////写入到从t_addr地址开始 
  42          /* 打开 ISP,IAP 功能 */ 
  43          void EraseEeprom(unsigned char t_addr) 
  44          { 
  45   1          isp_addrh = t_addr; 
  46   1          isp_addrl = 0; 
  47   1          EA    =    0;    /* 关中断 */ 
  48   1          isp_contr = 0x81;       /* 1000,0000 */ 
  49   1          isp_cmd = 3; 
  50   1          isp_trig = 0x46; 
  51   1          isp_trig = 0xb9; 
  52   1          _nop_(); 
  53   1          _nop_(); 
  54   1          isp_contr = 0;    /* 0111,1111 */ 
  55   1          isp_cmd = 0; 
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 2   

  56   1          isp_trig = 0; 
  57   1          isp_addrh = 0; 
  58   1          isp_addrl = 0; 
  59   1          EA = 1;                    /* 开中断 */ 
  60   1      } 
  61          ////一次最多256个,建议试用几个,要存入的数据松在指针指向的缓冲区 
  62          void WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char /*xdata*/  *ptr) 
  63          { 
  64   1          EraseEeprom(t_addr); 
  65   1          for (iic_num=0; iic_num<num; iic_num++) 
  66   1          { 
  67   2              isp_data = *(ptr+iic_num); 
  68   2              isp_addrh = t_addr; 
  69   2              isp_addrl = iic_num; 
  70   2              EA    =    0;                 /* 关中断 */ 
  71   2              isp_contr = 0x81;       /* 1000,0000 */ 
  72   2              isp_cmd = 2; 
  73   2              isp_trig = 0x46; 
  74   2              isp_trig = 0xb9; 
  75   2              _nop_(); 
  76   2              _nop_(); 
  77   2              isp_contr = 0;    /* 0111,1111 */ 
  78   2              isp_cmd = 0; 
  79   2              isp_trig = 0; 
  80   2              isp_addrh = 0; 
  81   2              isp_addrl = 0;         
  82   2              EA = 1;                    /* 开中断 */ 
  83   2          } 
  84   1      } 
  85          ////从eeprom的t_addr地址开始读出num个数据 
  86          ////存入以temp[0]开始的存储单元 
  87          ////一次最多256个,读数的数据存入指针指向的缓冲区 
  88          void ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char /*xdata*/ *ptr) 
  89          { 
  90   1          for (iic_num=0; iic_num<num; iic_num++) 
  91   1          { 
  92   2              isp_addrh = s_addr; 
  93   2              isp_addrl = iic_num; 
  94   2              EA    =    0;    /* 关中断 */ 
  95   2              isp_contr = 0x81;       /* 1000,0000 */ 
  96   2              isp_cmd = 1; 
  97   2              isp_trig = 0x46; 
  98   2              isp_trig = 0xb9; 
  99   2              _nop_(); 
 100   2              _nop_(); 
 101   2              isp_contr = 0;    /* 0111,1111 */ 
 102   2              isp_cmd = 0; 
 103   2              isp_trig = 0; 
 104   2              isp_addrh = 0; 
 105   2              isp_addrl = 0;         
 106   2              EA = 1;                            /* 开中断 */ 
 107   2              *(ptr+iic_num) = isp_data; 
 108   2          } 
 109   1      }/***********串口发送一个字节****************/
 110          
 111           void send(uchar S_Data)
 112          {
 113   1              SBUF = S_Data;
 114   1          while(TI == 0);
 115   1                      TI =0;
 116   1      }
 117          
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 3   

 118          /************生成校验码子程序***********/
 119          char* XiaoYan(uchar *a)
 120          {
 121   1        uchar i, all=0;
 122   1       
 123   1         for(i=0;i<Dlen;i++)
 124   1         all=all+a[i];
 125   1         all=~all;
 126   1         all=all-1;
 127   1         a[Dlen]=all;
 128   1         return a;
 129   1      }
 130          
 131          /************接收数据校验子程序***********/
 132          unsigned int RXiaoYan(uchar *a)
 133          {
 134   1              uchar rets=0,i, all=0;
 135   1       
 136   1              for(i=0;i<Dlen;i++)
 137   1              all=all+a[i];
 138   1              all=~all;
 139   1              all=all-1;
 140   1              if(a[Dlen]==all)
 141   1                      rets=1;
 142   1              return rets;
 143   1      
 144   1      }
 145          
 146          
 147          /****************串口发送子程序****************/
 148          void sends(uchar *b )
 149          {
 150   1              
 151   1              uchar count,i;
 152   1              cansend=0;
 153   1              count=Dlen+1;
 154   1              LED1=0;
 155   1              for(i=0;i<count;i++)
 156   1                      send(b[i]);
 157   1      }
 158          //-------------等待接收----------------------
 159          void whilRec(void)
 160          {
 161   1              unsigned char Cmd=0;
 162   1              while(whilerec)
 163   1              {
 164   2                      //if(flag==12)
 165   2                              flag=0;
 166   2                              number=0;
 167   2                              Cmd=0;
 168   2                              Cmd=Data[0];
 169   2                              if(RXiaoYan(Data)) //crc ok
 170   2                              {
 171   3                                      if(Cmd>0xA0)//接到的是命令侦
 172   3                                      {
 173   4                                              switch (Cmd)
 174   4                                              {
 175   5                                                      case 0xA1:
 176   5                                                              break;
 177   5                                                      case 0xA2:
 178   5                                                              break;
 179   5                                                      case 0xAC://应答ok
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 4   

 180   5                                                              cansend=1;
 181   5                                                              break;
 182   5                                                      case 0xAB://需要重发
 183   5                                                              sends(Databak);
 184   5                                                              whilerec=0;
 185   5                                                              cansend=1;
 186   5                                                              break;
 187   5                                                      case 0xCB://开始
 188   5                                                              BeingEnd=1;
 189   5                                                              break;
 190   5                                                      case 0xCE://暂停
 191   5                                                              BeingEnd=0;
 192   5                                                              break;
 193   5                                                      default:
 194   5                                                              break;
 195   5                                              }
 196   4                                      }
 197   3                                      else  //crc no
 198   3                                      {
 199   4                                              sends(XiaoYan(Data));
 200   4                                              cansend=1;
 201   4                                              whilerec=0;
 202   4                                      }
 203   3                              }
 204   2                              else
 205   2                              {
 206   3                                      
 207   3                                      AckData[0]=0xAB;//要求pc重发
 208   3                                      sends(XiaoYan(AckData));
 209   3                                      whilerec=0;     
 210   3                                      cansend=1;
 211   3                              }
 212   2                              whilerec=0;
 213   2      
 214   2                      
 215   2              }
 216   1      }
 217           
 218           /*********MCU初始化**************/
 219          void MCU_Init(void)
 220          {
 221   1          TMOD = 0x22;
 222   1          //TH1 = TL1 = 0xFA;//9600 T1 为波特率发生器
 223   1              TH1 = TL1 = 0xFD;//19200  T1 为波特率发生器
 224   1              TH0=TL0=0xa3;
 225   1              SCON = 0x50;
 226   1              PCON = 0x80;//SMOD=1;
 227   1              TR1=1;
 228   1              TR0=1;
 229   1              ET0=1;
 230   1              ES = 1;
 231   1              EA = 1;
 232   1      }
 233          /*************T1中断********************/
 234          void T0_int() interrupt 1
 235          {
 236   1              TimerCount++;
 237   1              if(TimerCount>200)
 238   1              {
 239   2                      TimerCount=0;
 240   2                      WDT=0x34;
 241   2                      mTcount++;
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 5   

 242   2              }
 243   1      }
 244          
 245          /*************接收中断********************/
 246          void Serial() interrupt 4 using 2
 247          {  
 248   1              uint num=0;
 249   1              if(RI == 1)
 250   1          {
 251   2                      
 252   2                      LED2=0;
 253   2                      Data[number++]= SBUF;
 254   2                      num=number-1;
 255   2                      Databak[num]=Data[num];
 256   2                      
 257   2                      RI = 0;
 258   2                      flag++;
 259   2                      if(flag==Dlen+1)
 260   2                      {
 261   3                              whilerec=1;
 262   3      
 263   3                      }
 264   2          }
 265   1      }
 266          /**************主程序***********************/
 267          void main(void)
 268          {
 269   1              unsigned int ld=0,san=0;
 270   1          MCU_Init();
 271   1              //send(0xAA);
 272   1              //for(ld=0;ld<Dlen;ld++)
 273   1                      //Eeprom_data[ld]=0xA0+ld;
 274   1              //WriteEeprom(0x82, Dlen, Eeprom_data); 
 275   1                              _nop_();
 276   1                              _nop_();
 277   1              send(0x01);
 278   1              for(ld=0;ld<Dlen;ld++)
 279   1                      Eeprom_data[ld]=0;
 280   1              
 281   1              while(1)
 282   1              {
 283   2                      if(mTcount>350)
 284   2                      {
 285   3                              mTcount=0;
 286   3                              for(ld=0;ld<Dlen;ld++)
 287   3                                      Eeprom_data[ld]=0;
 288   3                              LED2=LED1;
 289   3                              LED1=!LED1;
 290   3                              ReadEeprom(0x82, Dlen, Eeprom_data) ;
 291   3                              _nop_();
 292   3                              _nop_();
 293   3                              sends(XiaoYan(Eeprom_data));
 294   3                              /*ReadEeprom(0x83, Dlen, Eeprom_data) ;
 295   3                              _nop_();
 296   3                              _nop_();
 297   3                              sends(XiaoYan(Eeprom_data));
 298   3                              mTcount=0;       */
 299   3                              mTcount=0;
 300   3      
 301   3                      }
 302   2                      //whilRec();
 303   2              }
C51 COMPILER V8.02   MAIN                                                                  03/22/2008 11:45:38 PAGE 6   

 304   1      }
 305          



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    707    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     42      20
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      5    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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