/*---------------------------------------------------------------------*/ /* --- STC MCU Limited ------------------------------------------------*/ /* --- To be downloaded from the ISP chip (limited STC15 series), for example using the main chip -----------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* --- Fax: 86-755-82905966 -------------------------------------------*/ /* --- Tel: 86-755-82948412 -------------------------------------------*/ /* --- Web: www.STCMCU.com --------------------------------------------*/ /* If you want to use this code in the program, in the program, using the information and procedures specified macro crystal technology */ /* If you want to quote this code in the article, please indicate in the article the use of information technology and procedures Wang Jing */ /*---------------------------------------------------------------------*/ // This sample in the Keil development environment select the Intel 8058 chip models compiled // Assumed test chip operating frequency is 11.0592MHz // Note: When using this code STC15 series of microcontrollers for download must be executed after Download code // In order to power on the target chip, otherwise the chip will not be able to download the correct target #include "reg51.h" typedef bit BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; // Macro, constant definitions #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 // Master chip operating frequency #define BR(n) (65536 - FOSC/4/(n)) //Master chip baud rate calculation formula #define T1MS (65536 - FOSC/1000) //Initial master chip 1ms Timing //#define FUSER 11059200L //STC15系列目标芯片工作频率 //#define FUSER 12000000L //STC15系列目标芯片工作频率 //#define FUSER 18432000L //STC15系列目标芯片工作频率 //#define FUSER 22118400L //STC15系列目标芯片工作频率 #define FUSER 24000000L //STC15 series target chip operating frequency #define RL(n) (65536 - FUSER/4/(n)) //STC15 series target chip baud rate calculation formula //SFR sfr AUXR = 0x8e; //variables BOOL f1ms; //1ms flag BOOL UartBusy; //Serial transmit busy flag BOOL UartReceived; //Serial data received flag BYTE UartRecvStep; //Serial data reception control BYTE TimeOut; //Serial communication timeout counter BYTE xdata TxBuffer[256]; //Serial data transmit buffer BYTE xdata RxBuffer[256]; //Serial data receive buffer char code DEMO[256]; //Demo code data //Function declaration void Initial(void); void DelayXms(WORD x); BYTE UartSend(BYTE dat); void CommInit(void); void CommSend(BYTE size); BOOL Download(BYTE *pdat, long size); //Main function entry void main(void) { while (1) { Initial(); if (Download(DEMO, 0x0100)) { //download successful 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 { //download failed 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 Timer interrupt service routine void tm0(void) interrupt 1 using 1 { static BYTE Counter100; f1ms = TRUE; if (Counter100-- == 0) { Counter100 = 100; if (TimeOut) TimeOut--; } } //The serial interrupt service routine 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; } } } //system initialization void Initial(void) { UartBusy = FALSE; SCON = 0xd0; //Serial data pattern must be 8-bit data + 1-bit even parity 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 Delay program void DelayXms(WORD x) { do { f1ms = FALSE; while (!f1ms); } while (x--); } //Serial data transmission program BYTE UartSend(BYTE dat) { while (UartBusy); UartBusy = TRUE; ACC = dat; TB8 = P; SBUF = ACC; return dat; } //Serial communication initialization void CommInit(void) { UartRecvStep = 0; TimeOut = 20; UartReceived = FALSE; } //Send serial communication data packet 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= 128) break; } CommSend(cnt + offset); while (1) { if (TimeOut == 0) return FALSE; if (UartReceived) { if ((RxBuffer[0] == 0x02) && (RxBuffer[1] == 'T')) break; return FALSE; } } TxBuffer[0] = 0x02; } //// Write hardware options //// If you do not modify hardware options can skip this step at this time all the hardware options //// Remained unchanged, MCU frequency by adjusting the frequency to the last //// If the write hardware options, MCU internal IRC frequency will be fixed written as 24M, //// Suggestion: Good first use STC-ISP download software from the chip hardware option settings //// Later using the main chip for chip program is downloaded from the hardware option does not write //DelayXms(10); //for (cnt=0; cnt<128; cnt++) //{ // TxBuffer[cnt] = 0xff; //} //TxBuffer[0] = 0x04; //TxBuffer[1] = 0x00; //TxBuffer[2] = 0x00; //if (fwver < 0x72) //{ // TxBuffer[34] = 0xfd; // TxBuffer[62] = arg; // TxBuffer[63] = 0x7f; // TxBuffer[64] = 0xf7; // TxBuffer[65] = 0x7b; // TxBuffer[66] = 0x1f; // CommSend(67); //} //else //{ // TxBuffer[3] = 0x5a; // TxBuffer[4] = 0xa5; // TxBuffer[36] = 0xfd; // TxBuffer[64] = arg; // TxBuffer[65] = 0x7f; // TxBuffer[66] = 0xf7; // TxBuffer[67] = 0x7b; // TxBuffer[68] = 0x1f; // CommSend(69); //} //while (1) //{ // if (TimeOut == 0) return FALSE; // if (UartReceived) // { // if ((RxBuffer[0] == 0x04) && (RxBuffer[1] == 'T')) break; // return FALSE; // } //} // The download is complete 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, };