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

📄 mcs51.c

📁 W78E516B在线升级的下位机源代码
💻 C
字号:
//78E516ISP单片机程序下载程序
//11.0592Mhz
//通讯速率57600
//进入ISP:复位时使P2^6 P2^7同时为低
//将本程序的目标码写入boot 区

/****************IAP功能实现***********************************
//利用本程序实现IAP功能示例
sfr CHPCON  = 0xBF;
sfr CHPENR  = 0xF6;
sfr SFRAL   = 0xC4;
sfr SFRAH   = 0xC5;
sfr SFRFD   = 0xC6;
sfr SFRCN   = 0xC7;
sbit UPDATE	=P1^6;
void update64k()
{
	CHPENR=0x87;
	CHPENR=0x59;
	CHPCON=0x03;
	TCON=0;
	IP=0;
	IE=0x82;
	TL0=0xF0;
	TH0=0xF0;
	TMOD=1;
	TCON=0x10;
	PCON=0x01;
}
//主程序
void main(void)
{
	unsigned char tempc,inset;
	unsigned char tempd,tempe;
	unsigned int tempi;
	//下载程序到主程序存储器中
	if(!UPDATE)
		update64k();	
	.....
	while(1)
	{
		
	};
}
************************************************************/

#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>

union
{
	unsigned int	add;
	struct
	{
		unsigned char	ah;unsigned char						al;
	}half;
}dvault;
unsigned char data	tedate[64];
unsigned char data	myadd;
unsigned char data	readd;

sfr					CHPCON = 0xBF;
sfr					CHPENR = 0xF6;
sfr					SFRAL = 0xC4;
sfr					SFRAH = 0xC5;
sfr					SFRFD = 0xC6;
sfr					SFRCN = 0xC7;

sbit				RS485 = P1 ^ 5;   //RS485输入输出控制 1为接收0为发送
sbit				ONE = P1 ^ 0;   							   
sbit				TWO = P1 ^ 1;   								
sbit				THR = P1 ^ 2;   							   

void update64k()
{
	CHPENR = 0x87;
	CHPENR = 0x59;
	CHPCON = 0x03;
	TCON = 0;
	IP = 0;
	IE = 0x82;
	TL0 = 0xF0;
	TH0 = 0xF0;
	TMOD = 1;
	TCON = 0x10;
	PCON = 0x01;
}

void timer0(void) interrupt 1 using 1
{
	TR0 = 0;
	ET0 = 0;
}
void init_timer0(void)
{
	TMOD &= 0XF0;   				 /* clear Timer 0   */
	TMOD |= 0X1;
	TL0 = 2;				   /* value set by user    */
	TH0 = 0;				  /* value set by user  */
	ET0 = 1;	   
	TR0 = 1;				/* TCON.4 start timer  */
}
void init_serial()
{
	SCON = 0X50;
	PCON = 0X80 | PCON;
	TMOD = 0X20;
	TH1 = 0XFF;
	TR1 = 1;			/*TCON.6*/
	RI = 0; 			 /*SCON.0*/
	TI = 1;
}

void txchar(unsigned char c)
{
	do
	{
		if ((SCON & 0x02) == 0x02)
		{
			break;
		}
	}
	while (1);
	TI = 0;
	SBUF = c;
	do
	{
		if ((SCON & 0x02) == 0x02)
		{
			break;
		}
	}
	while (1);
}
unsigned char rxchar()
{
	do
	{
		if ((SCON & 0x01) == 0x01)
		{
			break;
		}
	}
	while (1);
	RI = 0;
	return(SBUF);
}
//////////清空主程序存储区	
void erase()
{
	init_timer0();
	SFRCN = 0x22;
	PCON = 0x81;
}
//空检测
void bankcheck()
{
	SFRCN = 0;
	SFRAH = 0;
	SFRAL = 0;
	CHECKBYTE:
	TL0 = 0xFB;
	TH0 = 0xFF;
	TR0 = 1;
	ET0 = 1;
	PCON = 0x81;
	if (SFRFD != 0xFF)
	{
		ONE = 1;
		TWO = 1;
		THR = 1;
		while (1);
	}
	SFRAL++;
	if (SFRAL)
	{
		goto CHECKBYTE;
	}
	SFRAH++;
	TWO = !TWO;
	if (SFRAH)
	{
		goto CHECKBYTE;
	}
	ONE = 0;
	TWO = 0;
	THR = 0;
}

void grog64b()
{
	unsigned tem;
	tem = 0;
	SFRCN = 0x21;
	PROGD:
	SFRAH = dvault.half.ah;
	SFRAL = dvault.half.al;
	SFRFD = tedate[tem];
	TL0 = 0;
	TH0 = 0xFF;
	TR0 = 1;
	ET0 = 1;
	PCON = 0x81;
	tem++;
	dvault.add++;
	if (tem < 64)
	{
		goto PROGD;
	}
}
//主程序
void main(void)
{
	unsigned char data tempa;
	update64k();
	ONE = 0;
	TWO = 1;
	THR = 1;
	init_serial();
	RS485 = 1;			//接收
	dvault.add = 0;
	CHPENR = 0x87;
	CHPENR = 0x59;
	if (CHPCON & 0x80)
	{
		CHPENR = 0x87;
		CHPENR = 0x59;
		CHPCON = 0x03;
	}
	CHPENR = 0;
	//清空主程序存储区
	erase();
	//空检验
	bankcheck();
	//串口初始化
	init_serial();
	RS485 = 1;			//接收	
	do
	{
		for (tempa = 0; tempa < 64; tempa++)
		{
			tedate[tempa] = rxchar();
		}
		ONE = !ONE;
		TWO = !TWO;
		THR = !THR;
		myadd = rxchar();
		RS485 = 0;			//发送
		//将代码写入相应位置并校验
		grog64b();
		txchar(myadd);		
		RS485 = 1;
		//接收
		if (dvault.add == 0xFFFF)
		{
			ONE = 1;
			TWO = 1;
			THR = 0;
			while (1);
		}
	}
	while (1);
}







⌨️ 快捷键说明

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