单片机: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单片机,不同的单片机的寄存器不太一样,但原理相通,只需要根据数据手册稍作修改即可。

将自动下载的代码封装成函数方便调用。

posted @ 2021-08-17 08:07  myrj  阅读(289)  评论(0编辑  收藏  举报