|
本帖最后由 翌阳 于 2020-4-9 10:55 编辑
原来的编程嚣早已经不能用了,EMP-100A,它的PC程序早就不兼容WINDOWS环境了,现在找台旧电脑都已经很难了,没WINDOWS,没USB-串口支持。有串口的电脑,已经找不到了。不只是装个DOS就能用的事了。懒得找它了,网上找个图:
为了写2051,曾经简单做了一个,用了十几年。它不能写89C51啊,近来买个频率计,便宜,有BUG。又想起自己做频率计了。自己做的东西才随心,对吧。频率计要用89C52,因为要做个等精度的,电路不复杂,精度与闸门时间关系不大,但要做大整数计算,64位大整数,long long型的。2051在内存上,端口上都不够用。但52,我没编程器啊。于是想DIY个。经过十多天的努力,今天算是成功了。成功地写了几个片子,用着还很顺手。
为了完成它,研究了好几页的资料,多也不多,关键就那几行和几个图。
最后,把程序代码也放上来,给朋友们一个参考。写个编程器,并不难。当然,这个编程器是配合我的那个仿真机来工作的,做完整的太费事,充分利用现成的东西。
- /*
- P1->address low ADL P2=1,PBYTE[0]
- P2->address High ADH P2=2,PBYTE[0]
- Pmod P2=4 PBYTE[0]
- PROG-> Pmod0
- P3.6-> Pmod1
- P3.6-> Pmod2
- VPP->P3_2
- READY->P3_7
- */
- #define VPP(x) P3_2=!x
- #include <mcs51/at89x52.h>
- #include <mcs51/BitMem.h>
- typedef union {
- unsigned char c;
- struct {
- unsigned char d0:1;
- unsigned char d1:1;
- unsigned char d2:1;
- unsigned char d3:1;
- unsigned char d4:1;
- unsigned char d5:1;
- unsigned char d6:1;
- unsigned char d7:1;
- };
- } BITCH;
- BITCH ADL,ADH,Pmod;
- //BITCHAR(ADL,13)
- //BITCHAR(ADH,14)
- //BITCHAR(Pmod,8)
- void d10us(){unsigned char c=10;while(--c);}
- void d10ms(){unsigned char c=250;while(--c)d10us();c=120;while(--c)d10us();}
- void d100ms(){unsigned char c=10;while(--c)d10ms();}
- void initsio()
- {
- T2CON=0x34;
- RCAP2L=0xfa;
- RCAP2H=0xff;
- SCON=0x5A;
- TR2=1;
- ES=0;
- EA=0;
- }
- char getch(){
- while(!RI);
- RI=0;
- return SBUF;
- }
- void putchar(char c){
- TI=0;
- SBUF=c;
- while(!TI);
- }
- void prog(){
- Pmod.d0=0;
- P2=4;
- PBYTE[0]=Pmod.c;
- d10us();
- Pmod.d0=1;
- PBYTE[0]=Pmod.c;
- }
- void mode(__bit a, __bit c,__bit d){
- ADH.d6=a;
- P2=2;
- PBYTE[0]=ADH.c;
- Pmod.d1=c;
- Pmod.d2=d;
- P2=4;
- PBYTE[0]=Pmod.c;
- }
- void enable(__bit c){
- ADH.d7=c;
- P2=2;
- PBYTE[0]=ADH.c;
- }
- void erase(){
- mode(1,0,0);
- enable(0);
- VPP(1);
- d10us();
- P2=4;
- Pmod.d0=0;
- PBYTE[0]=Pmod.c;
- d10ms();
- Pmod.d0=1;
- PBYTE[0]=Pmod.c;
- d10us();
- VPP(0);
- enable(1);
- mode(0,1,1);
- }
- void addr(unsigned int a){
- ADL.c=a&0xff;
- ADH.c=ADH.c&0xe0|(a>>8)&0x1f;
- P2=1;
- PBYTE[0]=ADL.c;
- P2=2;
- PBYTE[0]=ADH.c;
- }
- char read(unsigned int a){
- char c;
- P1=0xff;
- enable(1);
- addr(a);
- enable(0);
- c=P1;
- enable(1);
- Pmod.d5=1; //2051 XTAL1
- P2=4;
- PBYTE[0]=Pmod.c;
- Pmod.d5=0; //2051 XTAL1
- PBYTE[0]=Pmod.c;
- return c;
- }
- void power(__bit c){
- Pmod.d0=1;
- Pmod.d3=1; //2051 RST
- Pmod.d5=0; //2051 XTAL1
- P2=4;
- PBYTE[0]=Pmod.c;
- d10ms();
- VPP(0);
- P3_3=!c;
- d10ms();
- Pmod.d3=0;
- PBYTE[0]=Pmod.c;
- }
- /*void readSig(){
- mode(0,0,0);
- printf("%b02XH,%b02XH,%b02XH\n",read(0x30),read(0x31),read(0x32));
- printf("%b02XH,%b02XH,%b02XH\n",read(0xa),read(0xb),read(0xc));
- mode(0,1,1);
- }*/
- char write(int a,char ch){
- enable(1);
- addr(a);
- P1=ch;
- VPP(1);
- d10us();
- prog();
- d10us();
- VPP(0);
- while(!P3_7);
- return read(a);
- }
- __code char hexChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
- void putByteHex(char c){
- putchar(hexChar[(c>>4)&0xf]);
- putchar(hexChar[c&0xf]);
- }
- void putWordHex(unsigned int i){
- char c=4,k;
- while(c--){
- k=i>>12;
- putchar(hexChar[k]);
- i<<=4;
- }
- }
- void putstr(const char *s){
- while(*s){putchar(*s++);}
- }
- char menu(){
- char c;
- mode(0,0,0);
- while(1){
- power(1);d10ms();
- putstr("\n\n\tAT89C(20)51/52 Programmer\n"
- "\t Chip ID: ");putByteHex(read(0x30));putstr("H,");
- putByteHex(read(0x31));putstr("H,");
- putByteHex(read(0x32));
- putstr("H\n"
- "\t1.Erase chip.\n"
- "\t2.Write 1K data(1051) from 1000H.\n"
- "\t3.Write 2K data(2051) from 1000H.\n"
- "\t4.Write 4K data(51/4051) from 1000H.\n"
- "\t5.Write 8K data(52) from 1000H.\n"
- "\t6.Read 1K data.\n"
- "\t7.Read 2K data.\n"
- "\t8.Read 4K data.\n"
- "\t9.Read 8K data.\n"
- "\n"
- "\t Choice[1-9]:");
- power(0);
- c=getch();
- putchar(c);
- if(c>='1'&&c<='9'){
- mode(0,1,1);
- return c;
- }
- }
- }
- void readData(unsigned int len){
- unsigned int i;
- power(1);d10ms();
- for(i=0;i<len;i++){
- if(i%16==0){
- putchar('\n');putWordHex(i);putstr("H:");
- }
- putchar(' ');putByteHex(read(i));
- }
- power(0);
- putstr("\nPress any key to continue.");
- getch();
- }
- void writeData(int len){
- int i;
- char c,d;
- putstr("\nThe chip will be written, (c)ancel?");
- if(getch()=='c')return;
- putstr("\nWriting...\n");
- power(1);d100ms();
- for(i=0;i<len;i++){
- if(i%16==0){
- putchar('\n');
- putWordHex(i);
- putstr("H: ");
- }
- c=CBYTE[0x1000+i];
- d=write(i,c);
- if(c==d){
- putByteHex(d);
- putchar(' ');
- }else{
- putstr("\nError! ");
- putWordHex(i);putstr("H: ");
- putByteHex(c);putstr("->");
- putByteHex(d);
- break;
- }
- }
- d100ms();
- power(0);
- putstr("\nPress any key to continue.");getch();
- }
- void main(void)
- {
- power(0);
- ADH.c=ADL.c=0;
- initsio();
- TI=1;
- while(1){
- switch(menu()){
- case '1':
- putstr("\nThe chip will be erased,are you sure(Y/N)?");
- if(getch()=='Y'){
- putstr("\nErasing...");
- power(1);
- d100ms();
- erase();
- power(0);
- putstr("\nErased.\nPress any key to continue.");
- getch();
- }
- break;
- case '2':
- writeData(0x400);
- break;
- case '3':
- writeData(0x800);
- break;
- case '4':
- writeData(0x1000);
- break;
- case '5':
- writeData(0x2000);
- break;
- case '6':
- readData(0x400);
- break;
- case '7':
- readData(0x800);
- break;
- case '8':
- readData(0x1000);
- break;
- case '9':
- readData(0x2000);
- break;
- }
- }
- }
复制代码
|
|