新聞中心

        89C51編程程序

        作者: 時間:2012-12-05 來源:網(wǎng)絡 收藏

        #include at89x52.h
        #include stdio.h
        #include intrins.h
        #include ctype.h

        本文引用地址:http://www.104case.com/article/170668.htm

        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(a10) return a+48;
        if(a>9) return a+55;}

        unsigned int getadr() /*get 5 ditiDEC adr*/
        {
        unsigned char i,a[5];
        for(i=0;i5;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 ditiHEX 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;adrmaxadr;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;adrnn;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;i50000;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;ip;i++) _nop_();
        prog=1;
        break;}
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        vpp=1;
        for(i=0;ip;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;i4000;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;i4000;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

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 延寿县| 额尔古纳市| 绍兴县| 嘉黎县| 江口县| 磐石市| 江北区| 临城县| 崇左市| 梓潼县| 河东区| 安义县| 丰顺县| 昌邑市| 微山县| 陆河县| 安溪县| 丰宁| 宝鸡市| 基隆市| 凌云县| 庆元县| 军事| 稻城县| 通化市| 金阳县| 乌什县| 宿松县| 米泉市| 本溪市| 许昌市| 建昌县| 磐安县| 平原县| 西吉县| 白银市| 吉木萨尔县| 张家界市| 娄底市| 隆安县| 永康市|