您的位置:首页技术文栏自制编程器
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

自己动手制作单片机编程器

[日期:2008-06-26 ] [来源:电子报 作者:佚名] [字体: (投递新闻)

#include <dos.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "..\ch\ctc.ci"
#define ROMSIZE 2048

// 378 :  A7..A0
// 37A :  P34 RST XLAT1 P32
// for programming: Rst=1, P33|P34=1, Vpp=12V
// Read:  O37A 2A I378
// RESET: O37A 2E O37A 2A
// SKIP:  O37A 28 O37A 2A
// WRITE: O37A 2 O378 data [DELAY] O37A 3 O37A 2A
void writeByte(char data, int addr)
{
   outportb(0x37a, 0x2e);               // reset address
   outportb(0x37a, 0x2a);
   ctcdelay(10);

   for (int i=0; i<addr; i++)
   {
      outportb(0x37a, 0x28);
      outportb(0x37a, 0x2a);
   }
   outportb(0x37a, 2);
   outportb(0x378, data);
   outportb(0x378, data);
   outportb(0x37a, 3);
   ctcdelay(2);
   outportb(0x37a, 2);
   ctcdelay(2);
   for (int n=0; n<1000; n++) if ((inportb(0x379)&0x40)!=0) break;
   outportb(0x37a, 0x2A);
}
void writeData(char *buf, int count)
{
   outportb(0x37a, 0x2e);               // reset address
   outportb(0x37a, 0x2a);
   ctcdelay(10);

   for (int i=0; i<count; i++)
   {
      int dat=buf[i];
      outportb(0x37a, 2);
      outportb(0x378, dat);
      outportb(0x378, dat);
      outportb(0x37a, 3);
      ctcdelay(2);
      outportb(0x37a, 2);
      ctcdelay(2);
      for (int n=0; n<1000; n++) if ((inportb(0x379)&0x40)!=0) break;
      outportb(0x37a, 0);
   }
   outportb(0x37a, 0x2A);
}

int readByte(int addr)
{
   outportb(0x37a, 0x2e);               // reset address
   outportb(0x37a, 0x2a);
   ctcdelay(10);

   for (int i=0; i<addr; i++)
   {
      outportb(0x37a, 0x28);
      outportb(0x37a, 0x2a);
   }
   ctcdelay(5);
   return inportb(0x378);
}
void readData(char *buf, int count)
{
   outportb(0x37a, 0x2e);               // reset address
   outportb(0x37a, 0x2a);
   delay(10);

   for (int i=0; i<count; i++)
   {
      ctcdelay(5);
      buf[i]=inportb(0x378);
      outportb(0x37a, 0x28);
      outportb(0x37a, 0x2a);
   }
}

void eraseData()
{
   outportb(0x37a, 0x2a); ctcdelay(10);
   outportb(0x37a, 0x2b); delay(15);
   outportb(0x37a, 0x2a);
}

void hideData()
{
   writeByte(0, 0);
}

void main(int argc, char *argv[])
{
   unsigned char buf[ROMSIZE];
   unsigned char buf2[ROMSIZE];
   memset(buf, 255, ROMSIZE);
   memset(buf2, 255, ROMSIZE);
   unsigned t0, tt;
   FILE *fp;
   initctc();

   if (argc<2)
   {
      puts("AT89C2051 Programming Tools V1.00, (c)Freeman Tse, Tipware Workgroup, 98-08-11.");
      puts("Usage: P2051 Read|Write|Erase|Lock [file]  { G|P|T [adr] [dat]}\n");
      puts("       For Read/Write,  hardware set P33=0, P35=P37=1");
      puts("       For Erase/Lock2, hardware set P33=1, P35=P37=0");
      puts("       For Lock1,       hardware set P33=1, P35=P37=1");
   }

   if (argv[1][0]=='E') { eraseData(); return; }
   if (argv[1][0]=='L') { hideData(); return; }

   if (argv[1][0]=='R')
   {
      t0=getclk();
      readData(buf, ROMSIZE);
      tt=getclk();
      printf("\nRD_Time=%i ms\n", (tt-t0)*256L/1193);

      for (int k=0; k<127; k++)
         printf("%02hX   ", buf[k] );
      printf("\n");

      readData(buf2, ROMSIZE);
      for (int i=0, err=0; i<ROMSIZE; i++) if (buf[i]!=buf2[i]) err=1;
      if (err) printf("\nRead_error!\7");
      else printf("\nRead_Ok!");

      if (argc<=2) return;
      fp=fopen(argv[2], "wb"); if (fp==NULL) return;
      fwrite(buf, ROMSIZE, 1, fp);
      fclose(fp);
   }

   if (argv[1][0]=='T')
   {
      int data=0xff;
      sscanf(argv[2], "%02X", &data);
      for (int i=0; i<ROMSIZE; i++) buf[i]=data;
      writeData(buf, ROMSIZE);
   }
   if (argv[1][0]=='t')
   {
      int data=0xff;
      sscanf(argv[2], "%02X", &data);
      for (int i=0; i<ROMSIZE; i++) buf[i]=i;
      writeData(buf, ROMSIZE);
   }
   if (argv[1][0]=='W')
   {
      if (argc<=2) return;
      fp=fopen(argv[2], "rb"); if (fp==NULL) return;
      fread(buf, ROMSIZE, 1, fp);
      fclose(fp);
      t0=getclk();
      writeData(buf, ROMSIZE);
      tt=getclk();
      printf("\nWR_Time=%i ms\n", (tt-t0)*256L/1193);
      readData(buf2, ROMSIZE);
      for (int i=0, err=0; i<ROMSIZE; i++) if (buf[i]!=buf2[i]) err=1;
      if (err) printf("\nWrite_error!\7");
      else printf("\nWrite_Ok!");
   }
   if (argv[1][0]=='G')
   {
      int addr=0;
      sscanf(argv[2], "%02X", &addr);
      printf("\n[%04X]=%02X \n", addr, readByte(addr));
   }
   if (argv[1][0]=='P')
   {
      int addr=0;
      int data=0xff;
      sscanf(argv[2], "%02X", &addr);
      sscanf(argv[3], "%02X", &data);
      writeByte(data, addr);
   }
}


/*

文章请见《电子报》2000年第27期

阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐