📄 mcs51.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 + -