矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3609|回复: 14

AT89C51/52/1051/2051/4051编程器制作完成。

[复制链接]
     
发表于 2020-4-9 10:47:50 | 显示全部楼层 |阅读模式
本帖最后由 翌阳 于 2020-4-9 10:55 编辑

原来的编程嚣早已经不能用了,EMP-100A,它的PC程序早就不兼容WINDOWS环境了,现在找台旧电脑都已经很难了,没WINDOWS,没USB-串口支持。有串口的电脑,已经找不到了。不只是装个DOS就能用的事了。懒得找它了,网上找个图:
38_23006_4fd7f8cb447b0d6.jpg
为了写2051,曾经简单做了一个,用了十几年。它不能写89C51啊,近来买个频率计,便宜,有BUG。又想起自己做频率计了。自己做的东西才随心,对吧。频率计要用89C52,因为要做个等精度的,电路不复杂,精度与闸门时间关系不大,但要做大整数计算,64位大整数,long long型的。2051在内存上,端口上都不够用。但52,我没编程器啊。于是想DIY个。经过十多天的努力,今天算是成功了。成功地写了几个片子,用着还很顺手。
IMG_20200409_101511.jpg
捕获.JPG
为了完成它,研究了好几页的资料,多也不多,关键就那几行和几个图。
IMG_20200409_102414.jpg
最后,把程序代码也放上来,给朋友们一个参考。写个编程器,并不难。当然,这个编程器是配合我的那个仿真机来工作的,做完整的太费事,充分利用现成的东西。
  1. /*
  2. P1->address low ADL P2=1,PBYTE[0]
  3. P2->address High ADH P2=2,PBYTE[0]
  4. Pmod P2=4 PBYTE[0]
  5. PROG-> Pmod0
  6. P3.6-> Pmod1
  7. P3.6-> Pmod2
  8. VPP->P3_2
  9. READY->P3_7

  10. */

  11. #define VPP(x) P3_2=!x


  12. #include <mcs51/at89x52.h>
  13. #include <mcs51/BitMem.h>
  14. typedef union {
  15.     unsigned char c;
  16.     struct {
  17.         unsigned char d0:1;
  18.         unsigned char d1:1;
  19.         unsigned char d2:1;
  20.         unsigned char d3:1;
  21.         unsigned char d4:1;
  22.         unsigned char d5:1;
  23.         unsigned char d6:1;
  24.         unsigned char d7:1;
  25.     };
  26. } BITCH;
  27. BITCH ADL,ADH,Pmod;
  28. //BITCHAR(ADL,13)
  29. //BITCHAR(ADH,14)
  30. //BITCHAR(Pmod,8)
  31. void d10us(){unsigned char c=10;while(--c);}
  32. void d10ms(){unsigned char c=250;while(--c)d10us();c=120;while(--c)d10us();}
  33. void d100ms(){unsigned char c=10;while(--c)d10ms();}
  34. void initsio()
  35. {
  36.     T2CON=0x34;
  37.     RCAP2L=0xfa;
  38.     RCAP2H=0xff;
  39.     SCON=0x5A;
  40.     TR2=1;
  41.     ES=0;
  42.     EA=0;
  43. }


  44. char getch(){
  45.     while(!RI);
  46.     RI=0;
  47.     return SBUF;
  48. }
  49. void putchar(char c){
  50.     TI=0;
  51.     SBUF=c;
  52.     while(!TI);

  53. }
  54. void prog(){
  55.     Pmod.d0=0;
  56.     P2=4;
  57.     PBYTE[0]=Pmod.c;
  58.     d10us();
  59.     Pmod.d0=1;
  60.     PBYTE[0]=Pmod.c;
  61. }

  62. void mode(__bit a,  __bit c,__bit d){
  63.     ADH.d6=a;
  64.     P2=2;
  65.     PBYTE[0]=ADH.c;
  66.     Pmod.d1=c;
  67.     Pmod.d2=d;
  68.     P2=4;
  69.     PBYTE[0]=Pmod.c;
  70. }
  71. void enable(__bit c){
  72.     ADH.d7=c;
  73.     P2=2;
  74.     PBYTE[0]=ADH.c;
  75. }
  76. void erase(){
  77.     mode(1,0,0);
  78.     enable(0);
  79.     VPP(1);
  80.     d10us();
  81.     P2=4;
  82.     Pmod.d0=0;
  83.     PBYTE[0]=Pmod.c;
  84.     d10ms();
  85.     Pmod.d0=1;
  86.     PBYTE[0]=Pmod.c;
  87.     d10us();
  88.     VPP(0);
  89.     enable(1);
  90.     mode(0,1,1);
  91. }

  92. void addr(unsigned int a){
  93.     ADL.c=a&0xff;
  94.     ADH.c=ADH.c&0xe0|(a>>8)&0x1f;
  95.     P2=1;
  96.     PBYTE[0]=ADL.c;
  97.     P2=2;
  98.     PBYTE[0]=ADH.c;
  99. }
  100. char read(unsigned int a){
  101.     char c;
  102.     P1=0xff;
  103.     enable(1);
  104.     addr(a);
  105.     enable(0);
  106.     c=P1;
  107.     enable(1);
  108.     Pmod.d5=1; //2051 XTAL1
  109.     P2=4;
  110.     PBYTE[0]=Pmod.c;
  111.     Pmod.d5=0; //2051 XTAL1
  112.     PBYTE[0]=Pmod.c;
  113.     return c;
  114. }
  115. void power(__bit c){
  116.     Pmod.d0=1;
  117.     Pmod.d3=1; //2051 RST
  118.     Pmod.d5=0; //2051 XTAL1
  119.     P2=4;
  120.     PBYTE[0]=Pmod.c;
  121.     d10ms();
  122.     VPP(0);
  123.     P3_3=!c;
  124.     d10ms();
  125.     Pmod.d3=0;
  126.     PBYTE[0]=Pmod.c;
  127. }

  128. /*void readSig(){
  129.     mode(0,0,0);
  130.     printf("%b02XH,%b02XH,%b02XH\n",read(0x30),read(0x31),read(0x32));
  131.     printf("%b02XH,%b02XH,%b02XH\n",read(0xa),read(0xb),read(0xc));
  132.     mode(0,1,1);
  133. }*/

  134. char write(int a,char ch){
  135.     enable(1);

  136.     addr(a);
  137.     P1=ch;
  138.     VPP(1);
  139.     d10us();
  140.     prog();
  141.     d10us();
  142.     VPP(0);
  143.     while(!P3_7);
  144.     return read(a);


  145. }

  146. __code char hexChar[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  147. void putByteHex(char c){
  148.     putchar(hexChar[(c>>4)&0xf]);
  149.     putchar(hexChar[c&0xf]);
  150. }
  151. void putWordHex(unsigned int i){
  152.     char c=4,k;
  153.     while(c--){
  154.         k=i>>12;
  155.         putchar(hexChar[k]);
  156.         i<<=4;
  157.     }
  158. }
  159. void putstr(const char *s){
  160.     while(*s){putchar(*s++);}
  161. }
  162. char menu(){
  163.     char c;
  164.     mode(0,0,0);
  165.     while(1){
  166.         power(1);d10ms();
  167.         putstr("\n\n\tAT89C(20)51/52 Programmer\n"
  168.            "\t Chip ID: ");putByteHex(read(0x30));putstr("H,");
  169.            putByteHex(read(0x31));putstr("H,");
  170.            putByteHex(read(0x32));
  171.            putstr("H\n"
  172.            "\t1.Erase chip.\n"
  173.            "\t2.Write 1K data(1051) from 1000H.\n"
  174.            "\t3.Write 2K data(2051) from 1000H.\n"
  175.            "\t4.Write 4K data(51/4051) from 1000H.\n"
  176.            "\t5.Write 8K data(52) from 1000H.\n"
  177.            "\t6.Read 1K data.\n"
  178.            "\t7.Read 2K data.\n"
  179.            "\t8.Read 4K data.\n"
  180.            "\t9.Read 8K data.\n"
  181.            "\n"
  182.            "\t  Choice[1-9]:");
  183.         power(0);
  184.         c=getch();
  185.         putchar(c);
  186.         if(c>='1'&&c<='9'){
  187.             mode(0,1,1);
  188.             return c;
  189.         }
  190.     }
  191. }
  192. void readData(unsigned int len){
  193.     unsigned int i;
  194.     power(1);d10ms();
  195.     for(i=0;i<len;i++){
  196.         if(i%16==0){
  197.             putchar('\n');putWordHex(i);putstr("H:");
  198.         }
  199.         putchar(' ');putByteHex(read(i));

  200.     }
  201.     power(0);
  202.     putstr("\nPress any key to continue.");
  203.     getch();
  204. }
  205. void writeData(int len){
  206.     int i;
  207.     char c,d;
  208.     putstr("\nThe chip will be written, (c)ancel?");
  209.     if(getch()=='c')return;
  210.     putstr("\nWriting...\n");
  211.     power(1);d100ms();
  212.     for(i=0;i<len;i++){
  213.         if(i%16==0){
  214.             putchar('\n');
  215.             putWordHex(i);
  216.             putstr("H: ");
  217.         }
  218.         c=CBYTE[0x1000+i];
  219.         d=write(i,c);
  220.         if(c==d){
  221.             putByteHex(d);
  222.             putchar(' ');
  223.         }else{
  224.             putstr("\nError! ");
  225.             putWordHex(i);putstr("H: ");
  226.             putByteHex(c);putstr("->");
  227.             putByteHex(d);
  228.             break;
  229.         }
  230.     }
  231.     d100ms();
  232.     power(0);
  233.     putstr("\nPress any key to continue.");getch();
  234. }

  235. void main(void)
  236. {
  237.     power(0);
  238.     ADH.c=ADL.c=0;
  239.     initsio();
  240.     TI=1;
  241.     while(1){
  242.         switch(menu()){
  243.             case '1':
  244.                 putstr("\nThe chip will be erased,are you sure(Y/N)?");
  245.                 if(getch()=='Y'){
  246.                     putstr("\nErasing...");
  247.                     power(1);
  248.                     d100ms();
  249.                     erase();

  250.                     power(0);
  251.                     putstr("\nErased.\nPress any key to continue.");
  252.                     getch();
  253.                 }
  254.                 break;
  255.             case '2':
  256.                 writeData(0x400);
  257.                 break;
  258.             case '3':
  259.                 writeData(0x800);
  260.                 break;
  261.             case '4':
  262.                 writeData(0x1000);
  263.                 break;
  264.             case '5':
  265.                 writeData(0x2000);
  266.                 break;
  267.             case '6':
  268.                 readData(0x400);
  269.                 break;
  270.             case '7':
  271.                 readData(0x800);
  272.                 break;
  273.             case '8':
  274.                 readData(0x1000);
  275.                 break;
  276.             case '9':
  277.                 readData(0x2000);
  278.                 break;

  279.         }
  280.     }
  281. }
复制代码

     
发表于 2020-4-9 11:23:11 | 显示全部楼层
89C51/52/1051/2051/4051系列片子也老了,如果坚持用51系列,了解一下STC8系列吧,外部时钟和复位都不用。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 11:50:59 | 显示全部楼层
X宝上也还有AT的单片机编程器,不贵,付赠编程器软件。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 11:53:22 | 显示全部楼层
51系列的我一直用 EP51 编程器,支持 89C/89S 以及 2051,简单好用。
有幸入手了一块三锁紧座的 EP51,捎带着连 STC 也能烧录
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-4-9 12:03:36 | 显示全部楼层
本帖最后由 翌阳 于 2020-4-9 12:08 编辑
oldwood_hmgh 发表于 2020-4-9 11:23
89C51/52/1051/2051/4051系列片子也老了,如果坚持用51系列,了解一下STC8系列吧,外部时钟和复位都不用。


是啊,都是剩下的片子。想要玩新的,当然不用这东西了,都是20年前的玩意了。
其实,做这个编程器也是为了玩,而不是为了用。如果为了用,直接买个现成的了。
似乎现在的单片机,都不用编程器这玩意。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 15:40:08 | 显示全部楼层
翌阳 发表于 2020-4-9 12:03
是啊,都是剩下的片子。想要玩新的,当然不用这东西了,都是20年前的玩意了。
其实,做这个编程器也是 ...

别的系列我不知道,stc系列的不用专门的编程器。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 17:13:46 | 显示全部楼层
能自己做好就值得赞
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 17:25:08 | 显示全部楼层
不明觉厉(⊙o⊙)!
我只用过stc的
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 21:00:38 | 显示全部楼层
本帖最后由 xyz123 于 2020-4-9 21:03 编辑

同款。
EMP-100A编程器.JPG

DOS环境下的软件。
EMP100A编程器DOS界面.gif
不记得红灯版、绿灯版有何区别了。
DOS版MP-100编程器界面(红色LED).zip (160.44 KB, 下载次数: 39)
DOS版MP-100编程器界面(绿色LED).zip (162.7 KB, 下载次数: 45)

Win环境下的软件。
EMP100A编程器Win界面.gif
注册费好像¥二、三十,没买过。未注册版好像只能烧写前1、2K。
EMP-100A.rar (444.58 KB, 下载次数: 48)
回复 支持 反对

使用道具 举报

     
发表于 2020-4-9 21:33:55 | 显示全部楼层
看了一下发帖日期,原来不是穿越……

上次的上次搬家,扔了56管AT89S52……当年做项目的余料,一直以为以后能用上,所以带着它搬了一次又一次,最终一片没用上,无奈扔掉
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2020-4-10 12:18:24 | 显示全部楼层

最后的是WIN下的程序吗?下载了,在WIN10下不让运行。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-10 14:52:34 | 显示全部楼层
本帖最后由 xyz123 于 2020-4-10 15:13 编辑
翌阳 发表于 2020-4-10 12:18
最后的是WIN下的程序吗?下载了,在WIN10下不让运行。


以前在Win2000、WinXP下用过。Win7、Win10下没试过,可能要鼠标右键点选XP兼容模式、管理员权限运行之类的名堂。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-10 15:06:06 | 显示全部楼层
amo 发表于 2020-4-9 21:33
看了一下发帖日期,原来不是穿越……

上次的上次搬家,扔了56管AT89S52……当年做项目的余料,一直以为 ...

丢掉好浪费。
简单控制用老51蛮好的,功能简单易懂,速度μs级适合外围电路,DIP40引脚大个好焊。例如做这个
http://www.crystalradio.cn/forum ... ead&tid=1840794 做微波炉点焊机,接触器精确定时》
只是调试、烧写较费事。

STM32感觉蛮复杂,还没开始玩。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-10 18:33:54 | 显示全部楼层
用个VM虚拟机,装个win95,XP就可以了,串口用USB转,FT232芯片。使用早期的设备无任何问题。
回复 支持 反对

使用道具 举报

     
发表于 2020-4-10 22:25:50 | 显示全部楼层
没有用过8051,为了朋友的一个小小的项目,去使用了STC15,感觉也不错。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-9 09:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表