#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; } } }