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