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

📄 ch11_at89cxx 刻录程序彻底公开.c

📁 8051单片机刻录程序彻底公开 用于单片机刻录器
💻 C
📖 第 1 页 / 共 4 页
字号:
         case 2:
                p20_next_addr();
                p20_next_addr();
                c1=p20_read_byte();         /* c2 must be FFH */
                break;
         default:
                c1=0xee;
                break;
        }
        c1=c1 & 0xff;
        return(c1);
}

int p20_reset_addr()
{
        p20_rst_hi();
        p20_rst_low();
        p20_rst_hi();
}

int xtal1_pulse()
{
        p20_xtal1_hi();
        p20_xtal1_low();
        p20_xtal1_hi();
}

int p20_next_addr()
{
        p20_xtal1_hi();
        p20_xtal1_low();
        p20_xtal1_hi();
}

int p20_rst_hi()   {      write_XDATA(PPICTL2,0x00);
                          write_XDATA(PPICTL2,0x04); }
int p20_rst_low()  {      write_XDATA(PPICTL2,0x00);
                          write_XDATA(PPICTL2,0x05); }
int p20_rst_12v()  {      write_XDATA(PPICTL2,0x01);
                          write_XDATA(PPICTL2,0x04); }

int p20_prog_low() {      write_XDATA(PPICTL2,0x02); }
int p20_prog_hi()  {      write_XDATA(PPICTL2,0x03); }

int p20_xtal1_low() {     write_XDATA(PPICTL2,0x06); }
int p20_xtal1_hi()  {     write_XDATA(PPICTL2,0x07); }

int p20_p33_low() {       write_XDATA(PPICTL2,0x08); }
int p20_p33_hi()  {       write_XDATA(PPICTL2,0x09); }

int p20_p34_low() {       write_XDATA(PPICTL2,0x0a); }
int p20_p34_hi()  {       write_XDATA(PPICTL2,0x0b); }

int p20_p35_low() {       write_XDATA(PPICTL2,0x0c); }
int p20_p35_hi()  {       write_XDATA(PPICTL2,0x0d); }

int p20_p37_low() {       write_XDATA(PPICTL2,0x0e); }
int p20_p37_hi()  {       write_XDATA(PPICTL2,0x0f); }


int beep_on()  {      write_XDATA(PPICTL1,0x0f); }
int beep_off() {      write_XDATA(PPICTL1,0x0e); }

int programming()
{
 int result;
int p20_p37_low()  {     write_XDATA(PPICTIL2.0x0e);  }
int p20_p37_hi()   {     write_XDATA(PPICTIL2.0x0f);  }

int beep_on  {    write_XDATA(PPICTL1.0x0f);  } 
int beep_off {    write_XDATA(PPICTL1.0x0e);  }

int programming()
{
 int result:
        display_str(msg_pgm,1);
        if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
        {
         p20_programming();
/*       result=p20_verify();   */
        }
        if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
        {
         p40_programming();
/*       result=p40_verify();   */
        }
        result=verify(0);
        return(result);
}

int p20_programming()
{
 int data;
 int m;
        p20_write_mode();
        p20_reset_addr();
        p20_rst_12v();
        p20_prog_hi();

        for (m=0;m<pgm_length;m++)
        {
         data=read_XDATA(BUFFER+m);
          p20_write_byte(data);
          p20_prog_low();
          p20_prog_hi();
          p20_next_addr();
       if ((m & 0x3ff)==0) display_char('P');  /* 1 page programmed */
        }

        p20_rst_hi();
        line_feed();
}

int p40_programming()
{
 int data;
 int m;
        write_mode();
        addr_out(0);
        vpp_5v();
        prog_hi();

        vpp_12v();
        for (m=0;m<pgm_length;m++)
        {
         data=read_XDATA(BUFFER+m);
         addr_out(m);
/*       if (data==0xff) continue; */
         write_byte(data);
         prog_low();
         prog_hi();
/*       delay_5ms();      delay 10 mS */
/*       vpp_5v();      */
         if ((m & 0x3ff)==0) display_char('P');  /* 1 page programmed */
        }
        vpp_5v();
        line_feed();
}

int verify(int c)
{
 int result;
        display_str(msg_verify,1);
        if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
            result=p20_verify(c);
        if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
           result=p40_verify(c);
        return(result);
}

int p20_verify(int mode)
{
 int m,d_i,d_o;
 int err=0;

        p20_read_mode();
        p20_reset_addr();
        for (m=0;(m<pgm_length);m++)
        {
         d_i=p20_read_byte();
         d_o=read_XDATA(BUFFER+m);
         if (d_i != d_o) err=1;
         p20_next_addr();
         if ((m & 0x3ff)==0) display_char('V');  /* 1 page programmed */
         if (err==1) break;
        }
        delay(10);
        line_feed();
        return(err);
}

int p40_verify(int mode)
{
 int m,d_i,d_o;
 int err=0;

        read_code_mode();
        if (flash_type==AT89S8252) vpp_12v();

        for (m=0;m<pgm_length;m++)
        {
         addr_out(m);
         d_i=read_byte();
         d_o=read_XDATA(BUFFER+m);
         if (d_i != d_o) err=1;
         if ((m & 0x3ff)==0) display_char('V');  /* 1 page programmed */
         if (err) break;
        }
        vpp_5v();
        delay(10);
       line_feed();
        return(err);
}

int p20_write_mode()
{
        init_8255(0x90,0x82);
/*      p20_rst_12v();  */
        p20_prog_hi();
        p20_p33_low();
        p20_p34_hi();
        p20_p35_hi();
        p20_p37_hi();
}

int write_mode()
{
        init_8255(0x80,0x82);
        rst_hi();
        psen_low();
        prog_hi();
        vpp_5v();
        p26_low();
        p27_hi();
        p36_hi();
        p37_hi();
}

int chip_erase()
{
 int result;

        if (flash_type==AT2051 || flash_type==AT4051 || flash_type==AT1051)
        {
         p20_chip_erase();
         result=p20_blank_check(32);  /* check heading 32 bytes */
        }
        if (flash_type==AT89C51 || flash_type==AT89C52 || flash_type==AT89S8252)
        {
         p40_chip_erase();
         result=p40_blank_check(32);  /* check heading 32 bytes */
        }
        return(result);
}

int p20_chip_erase()
{
        init_8255(0x90,0x82); /* 1st-PA,PB,PC output */
                              /* 2nd-PA out,PB & PC input */
        p20_rst_12v();
        p20_prog_hi();

        p20_p33_hi();
        p20_p34_low();
        p20_p35_low();
        p20_p37_low();

        p20_prog_low();
        delay_10ms();     /* delay 10 mS */
        p20_prog_hi();
        p20_rst_hi();
}

int p40_chip_erase()
{
        init_8255(0x80,0x82); /* 1st-PA,PB,PC output */
                              /* 2nd-PA out,PB & PC input */
        rst_hi();
        psen_low();
        prog_hi();
        vpp_5v();

        p26_hi();
        p27_low();
        p36_low();
        p37_low();

        if (vpp==5) vpp_5v();
        else        vpp_12v();      /* debug */

        prog_hi();
        prog_low();
        delay_10ms();     /* delay 10 mS */
        prog_hi();
       vpp_5v();
}

int p20_lock_bit1()
{
        init_8255(0x90,0x82);
        p20_rst_12v();
        p20_prog_hi();
        p20_p33_hi(); p20_p34_hi(); p20_p35_hi(); p20_p37_hi();

        p20_prog_low();
        delay_10ms();
        p20_prog_hi();
        p20_rst_hi();
}

int p20_lock_bit2()
{
        init_8255(0x90,0x82);
        p20_rst_12v();
        p20_prog_hi();
        p20_p33_hi(); p20_p34_hi(); p20_p35_low(); p20_p37_low();

        p20_prog_low();
        delay_10ms();
        p20_prog_hi();
        p20_rst_hi();
}

int at89s8252_lock_bit(int bit)
{
        init_8255(0x80,0x82);
        vpp_5v();
        rst_hi();
        psen_low();
        prog_hi();
        p26_hi(); p27_low(); p36_hi(); p37_low();

        vpp_12v();
        switch (bit)
        {
         case 1: write_byte(0x7f); break;
         case 2: write_byte(0xbf); break;
         case 3: write_byte(0xdf); break;
        }
        prog_low();
        delay_10ms();
        prog_hi();
        vpp_5v();
        read_code_mode();
}


int p40_lock_bit1()
{
        init_8255(0x80,0x82);
        vpp_5v();
        rst_hi();
        psen_low();
        prog_hi();
        p26_hi(); p27_hi(); p36_hi(); p37_hi();

        if (vpp==5) vpp_5v();
        else        vpp_12v();

        prog_low();
        delay_10ms();
        prog_hi();
        vpp_5v();
        read_code_mode();
}

int p40_lock_bit2()
{
        init_8255(0x80,0x82);
        vpp_5v();
        rst_hi();
        psen_low();
        prog_hi();
        p26_hi(); p27_hi(); p36_low(); p37_low();

        if (vpp==5) vpp_5v();
        else        vpp_12v();

      prog_low();
        delay_10ms();
        prog_hi();
        vpp_5v();
        read_code_mode();
}

int p40_lock_bit3()
{
        init_8255(0x80,0x82);
        vpp_5v();
        rst_hi();
        psen_low();
        prog_hi();
        p26_hi(); p27_low(); p36_hi(); p37_low();

        if (vpp==5) vpp_5v();
        else        vpp_12v();

        prog_low();
        delay_10ms();
        prog_hi();
        vpp_5v();
        read_code_mode();
}

int init_8255(int c1,int c2)
{
        write_XDATA(PPICTL1,c1);
        write_XDATA(PPICTL2,c2);
}

int p20_write_byte(int d)
{
        write_XDATA(PPIPB1,d);
}

int p20_read_byte()
{
 int d;
        d=read_XDATA(PPIPB1);
        return(d);
}

int power_on_message()
{
        line_feed();
        beep_start();
        display_str("Power on default type is [",0);
        switch(flash_type)
        {
         case AT4051: display_str(msg_at89c4051,0); break;
         case AT2051: display_str(msg_at89c2051,0); break;
         case AT1051: display_str(msg_at89c1051,0); break;
         case AT89C51: display_str(msg_at89c51 ,0);  break;
         case AT89C52: display_str(msg_at89c52 ,0);  break;
         case AT89S8252:
                       display_str(msg_at89s8252 ,0);  break;
        }
        display_str("]",1);
        display_str("If you want to change the FLASH AT89CXX type",1);
        display_str("Please set the value at address 7FFFH of EPROM",1);
        display_str("(7FFFH)=00H => AT89C2051,(7FFFH)=02H => AT89C4051",1);
        display_str("(7FFFH)=01H => AT89C1051,(7FFFH)=03H => AT89C51",1);
        display_str("(7FFFH)=04H => AT89C52  ,(7FFFH)=05H => AT89S8252",1);
        display_str("(7FFFH)=06H => AT90S1200",1);
        delay(500);
}

int display_prompt()
{
        switch(flash_type)
        {
         case AT4051:    display_str(msg_at89c4051,0); break;
         case AT2051:    display_str(msg_at89c2051,0); break;
         case AT1051:    display_str(msg_at89c1051,0); break;
         case AT89C51:   display_str(msg_at89c51,0);   break;
         case AT89C52:   display_str(msg_at89c52,0);   break;
         case AT89S8252: display_str(msg_at89s8252,0); break;
         case AT90S1200: display_str(msg_at90s1200,0); break;
        }
        display_str(" (",0);
        display_addr_woh((unsigned int)checksum);
        display_str(")>",0);
       delay(20);
}

int echo_test_count()
{
                line_feed();
                display_str("***** Final PGM count=",0);
                display_addr(test_count);
                display_str(" *****",1);
}

int life_test()
{
 int result;

        beep_start();

        switch(flash_type)
        {
         case AT90S1200: display_str(msg_at90s1200,0); break;
         case AT4051: display_str(msg_at89c4051,0); break;
         case AT2051: display_str(msg_at89c2051,0); break;
         case AT1051: display_str(msg_at89c1051,0); break;
         case AT89C51: display_str(msg_at89c51,0);  break;
         case AT89C52: display_str(msg_at89c52,0);  break;
         case AT89S8252: display_str(msg_at89s8252,0);  break;
        }
        display_str("Lifetest start....(press any key to abort)",1);

         while (1)
         {
           test_count++;
           line_feed();
           display_str("***** PGM count=",0);
           display_addr(test_count);
           display_str(" *****",0);

           line_feed();
           display_str(msg_erase,1);
           if (flash_type!=AT90S1200)
           {
            chip_erase();
            result=blank_check(32);
            if (result==0) result=programming();
           }
           else
           {
            avr_erase();
            avr_flash_programming();
            result=avr_flash_verify();
           }

           if (result==0) beep_ok();
           else           beep_err();

           if (result!=0)
             {
              show_fail_in_programming();
              show_mail_box();
             }
           if (result!=0 || test_count>=5000) break;
           if (SFB.RI==1) break;
        }  /* end of while */
        echo_test_count();
}

int check_pgm_sw()
{
 int d,ok;
 int result;

        ok=0;
        d=(~read_XDATA(PPIPA1)) & 0x03;
        if (d==0x02)
         { delay(50);
           d=(~read_XDATA(PPIPA1)) & 0x03;
           if (d==0x02) ok=1;
         }
        if (ok==1)
         {
           line_feed();
           beep_start();
           display_str(msg_erase,1);
           p20_chip_erase();
          result=p20_blank_check(32);
         if (result==0) {
           result=programming();
           if (AUTOLOCK)
           {
            display_str("Lock bit1 + bit2 of AT89C4051/2051/1051",1);
            display_str("Same as lockbit1 plus verify is disabled",1);
            p20_lock_bit1();
            p20_lock_bit2();
            p20_show_signature(1);
           }
          }

           if (result==0) display_str(msg_pass,1);
           else           display_str(msg_fail,1);
           if (result==0) beep_ok();
           else           beep_err();
           if (result!=0)
           {
            show_fail_in_programming();
            show_mail_box();
           }
         display_prompt();
        }
}

int check_read_and_verify_sw()

⌨️ 快捷键说明

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