89C51编程程序

发布时间:2012-8-15 23:15    发布者:zbzb12345
关键词: 89C51 , 编程
  1. #include "at89x52.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. #include "ctype.h"
  5. sbit rdy=P3^2;
  6. sbit vpp=P3^3;
  7. sbit  p26=P3^4;
  8. sbit p27=P3^5;
  9. sbit p36=P3^6;
  10. sbit p37=P3^7;
  11. sbit  prog=P2^7;
  12. void init_serial()
  13. {
  14. SCON=0x50; /*mode  1*/
  15. TMOD=0x20;
  16. TH1=0xfd;
  17. PCON=0x80;  /*38400bps*/
  18. TR1=1;   /*load tmr1*/
  19. TI=1;
  20. ES=1;}
  21. void init_pro()
  22. {
  23. p26=0;
  24. p27=0;
  25. p36=0;
  26. p37=0;
  27. vpp=1;
  28. prog=1;
  29. }
  30. void sendbyte(unsigned char da)        /*send a  byte*/
  31. {
  32. while(!TI);
  33. TI=0;
  34. SBUF=da;}

  35. unsigned char  IntToAscii(unsigned char a)     /*change DEC to ASCII HEX code*/
  36. {
  37. if(a<10) return a+48;
  38. if(a>9) return a+55;}
  39. unsigned int getadr()                        /*get 5 diti  DEC adr*/
  40. {
  41. unsigned char i,a[5];
  42. for(i=0;i<5;i++)
  43. {
  44.   while(!RI);
  45.   RI=0;
  46.   a=SBUF-48;
  47.   }
  48. return  a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];}
  49. unsigned char getdata()                     /*get 2 diti  HEX data*/
  50. {
  51. unsigned char d1,d2;
  52. while(!RI);
  53. RI=0;
  54. d1=toint(SBUF);
  55. while(!RI);
  56. RI=0;
  57. d2=toint(SBUF);
  58. return d1*16+d2;}

  59. unsigned int detchip(int adr)
  60. {
  61. P0=0xff;
  62. P1=adr%256;P2=adr/256;
  63. init_pro();
  64. _nop_();_nop_();_nop_();_nop_();_nop_();  /*delay 10 us*/
  65. _nop_();_nop_();_nop_();_nop_();_nop_();
  66. return P0;}

  67. void read()
  68. {
  69. unsigned int adr,maxadr;
  70. unsigned char h,l;
  71. P0=0xff;
  72. maxadr=getadr();
  73. for(adr=0;adr
  74. {
  75.    P1=adr%256;P2=adr/256;
  76.    p26=0;
  77.    p27=0;
  78.    p36=1;
  79.    p37=1;
  80.    vpp=1;
  81.    prog=1;
  82.    h=IntToAscii(P0/16);
  83.    sendbyte(h);
  84.    l=IntToAscii(P0%16);
  85.    sendbyte(l);}
  86. init_pro();}
  87. unsigned int test(unsigned int nn)
  88. {
  89. unsigned int adr,counter=0;
  90. P0=0xff;
  91. for(adr=0;adr
  92. {
  93.   P1=adr%256;P2=adr/256;
  94.   p26=0;
  95.   p27=0;
  96.   p36=1;
  97.   p37=1;
  98.   vpp=1;
  99.   prog=1;
  100.   _nop_();_nop_();_nop_();_nop_();_nop_();  /*delay 10 us*/
  101.   _nop_();_nop_();_nop_();_nop_();_nop_();   
  102.   if(P0!=0xff) counter++;}
  103.   init_pro();
  104.   return counter;}
  105. unsigned char erase(unsigned int nn,unsigned  int p)
  106. {
  107. unsigned int i;
  108. P0=0xff;
  109. p26=1;
  110. p27=0;
  111. p36=0;
  112. p37=0;
  113. vpp=0;
  114. prog=1;
  115. for(i=0;i<50000;i++) _nop_();
  116. switch(p)
  117. {
  118.   case 0 : prog=0;
  119.            prog=1;
  120.            break;
  121.   case 1 : prog=0;
  122.            _nop_();
  123.            prog=1;
  124.            break;
  125.   case 2 : prog=0;
  126.            _nop_();_nop_();
  127.            prog=1;
  128.            break;
  129.   case 3 : prog=0;
  130.            _nop_();_nop_();_nop_();
  131.            prog=1;
  132.            break;
  133.   case 4 : prog=0;
  134.            _nop_();_nop_();_nop_();_nop_();
  135.            prog=1;
  136.            break;
  137.   case 5 : prog=0;
  138.            _nop_();_nop_();_nop_();_nop_();_nop_();
  139.            prog=1;
  140.            break;
  141.   case 6 : prog=0;
  142.            _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  143.            prog=1;
  144.            break;
  145.   case 7 : prog=0;
  146.            _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  147.            prog=1;
  148.            break;
  149.   case 8 : prog=0;
  150.            _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  151.            prog=1;
  152.            break;
  153.   default: prog=0;
  154.            for(i=0;i
  155.            prog=1;
  156.            break;}
  157. _nop_();_nop_();_nop_();_nop_();
  158. _nop_();_nop_();_nop_();_nop_();
  159. vpp=1;
  160. for(i=0;i
  161. if(test(nn)==0) return 's';
  162. else return 'f';}
  163. unsigned char write()
  164. {
  165. unsigned int  adr,d,i;
  166. p26=0;
  167. p27=1;
  168. p36=1;
  169. p37=1;
  170. vpp=0;
  171. prog=1;
  172. for(i=0;i<4000;i++) _nop_();
  173. adr=getadr();
  174. d=getdata();
  175. while(1)
  176. {
  177.   if(adr>50000) break;
  178.   P1=adr%256;P2=(adr/256)|0x80;
  179.   P0=d;
  180.   TI=0;
  181.   SBUF='s';
  182.   prog=0;
  183.   _nop_();_nop_();_nop_();
  184.   prog=1;
  185.   adr=getadr();
  186.   d=getdata();
  187.   while(!rdy);}
  188.   init_pro();
  189.   return  'f';}
  190. unsigned char lock(unsigned char level)
  191. {
  192. unsigned int i;
  193. vpp=0;
  194. if(level==1) {p26=1;p27=1;p36=1;p37=1;}
  195. if(level==2) {p26=1;p27=1;p36=0;p37=0;}
  196. if(level==3)  {p26=1;p27=0;p36=1;p37=0;}
  197. for(i=0;i<4000;i++) _nop_();
  198. prog=1;
  199. _nop_();_nop_();_nop_();_nop_();_nop_();  /*delay 10 us*/
  200. _nop_();_nop_();_nop_();_nop_();_nop_();
  201. prog=0;
  202. _nop_();_nop_();_nop_();_nop_();_nop_();  /*delay 10 us*/
  203. _nop_();_nop_();_nop_();_nop_();_nop_();
  204. prog=1;
  205. _nop_();_nop_();_nop_();_nop_();_nop_();
  206. while(!rdy);
  207. init_pro();
  208. return 'o';}
  209. void main()
  210. {
  211. unsigned char data c;
  212. unsigned int data adr,l,dx;
  213. init_pro();
  214. init_serial();
  215. while(1)
  216. {
  217.   init_pro();
  218.   scanf("%c",&c);
  219.   switch(c)
  220.   {
  221.    case 'c' : printf("%c",'o');
  222.               break;
  223.    case 'd' :  scanf("%x",&adr);
  224.               printf("%x",detchip(adr));
  225.               break;
  226.    case 't' : scanf("%u",&dx);
  227.               printf("%u",test(dx));
  228.               break;
  229.    case 'r' : read();
  230.               break;
  231.    case 'e' : scanf("%u,%u",&adr,&dx);
  232.               printf("%c",erase(adr,dx));
  233.               break;
  234.    case 'w' : printf("%c",write());
  235.               break;
  236.    case 'l' :  scanf("%u",&l);
  237.               printf("%c",lock(l));
  238.               break;
  239.    case 'h' : printf("**********Er6y Programmer Help  Window***********\n");
  240.               break;
  241.     default : break;}


  242.   }
  243. }
复制代码


文章来源:http://www.originic.hk/bbs/display.asp?id=290
本文地址:https://www.eechina.com/thread-95814-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表