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单片机,不同的单片机的寄存器不太一样,但原理相通,只需要根据数据手册稍作修改即可。
将自动下载的代码封装成函数方便调用。