典型的89C51编程程序

来源:本站
导读:目前正在解读《典型的89C51编程程序》的相关信息,《典型的89C51编程程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《典型的89C51编程程序》的详细说明。
简介: 一段典型的89C51编程程序...

#include "at89x52.h"

#include "stdio.h"

#include "intrins.h"

#include "ctype.h"

sbit rdy=P3^2;

sbit vpp=P3^3;

sbit p26=P3^4;

sbit p27=P3^5;

sbit p36=P3^6;

sbit p37=P3^7;

sbit prog=P2^7;

void init_serial()

{

SCON=0x50; /*mode 1*/

TMOD=0x20;

TH1=0xfd;

PCON=0x80; /*38400bps*/

TR1=1; /*load tmr1*/

TI=1;

ES=1;}

void init_pro()

{

p26=0;

p27=0;

p36=0;

p37=0;

vpp=1;

prog=1;

}

void sendbyte(unsigned char da) /*send a byte*/

{

while(!TI);

TI=0;

SBUF=da;}

unsigned char IntToAscii(unsigned char a) /*change DEC to ASCII HEX code*/

{

if(a<10) return a+48;

if(a>9) return a+55;}

unsigned int getadr() /*get 5 diti DEC adr*/

{

unsigned char i,a[5];

for(i=0;i<5;i++)

{

while(!RI);

RI=0;

a[i]=SBUF-48;

}

return a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];}

unsigned char getdata() /*get 2 diti HEX data*/

{

unsigned char d1,d2;

while(!RI);

RI=0;

d1=toint(SBUF);

while(!RI);

RI=0;

d2=toint(SBUF);

return d1*16+d2;}

unsigned int detchip(int adr)

{

P0=0xff;

P1=adr%256;P2=adr/256;

init_pro();

_nop_();_nop_();_nop_();_nop_();_nop_(); /*delay 10 us*/

_nop_();_nop_();_nop_();_nop_();_nop_();

return P0;}

void read()

{

unsigned int adr,maxadr;

unsigned char h,l;

P0=0xff;

maxadr=getadr();

for(adr=0;adr<maxadr;adr++)

{

P1=adr%256;P2=adr/256;

p26=0;

p27=0;

p36=1;

p37=1;

vpp=1;

prog=1;

h=IntToAscii(P0/16);

sendbyte(h);

l=IntToAscii(P0%16);

sendbyte(l);}

init_pro();}

unsigned int test(unsigned int nn)

{

unsigned int adr,counter=0;

P0=0xff;

for(adr=0;adr<nn;adr++)

{

P1=adr%256;P2=adr/256;

p26=0;

p27=0;

p36=1;

p37=1;

vpp=1;

prog=1;

_nop_();_nop_();_nop_();_nop_();_nop_(); /*delay 10 us*/

_nop_();_nop_();_nop_();_nop_();_nop_();

if(P0!=0xff) counter++;}

init_pro();

return counter;}

unsigned char erase(unsigned int nn,unsigned int p)

{

unsigned int i;

P0=0xff;

p26=1;

p27=0;

p36=0;

p37=0;

vpp=0;

prog=1;

for(i=0;i<50000;i++) _nop_();

switch(p)

{

case 0 : prog=0;

prog=1;

break;

case 1 : prog=0;

_nop_();

prog=1;

break;

case 2 : prog=0;

_nop_();_nop_();

prog=1;

break;

case 3 : prog=0;

_nop_();_nop_();_nop_();

prog=1;

break;

case 4 : prog=0;

_nop_();_nop_();_nop_();_nop_();

prog=1;

break;

case 5 : prog=0;

_nop_();_nop_();_nop_();_nop_();_nop_();

prog=1;

break;

case 6 : prog=0;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

prog=1;

break;

case 7 : prog=0;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

prog=1;

break;

case 8 : prog=0;

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

prog=1;

break;

default: prog=0;

for(i=0;i<p;i++) _nop_();

prog=1;

break;}

_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();

vpp=1;

for(i=0;i<p;i++) _nop_();

if(test(nn)==0) return 's';

else return 'f';}

unsigned char write()

{

unsigned int adr,d,i;

p26=0;

p27=1;

p36=1;

p37=1;

vpp=0;

prog=1;

for(i=0;i<4000;i++) _nop_();

adr=getadr();

d=getdata();

while(1)

{

if(adr>50000) break;

P1=adr%256;P2=(adr/256)|0x80;

P0=d;

TI=0;

SBUF='s';

prog=0;

_nop_();_nop_();_nop_();

prog=1;

adr=getadr();

d=getdata();

while(!rdy);}

init_pro();

return 'f';}

unsigned char lock(unsigned char level)

{

unsigned int i;

vpp=0;

if(level==1) {p26=1;p27=1;p36=1;p37=1;}

if(level==2) {p26=1;p27=1;p36=0;p37=0;}

if(level==3) {p26=1;p27=0;p36=1;p37=0;}

for(i=0;i<4000;i++) _nop_();

prog=1;

_nop_();_nop_();_nop_();_nop_();_nop_(); /*delay 10 us*/

_nop_();_nop_();_nop_();_nop_();_nop_();

prog=0;

_nop_();_nop_();_nop_();_nop_();_nop_(); /*delay 10 us*/

_nop_();_nop_();_nop_();_nop_();_nop_();

prog=1;

_nop_();_nop_();_nop_();_nop_();_nop_();

while(!rdy);

init_pro();

return 'o';}

void main()

{

unsigned char data c;

unsigned int data adr,l,dx;

init_pro();

init_serial();

while(1)

{

init_pro();

scanf("%c",&c);

switch(c)

{

case 'c' : printf("%c",'o');

break;

case 'd' : scanf("%x",&adr);

printf("%x",detchip(adr));

break;

case 't' : scanf("%u",&dx);

printf("%u",test(dx));

break;

case 'r' : read();

break;

case 'e' : scanf("%u,%u",&adr,&dx);

printf("%c",erase(adr,dx));

break;

case 'w' : printf("%c",write());

break;

case 'l' : scanf("%u",&l);

printf("%c",lock(l));

break;

case 'h' : printf("**********Er6y Programmer Help Window***********n");

break;

default : break;}

}

}

提醒:《典型的89C51编程程序》最后刷新时间 2024-03-14 01:02:46,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《典型的89C51编程程序》该内容的真实性请自行鉴别。