单片机:ISP 下载源代码原理
serve.h
/* funtion:automatic download explanation: switch:#define _DOWNLOAD_(before #include"serve.h") remember to use uart_init before! */ #ifdef _DOWNLOAD_ #include<reg52.h> sfr ISP_CONTR = 0xe7; uint8_t uart_ser_n = 0; void uart1_ser() interrupt 4 { RI = 0; //清空接收标志位 if(SBUF == 0x7f) //STC下载指令0X7F { uart_ser_n++; //判断位自加 if(uart_ser_n == 10) //如果收到10次0X7F { uart_ser_n = 0; //判断位清0 ISP_CONTR = 0x60;//复位命令 } } else { uart_ser_n = 0; } } #endif /* explanation: crystal frequency:11.0592MHz bps:9600 timer1:mode2 UART:mode1 */ extern void uart_init(void);
serve.c
void uart_init(void) { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; REN = 1; SM0 = 0; SM1 = 1; EA = 1; ES = 1; }
main.c
#define _DOWNLOAD_ #include"serve.h" #include<reg52.h> int main() { uart_init(); while(1) { P1 = ~P1; delay_ms(100); } }
这里使用的是STC89C52单片机,不同的单片机的寄存器不太一样,但原理相通,只需要根据数据手册稍作修改即可。
将自动下载的代码封装成函数方便调用。