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