⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c.svn-base

📁 串口通信 单片机程序 isp在线下载功能
💻 SVN-BASE
字号:
//库文件
#include <stdio.h>
#include "W78E516B.H"	//本地目录中,W78E516B头文件
#include "APROM.H"	//本地目录中,自定义头文件
//定时中断0
void Timer0 (void) interrupt 1 using 1
{
    TR0=0;										 //关中断
    TF0=0;
}
//串口处理程序
void Serial(void) interrupt 4 using 3
{
	 uint i,j,CodeTemp;							//CodeTemp为指令临时变量,i为Index,j为串口数据
	 //未接收到数据
    if(RI==0)
    { 
	 	  TI=0;
  	 }
	 //接收到数据,做判断
    else
    {
        JmpLDROM=1;
        i=0;										//i从0~8,目前上位机使用9个字符作为升级指令SYNTEC001
        while(1)
        {
		  	j=SBUF;									//接收串口数据
            CodeTemp=UpdateCommandCode[i];
				//不是升级指令 
            if(j!=CodeTemp)               	        
            {
				JmpLDROM=0;	
                goto ERROR;						//不是升级指令出口
            }
				//判断Index是否为最后一个字符,即判断完毕
            while(i==UpdateCommandCodeTotalNumber)//i=8
            { 
					goto OK;								//通信正常,并且接收完毕,并且为升级指令出口
				}
            RecDataCheck();						//检测串行通信是否正常
				//通信超时
            if(TimerOut==1)
            { 
           	   JmpLDROM=0;
            	goto ERROR; 						//通信错误出口
            }
            i++;
        }
    }
    OK: 													//成功
		;												
    ERROR: 												//错误
	 	;											
    RI=0;
    TR0=0;

}

//主程序
void main(void)
{
	 int i,k;								//i为Index,8ms的循环使用,k为查询串口次数index,
    k=0;
    InitialProgram();					//初始化程序
    JmpLDROM=0;							//跳转LDROM状态位,1跳转,0不跳转
    while(1)
    {
	     if(JmpLDROM==1)					//跳转 LDROM状态位为1
	     {
	        ES=0;							//关串口

	        ChangeAPtoLD();				//跳转LDROM
	     }
	     for(i=0;i<8000;i++);	     	//8ms循环判断一次JmpLDROM 
		  {
	         ;
		  }
	     k++;
	    if(k==25)							//循环判断25次后如果还是不能接收正确并跳转LDROM,则说明不用升级直接执行用户应用程序,根据需要可以修改
	 	 {
			goto	UserApplication;
		 }
    }

	 //用户应用程序
    UserApplication:
	 P2 = 0xaa;							//测试进入用户程序
		;										//

}
//初始化程序
void InitialProgram(void)
{
        IE=0x00;
        ET0=1;          // timer0 interrupt enable
        ES=1;           // RS-232 interrupt enable
        EA=1;           // all interrupt enable
        // Timer2BaudRate();
        SCON=0x50;      // mode=mode1 ,ren=enable
        T2CON=0x30;     // Timer2=BaudRate CLK

        RCAP2H = 0xff;			//Fosc = 11.0592M
        RCAP2L = 0xdc;			//BaudRate = 9600

        TH2=RCAP2H;
        TL2=RCAP2L;
        TR2=1;
}

//串口通信检测
void RecDataCheck(void)
{
        uint delay;
        RI=0;
        TimerOut=0;

        TMOD=0x11;																	//工作方式1,16位定时器
        TR0=1;

        for(delay=50; delay>0; delay--)									  	//50*1ms=50ms
        {																				//11.0592M
              TH0 = 0xfc; 															// th0=(65536-(1000*(Fosc/12000000)))/256, delay x 1ms
              TL0 = 0x66; 															// tl0=65536-(1000*(Fosc/12000000)),  delay x 1ms
              for(TF0=0; TF0==0; )												//处理定时器未溢出时,判断接收位
              {
                while(RI==1)														//正常
                { 
					 	goto OK ; 
					 }
              }
        }
        TimerOut=1;																	//通信超时
        OK: ;																			//通信正常
}

//APROM 跳转 LDROM ,即ISP模式
void ChangeAPtoLD(void)
{
		  //单片机重启,软复位
        CHPENR=0x87;       													  	// write enable
        CHPENR=0x59;        														// write enable
        CHPCON=0x03;        														// bank=4k,flash mode
        TL0=0xfe;
        TH0=0xff;
        TR0=1;																			//打开定时器T0中断,从Idle模式唤醒MCU
        PCON=0x01;           														// enter idle mode
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -