久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 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,

};

 

 

 

 

關閉窗口
主站蜘蛛池模板: 成年人免费网站 | 欧美视频成人 | 亚洲精品久久久久久久久久久 | 成人性视频在线播放 | 精精精精xxxx免费视频 | 日本精品一区二区 | 有码在线 | 亚洲精品一区二区三区蜜桃久 | 九九久久99| 成人a视频 | 欧美伊人久久久久久久久影院 | 日韩午夜网站 | 81精品国产乱码久久久久久 | 欧美激情视频网站 | 欧美午夜剧场 | 熟女毛片| 精品欧美一区免费观看α√ | 国产一区二区精品在线观看 | 91视频88av| 91操操操| 国产精品久久久久久妇女6080 | 夜夜爽99久久国产综合精品女不卡 | 激情网五月天 | 91视频久久 | av一区二区在线观看 | 中文字幕精品一区久久久久 | 在线国产一区 | 国产xxx在线观看 | 国产精品毛片久久久久久久 | 成人精品视频 | 国产成人精品一区二区三区网站观看 | www.99re| av日韩在线播放 | 亚洲狠狠 | 久久亚洲精品国产精品紫薇 | 日韩图区 | 一区精品视频在线观看 | 欧美成人h版在线观看 | 日韩精品一区二区三区 | 色天天综合 | 午夜视频免费网站 |