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

📄 mcs51.c

📁 下载用上位机程序
💻 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 + -