89C51编程器,89C51 programmer
关键字:AT89C51,编程器电路图
89c51芯片的编程器,图片有些小,凑合看吧,附带程序
程序:
#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 diti DEC 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 diti HEX 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;} } }
原理图:
|