Thanks to visit codestin.com
Credit goes to www.51hei.com

רע���Ӽ���ѧϰ���о�
��ǰλ�ã���Ƭ���̳��� >> MCU���ʵ�� >> �������

ʹ������MCU��STC15ϵ�е�Ƭ�����д���ISP���ؾ���(���ڿ�����STC��isp����Э�飩

����:����   ï¿½ï¿½Ô´:��վԭ��   ï¿½ï¿½ï¿½ï¿½ï¿½:��  ï¿½ï¿½ï¿½ï¿½Ê±ï¿½ä£º2014��08��21��   �����壺�� �� ��

  (ת����STC-ISP.EXE V6.67����)

 

  

 

ʹ������MCU��STC15ϵ�е�Ƭ�����д���ISP���ؾ���(���ڿ�����STC��isp����Э�飩

 


 

ʹ������MCU��STC15ϵ�е�Ƭ�����д���ISP���ؾ���(���ڿ�����STC��Ƭ����isp����Э�飩

 

 

 

 

 

 

 

 

 

 

//��ʾ����Keil������������ѡ��Intel��8058оƬ�ͺŽ��б���

//�ٶ�����оƬ�Ĺ���Ƶ��Ϊ11.0592MHz

 

//ע��:ʹ�ñ������STC15ϵ�еĵ�Ƭ����������ʱ,����Ҫִ����Download����֮��,

//���ܸ�Ŀ��оƬ�ϵ�,����Ŀ��оƬ���޷���ȷ����

 

#include "reg51.h"

 

typedef bit BOOL;

typedef unsigned char BYTE;

typedef unsigned short WORD;

typedef unsigned long DWORD;

 

//�ꡢ��������

#define FALSE               0

#define TRUE                1

#define LOBYTE(w)           ((BYTE)(WORD)(w))

#define HIBYTE(w)           ((BYTE)((WORD)(w) >> 8))

 

#define MINBAUD             2400L

#define MAXBAUD             115200L

 

#define FOSC                11059200L                   //����оƬ����Ƶ��

#define BR(n)               (65536 - FOSC/4/(n))        //����оƬ���ڲ����ʼ��㹫ʽ

#define T1MS                (65536 - FOSC/1000)         //����оƬ1ms��ʱ��ֵ

 

#define FUSER               24000000L                   //15ϵ��Ŀ��оƬ����Ƶ��

#define RL(n)               (65536 - FUSER/4/(n))       //15ϵ��Ŀ��оƬ���ڲ����ʼ��㹫ʽ

 

//SFR����

sfr AUXR = 0x8e;

 

//��������

BOOL f1ms;                                              //1ms��־λ

BOOL UartBusy;                                          //���ڷ���æ��־λ

BOOL UartReceived;                                      //�������ݽ�����ɱ�־λ

BYTE UartRecvStep;                                      //�������ݽ��տ���

BYTE TimeOut;                                           //����ͨѶ��ʱ������

BYTE xdata TxBuffer[256];                               //�������ݷ��ͻ�����

BYTE xdata RxBuffer[256];                               //�������ݽ��ջ�����

char code DEMO[256];                                    //��ʾ��������

 

//��������

void Initial(void);

void DelayXms(WORD x);

BYTE UartSend(BYTE dat);

void CommInit(void);

void CommSend(BYTE size);

BOOL Download(BYTE *pdat, long size);

 

//���������

void main(void)

{

    while (1)

    {

        Initial();

        if (Download(DEMO, 0x0100))

        {

            //���سɹ�

            P3 = 0xff;

            DelayXms(500);

            P3 = 0x00;

            DelayXms(500);

            P3 = 0xff;

            DelayXms(500);

            P3 = 0x00;

            DelayXms(500);

            P3 = 0xff;

            DelayXms(500);

            P3 = 0x00;

            DelayXms(500);

            P3 = 0xff;

        }

        else

        {

            //����ʧ��

            P3 = 0xff;

            DelayXms(500);

            P3 = 0xf3;

            DelayXms(500);

            P3 = 0xff;

            DelayXms(500);

            P3 = 0xf3;

            DelayXms(500);

            P3 = 0xff;

            DelayXms(500);

            P3 = 0xf3;

            DelayXms(500);

            P3 = 0xff;

        }

    }

}

 

//1ms��ʱ���жϷ������

void tm0(void) interrupt 1 using 1

{

    static BYTE Counter100;

   

    f1ms = TRUE;

    if (Counter100-- == 0)

    {

        Counter100 = 100;

        if (TimeOut) TimeOut--;

    }

}

 

//�����жϷ������

void uart(void) interrupt 4 using 1

{

    static WORD RecvSum;

    static BYTE RecvIndex;

    static BYTE RecvCount;

    BYTE dat;

 

    if (TI)

    {  

        TI = 0;

        UartBusy = FALSE;

    }

   

    if (RI)

    {

        RI = 0;

        dat = SBUF;

        switch (UartRecvStep)

        {

        case 1:

            if (dat != 0xb9) goto L_CheckFirst;

            UartRecvStep++;

            break;

        case 2:

            if (dat != 0x68) goto L_CheckFirst;

            UartRecvStep++;

            break;

        case 3:

            if (dat != 0x00) goto L_CheckFirst;

            UartRecvStep++;

            break;

        case 4:

            RecvSum = 0x68 + dat;

            RecvCount = dat - 6;

            RecvIndex = 0;

            UartRecvStep++;

            break;

        case 5:

            RecvSum += dat;

            RxBuffer[RecvIndex++] = dat;

            if (RecvIndex == RecvCount) UartRecvStep++;

            break;

        case 6:

            if (dat != HIBYTE(RecvSum)) goto L_CheckFirst;

            UartRecvStep++;

            break;

        case 7:

            if (dat != LOBYTE(RecvSum)) goto L_CheckFirst;

            UartRecvStep++;

            break;

        case 8:

            if (dat != 0x16) goto L_CheckFirst;

            UartReceived = TRUE;

            UartRecvStep++;

            break;

L_CheckFirst:

        case 0:

        default:

            CommInit();

            UartRecvStep = (dat == 0x46 ? 1 : 0);

            break;

        }

    }

}

 

//ϵͳ��ʼ��

void Initial(void)

{

    UartBusy = FALSE;

 

    SCON = 0xd0;                    //��������ģʽ����Ϊ8���+1λż����

    AUXR = 0xc0;

    TMOD = 0x00;

    TH0 = HIBYTE(T1MS);

    TL0 = LOBYTE(T1MS);

    TR0 = 1;

    TH1 = HIBYTE(BR(MINBAUD));

    TL1 = LOBYTE(BR(MINBAUD));

    TR1 = 1;

    ET0 = 1;

    ES = 1;

    EA = 1;

}

 

//Xms��ʱ����

void DelayXms(WORD x)

{

    do

    {

        f1ms = FALSE;

        while (!f1ms);

    } while (x--);

}

 

//�������ݷ��ͳ���

BYTE UartSend(BYTE dat)

{

    while (UartBusy);

   

    UartBusy = TRUE;

    ACC = dat;

    TB8 = P;

    SBUF = ACC;

   

    return dat;

}

 

//����ͨѶ��ʼ��

void CommInit(void)

{

    UartRecvStep = 0;

    TimeOut = 20;

    UartReceived = FALSE;

}

 

//���ʹ���ͨѶ���ݰ�

void CommSend(BYTE size)

{

 WORD sum;

    BYTE i;

   

    UartSend(0x46);

    UartSend(0xb9);

    UartSend(0x6a);

    UartSend(0x00);

    sum = size + 6 + 0x6a;

    UartSend(size + 6);

    for (i=0; i

    {

        sum += UartSend(TxBuffer[i]);

    }

    UartSend(HIBYTE(sum));

    UartSend(LOBYTE(sum));

    UartSend(0x16);

    while (UartBusy);

 

    CommInit();

}

 

//��STC15ϵ�е�оƬ�����������س���

BOOL Download(BYTE *pdat, long size)

{

    BYTE arg;

    BYTE cnt;

    WORD addr;

   

    //����

    CommInit();

    while (1)

    {

        if (UartRecvStep == 0)

        {

            UartSend(0x7f);

            DelayXms(10);

        }

        if (UartReceived)

        {

            arg = RxBuffer[4];

            if (RxBuffer[0] == 0x50) break;

            return FALSE;

        }

    }

 

    //����

    TxBuffer[0] = 0x01;

    TxBuffer[1] = arg;

    TxBuffer[2] = 0x40;

 TxBuffer[3] = HIBYTE(RL(MAXBAUD));

 TxBuffer[4] = LOBYTE(RL(MAXBAUD));

 TxBuffer[5] = 0x00;

 TxBuffer[6] = 0x00;

 TxBuffer[7] = 0xc3;

    CommSend(8);

 while (1)

 {

        if (TimeOut == 0) return FALSE;

        if (UartReceived)

        {

            if (RxBuffer[0] == 0x01) break;

            return FALSE;

        }

 }

 

    //׼��

    TH1 = HIBYTE(BR(MAXBAUD));

    TL1 = LOBYTE(BR(MAXBAUD));

    DelayXms(10);

 TxBuffer[0] = 0x05;

 CommSend(1);

 while (1)

 {

        if (TimeOut == 0) return FALSE;

        if (UartReceived)

        {

            if (RxBuffer[0] == 0x05) break;

            return FALSE;

        }

 }

   

    //����

    DelayXms(10);

 TxBuffer[0] = 0x03;

 TxBuffer[1] = 0x00;

 CommSend(2);

    TimeOut = 100;

    while (1)

 {

        if (TimeOut == 0) return FALSE;

        if (UartReceived)

        {

            if (RxBuffer[0] == 0x03) break;

            return FALSE;

        }

 }

 

    //д�û�����

    DelayXms(10);

    addr = 0;

 TxBuffer[0] = 0x22;

 while (addr < size)

 {

        TxBuffer[1] = HIBYTE(addr);

        TxBuffer[2] = LOBYTE(addr);

        cnt = 0;

        while (addr < size)

        {

            TxBuffer[cnt+3] = pdat[addr];

            addr++;

            cnt++;

            if (cnt >= 128) break;

        }

        CommSend(cnt + 3);

  while (1)

  {

            if (TimeOut == 0) return FALSE;

            if (UartReceived)

            {

                if ((RxBuffer[0] == 0x02) && (RxBuffer[1] == 'T')) break;

                return FALSE;

            }

  }

  TxBuffer[0] = 0x02;

 }

 

    //дӲ��ѡ��(�������Ҫ�޸�Ӳ��ѡ��,�˲����ֱ������)

    DelayXms(10);

    for (cnt=0; cnt<128; cnt++)

    {

        TxBuffer[cnt] = 0xff;

 }

    TxBuffer[0] = 0x04;

 TxBuffer[1] = 0x00;

 TxBuffer[2] = 0x00;

 TxBuffer[34] = 0xfd;

 TxBuffer[62] = arg;

 TxBuffer[63] = 0x7f;

 TxBuffer[64] = 0xf7;

 TxBuffer[65] = 0x7b;

 TxBuffer[66] = 0x1f;

 CommSend(67);

 while (1)

 {

        if (TimeOut == 0) return FALSE;

        if (UartReceived)

        {

            if ((RxBuffer[0] == 0x04) && (RxBuffer[1] == 'T')) break;

            return FALSE;

        }

 }

 

    //�������

    return TRUE;

}

 

char code DEMO[256] =

{

    0x02,0x00,0x5E,0x12,0x00,0x4B,0x75,0xB0,

    0xEF,0x12,0x00,0x2C,0x75,0xB0,0xDF,0x12,

    0x00,0x2C,0x75,0xB0,0xFE,0x12,0x00,0x2C,

    0x75,0xB0,0xFD,0x12,0x00,0x2C,0x75,0xB0,

    0xFB,0x12,0x00,0x2C,0x75,0xB0,0xF7,0x12,

    0x00,0x2C,0x80,0xDA,0xE4,0xFF,0xFE,0xE4,

    0xFD,0xFC,0x0D,0xBD,0x00,0x01,0x0C,0xBC,

    0x01,0xF8,0xBD,0xF4,0xF5,0x0F,0xBF,0x00,

    0x01,0x0E,0xBE,0x03,0xEA,0xBF,0xE8,0xE7,

    0x02,0x00,0x4B,0x75,0x80,0xFF,0x75,0x90,

    0xFF,0x75,0xA0,0xFF,0x75,0xB0,0xFF,0x75,

    0xC0,0xFF,0x75,0xC8,0xFF,0x22,0x78,0x7F,

    0xE4,0xF6,0xD8,0xFD,0x75,0x81,0x07,0x02,

    0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

 

 

 

 

���رմ�����