<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

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

        };

         

         

         

         

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮