找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2904|回復: 0
收起左側

89C51系列CPU編程器接收CPU程序

[復制鏈接]
ID:104835 發(fā)表于 2016-2-1 04:46 | 顯示全部樓層 |閱讀模式
  1. /* 89C51系列CPU編程器接收CPU程序*/
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include <absacc.h>#define e 8
  5. #define p 9
  6. #define l 10
  7. sbit led=P3^2;
  8. sbit p27=P2^7;
  9. sbit p26=P2^6;
  10. sbit p36=P3^6;
  11. sbit p37=P3^7;
  12. sbit rst=P3^3;
  13. sbit ale=P3^5;
  14. sbit vpp=P3^4;
  15. bit b_break;
  16. unsigned int adds;
  17. // 13.8mS
  18. void int_t0(void) interrupt 1 {
  19. TH0=-100;
  20. b_break=1;
  21. }
  22. void wait(unsigned char w) {
  23. unsigned int t=w*184;
  24. b_break=0;
  25. TL0=-t%256-1;TH0=-t/256;
  26. while (b_break==0) {}
  27. }
  28. void nop(void) {
  29. _nop_();_nop_();_nop_();_nop_();
  30. _nop_();_nop_();_nop_();_nop_();
  31. _nop_();_nop_();_nop_();_nop_();
  32. _nop_();_nop_();_nop_();_nop_();
  33. _nop_();_nop_();_nop_();_nop_();
  34. }
  35. unsigned char command(void) {
  36. TH0=-100;b_break=0;
  37. while (RI==0) {if (b_break==1) return(0);}
  38. RI=0;
  39. return(SBUF);
  40. }
  41. void earsure(unsigned char cpu) {
  42. switch (cpu) {
  43. case 1: //89C51
  44. case 2:rst=p26=1;p27=p36=p37=0;nop();vpp=1;nop();
  45. ale=0;wait(110);ale=1;nop();
  46. break;
  47. case 3:
  48. case 4:break;
  49. case 5:
  50. case 6:break;
  51. }
  52. }
  53. void program(unsigned char cpu) {
  54. unsigned int bdata adds=0;
  55. unsigned char d;
  56. switch (cpu) {
  57. case 1: //89C51
  58. case 2:
  59. p36=p37=1;rst=1;
  60. while (1) {
  61.    TH0=-100;b_break=0;
  62.    while (RI==0) {if (b_break==1) return;}
  63.    RI=0;
  64.    d=SBUF;
  65.    //address
  66.    P0=adds%256;
  67.    P2=adds/256;
  68.    p27=1;
  69.    //data
  70.    P1=d;
  71.    nop(); //48clcl
  72.    //vpp
  73.    vpp=1;
  74.    nop(); //48clcl
  75.    //ale
  76.    ale=0;
  77.    wait(1);//100uS
  78.    ale=1;
  79.    nop(); //10uS
  80.    vpp=0;
  81.    nop(); //48clcl
  82.    p27=0;
  83.    nop(); //48clcl
  84.    P1=0xff;
  85.    TH0=-100;b_break=0;
  86.    while (d!=P1) {if (b_break==1) return;} //data polling
  87.    SBUF=d;
  88.    adds++;
  89. }
  90. break;
  91. case 3:
  92. case 4:
  93. case 5:
  94. case 6:break;
  95. }
  96. }
  97. void lock(unsigned char cpu) {
  98. unsigned char i;
  99. switch (cpu) {
  100. case 1: //89c51
  101. case 2:
  102. //lock 1
  103. rst=p26=p36=p27=p37=1;nop();
  104. vpp=1;
  105. nop();
  106. ale=0;
  107. // for (i=0;i<6;i++) wait(100);
  108. wait(1);
  109. ale=1;
  110. nop();
  111. vpp=0;
  112. nop();

  113. //lock 2
  114. rst=p26=p27=1;p36=p37=0;nop();
  115. vpp=1;
  116. nop();
  117. ale=0;
  118. // for (i=0;i<6;i++) wait(100);
  119. wait(1);
  120. ale=1;
  121. nop();
  122. vpp=0;
  123. nop();

  124. //lock 3
  125. rst=p26=p36=1;p27=p37=0;nop();
  126. vpp=1;
  127. nop();
  128. ale=0;
  129. // for (i=0;i<6;i++) wait(100);
  130. wait(1);
  131. ale=1;
  132. nop();
  133. vpp=0;
  134. nop();
  135. break;
  136. case 3:
  137. case 4:
  138. case 5:
  139. case 6:break;
  140. }
  141. }
  142. void main(void) {
  143. unsigned char disp,flash,temp,cpu;
  144. EA=1;
  145. SCON=0xd8;PCON=0x80;
  146. TMOD=0x21;
  147. TL1=TH1=0xff;TR1=1;
  148. TH0=-100;ET0=TR0=1;
  149. flash=0x80;


  150. while (1) {
  151. temp=command();
  152. switch (temp) {
  153. case 0:
  154. case 1: //89c51
  155. case 2: //89C52
  156. case 3: //80f51
  157. case 4: //80F52
  158. case 5: //87F51
  159. case 6:cpu=temp;SBUF=temp;break;//87f52
  160. case e:SBUF=temp;earsure(cpu);break; //erasure
  161. case p:SBUF=temp;program(cpu);break; //program
  162. case l:lock(cpu);SBUF=temp;break; //lock
  163. default:SBUF=temp;break;
  164. }
  165. b_break=0;
  166. if ((++disp)>flash) {disp=0;led=!led;}
  167. }
  168. }
復制代碼


回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表