89C51编程器
2012-06-02
标签: 编程器

#include "at89x52.h"
#include "stdio.h"
#include "intrins.h"
#include "ctype.h"
sbit rdy = P3 ^ 2;
sbit vpp = P3 ^ 3;
sbit p26 = P3 ^ 4;
sbit p27 = P3 ^ 5;
sbit p36 = P3 ^ 6;
sbit p37 = P3 ^ 7;
sbit prog = P2 ^ 7;
void init_serial()
{
    SCON = 0x50; /*mode 1*/
    TMOD = 0x20;
    TH1 = 0xfd;
    PCON = 0x80; /*38400bps*/
    TR1 = 1; /*load tmr1*/
    TI = 1;
    ES = 1;
}
void init_pro()
{
    p26 = 0;
    p27 = 0;
    p36 = 0;
    p37 = 0;
    vpp = 1;
    prog = 1;
}
void sendbyte(unsigned char da)/*send a byte*/
{
    while (!TI);
    TI = 0;
    SBUF = da;
}
unsigned char IntToAscii(unsigned char a)/*change DEC to ASCII HEX code*/
{
    if (a < 10) {
        return a + 48;
    }
    if (a > 9) {
        return a + 55;
    }
}
unsigned int getadr()/*get 5 ditiDEC adr*/
{
    unsigned char i, a[5];
    for (i = 0; i < 5; i++) {
        while (!RI);
        RI = 0;
        a[i] = SBUF - 48;
    }
    return a[0] * 10000 + a[1] * 1000 + a[2] * 100 + a[3] * 10 + a[4];
}
unsigned char getdata()/*get 2 ditiHEX data*/
{
    unsigned char d1, d2;
    while (!RI);
    RI = 0;
    d1 = toint(SBUF);
    while (!RI);
    RI = 0;
    d2 = toint(SBUF);
    return d1 * 16 + d2;
}
unsigned int detchip(int adr)
{
    P0 = 0xff;
    P1 = adr % 256;
    P2 = adr / 256;
    init_pro();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();/*delay 10 us*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    return P0;
}
void read()
{
    unsigned int adr, maxadr;
    unsigned char h, l;
    P0 = 0xff;
    maxadr = getadr();
    for (adr = 0; adr {
    P1 = adr % 256; P2 = adr / 256;
    p26 = 0;
    p27 = 0;
    p36 = 1;
    p37 = 1;
    vpp = 1;
    prog = 1;
    h = IntToAscii(P0 / 16);
        sendbyte(h);
        l = IntToAscii(P0 % 16);
        sendbyte(l);}
    init_pro();
}
unsigned int test(unsigned int nn)
{
    unsigned int adr, counter = 0;
    P0 = 0xff;
    for (adr = 0; adr {
    P1 = adr % 256; P2 = adr / 256;
    p26 = 0;
    p27 = 0;
    p36 = 1;
    p37 = 1;
    vpp = 1;
    prog = 1;
    _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); /*delay 10 us*/
        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
        if (P0 != 0xff) counter++;}
    init_pro();
    return counter;
}
unsigned char erase(unsigned int nn, unsigned int p)
{
    unsigned int i;
    P0 = 0xff;
    p26 = 1;
    p27 = 0;
    p36 = 0;
    p37 = 0;
    vpp = 0;
    prog = 1;
    for (i = 0; i < 50000; i++) {
        _nop_();
    }
    switch (p) {
    case 0 :
        prog = 0;
        prog = 1;
        break;
    case 1 :
        prog = 0;
        _nop_();
        prog = 1;
        break;
    case 2 :
        prog = 0;
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 3 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 4 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 5 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 6 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 7 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    case 8 :
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        break;
    default:
        prog = 0;
        for (i = 0; i
             prog = 1;
             break;
    }
_nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    vpp = 1;
    for (i = 0; i
         if (test(nn) == 0) return 's';
        else {
            return 'f';
        }
}
unsigned char write()
{
    unsigned int adr, d, i;
    p26 = 0;
    p27 = 1;
    p36 = 1;
    p37 = 1;
    vpp = 0;
    prog = 1;
    for (i = 0; i < 4000; i++) {
        _nop_();
    }
    adr = getadr();
    d = getdata();
    while (1) {
        if (adr > 50000) {
            break;
        }
        P1 = adr % 256;
        P2 = (adr / 256) | 0x80;
        P0 = d;
        TI = 0;
        SBUF = 's';
        prog = 0;
        _nop_();
        _nop_();
        _nop_();
        prog = 1;
        adr = getadr();
        d = getdata();
        while (!rdy);
    }
    init_pro();
    return 'f';
}
unsigned char lock(unsigned char level)
{
    unsigned int i;
    vpp = 0;
    if (level == 1) {
        p26 = 1;
        p27 = 1;
        p36 = 1;
        p37 = 1;
    }
    if (level == 2) {
        p26 = 1;
        p27 = 1;
        p36 = 0;
        p37 = 0;
    }
    if (level == 3) {
        p26 = 1;
        p27 = 0;
        p36 = 1;
        p37 = 0;
    }
    for (i = 0; i < 4000; i++) {
        _nop_();
    }
    prog = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();/*delay 10 us*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    prog = 0;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();/*delay 10 us*/
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    prog = 1;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    while (!rdy);
    init_pro();
    return 'o';
}
void main()
{
    unsigned char data c;
    unsigned int data adr, l, dx;
    init_pro();
    init_serial();
    while (1) {
        init_pro();
        scanf("%c", &c);
        switch (c) {
        case 'c' :
            printf("%c", 'o');
            break;
        case 'd' :
            scanf("%x", &adr);
            printf("%x", detchip(adr));
            break;
        case 't' :
            scanf("%u", &dx);
            printf("%u", test(dx));
            break;
        case 'r' :
            read();
            break;
        case 'e' :
            scanf("%u,%u", &adr, &dx);
            printf("%c", erase(adr, dx));
            break;
        case 'w' :
            printf("%c", write());
            break;
        case 'l' :
            scanf("%u", &l);
            printf("%c", lock(l));
            break;
        case 'h' :
            printf("**********Er6y Programmer Help Window***********\n");
            break;
        default :
            break;
        }
    }
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号