#include<reg52.h>
#include <stdio.h>
#include<intrins.h>
sbit P0_0=P0^0; sbit P1_0=P1^0;
sbit P0_1=P0^1; sbit P1_1=P1^1;
sbit P0_2=P0^2; sbit P1_2=P1^2;
sbit P0_3=P0^3; sbit P1_3=P1^3;
sbit P0_4=P0^4; sbit P1_4=P1^4;
sbit P0_5=P0^5; sbit P1_5=P1^5;
sbit P0_6=P0^6; sbit P1_6=P1^6;
sbit P0_7=P0^7; sbit P1_7=P1^7;
sbit P2_0=P2^0; sbit P3_0=P3^0;
sbit P2_1=P2^1; sbit P3_1=P3^1;
sbit P2_2=P2^2; sbit P3_2=P3^2;
sbit P2_3=P2^3; sbit P3_3=P3^3;
sbit P2_4=P2^4; sbit P3_4=P3^4;
sbit P2_5=P2^5; sbit P3_5=P3^5;
sbit P2_6=P2^6; sbit P3_6=P3^6;
sbit P2_7=P2^7; sbit P3_7=P3^7;
#define ID_ADDR_RAM 0XF1
#define ID_ADDR_ROM 0X1FF9 //stc11 ROM 无ID号
void InitUart(void);
void SendUart(unsigned char dat);
void Delay10ms() ;
unsigned long crc_cal(unsigned char *ptr,unsigned char len);//CRC-ITU
sfr AUXR=0x8E;
sfr BRT = 0x9C;
void INT_TR(void) ;
sfr ISP_DATA = 0xC2; /* Flash Data Register */
sfr ISP_ADDRH = 0xC3; /* flash address high */
sfr ISP_ADDRL = 0xC4; /* flash address low */
sfr ISP_CMD = 0xC5; /* flash command register */
sfr ISP_TRIG = 0xC6; /* flash command trigger */
sfr ISP_CONTR = 0xC7; /* isp/iap control register */
#define ISP_IAP_BYTE_READ 1; /* 读字节 */
#define ISP_IAP_BYTE_PROGRAM 2; /* 字节编程 */
#define ISP_IAP_SECTOR_ERASE 3; /* 扇区擦除 */
#define ISP_IAP_ENABLE 0x81; /* 系统工作时钟<12M,对ISP_CONTR寄存器设置此值 ,0x81*/
unsigned char byte_read(unsigned int addr);
void byte_write(unsigned int addr,unsigned char program_data);
void Sector_Erase(unsigned int addr);
//void IAP_Disable();
//unsigned int eeprom_address;unsigned int read_eeprom;
void main()
{
unsigned char idata *iptr;
unsigned char code *cptr;
unsigned long xdata outdata;
unsigned char xdata outdata1 ,outdata2,outdata3,outdata4;
unsigned char i; unsigned char xdata stc_11[7] ;
Delay10ms(); InitUart();
iptr= ID_ADDR_RAM; cptr=ID_ADDR_ROM;
for (i=0;i<7;i++)
{
SendUart(*iptr++);
}
iptr= ID_ADDR_RAM;
for (i=0;i<7;i++)
{
//SendUart(*cptr++);
}
cptr=ID_ADDR_ROM;
for (i=0;i<7;i++)
{
stc_11[i]=*iptr++;
}
outdata=crc_cal(stc_11,7);
outdata1=outdata/0x1000000;outdata2=outdata%0x1000000/0x10000;
outdata3=outdata%0x10000/0x100;outdata4=outdata%0x100;
SendUart( outdata1); _nop_(); _nop_();
SendUart(outdata2); _nop_(); _nop_();
SendUart(outdata3); _nop_(); _nop_();
SendUart(outdata4); _nop_(); _nop_();
Sector_Erase(0x77ff);_nop_();_nop_(); byte_write(0x77ff,outdata1);_nop_(); _nop_();
Sector_Erase(0x79ff);_nop_(); _nop_();byte_write(0x79ff,outdata2);_nop_(); _nop_();
Sector_Erase(0x7bff);_nop_();_nop_(); byte_write(0x7bff,outdata3);_nop_(); _nop_();
Sector_Erase(0x7dff);_nop_(); _nop_();byte_write(0x7dff,outdata4);_nop_(); _nop_();
//加密数据写入eeprom
while(1);
}
void InitUart(void) //115200bps@11.0592MHz
{
/* PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xFD; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器 */
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
//TI=1;
ES=1; EA=1;
}
void SendUart(unsigned char dat)
{
SBUF=dat;
while(!TI);
TI=0;
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void INT_TR(void) interrupt 4
{
if(RI==1) {RI=0;}
else TI=0;
}
unsigned long crc_cal(unsigned char *ptr,unsigned char len) //CRC-ITU
{
unsigned char i;
unsigned long crc=0XFFFF;
while(len--)
{
for(i=0x80;i!=0;i/=2)
{
if((crc&0x8000)!=0)
{crc*=2;crc^=0x1021;} //生成多项式0x1021
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; //生成多项式0x1021
}
ptr++;//len--;
} //while
return(crc);
}
unsigned char byte_read(unsigned int addr)
{
unsigned char i;
ISP_ADDRH = (addr>>8);
ISP_ADDRL = (addr&0x00ff);
ISP_CONTR = ISP_IAP_ENABLE; //0x81
ISP_CMD = ISP_IAP_BYTE_READ; //1
ISP_TRIG = 0x5a;
ISP_TRIG = 0xa5;
_nop_();
_nop_();
i = ISP_DATA;
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
return i;
}
void byte_write(unsigned int addr,unsigned char program_data)
{
ISP_DATA = program_data;
ISP_ADDRH = (addr>>8);
ISP_ADDRL = (addr&0x00ff);
ISP_CONTR = ISP_IAP_ENABLE; // 0x81
ISP_CMD = ISP_IAP_BYTE_PROGRAM; // 2
ISP_TRIG = 0x5a;
ISP_TRIG = 0xa5;
_nop_();
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}
// void IAP_Disable()
// {
//IAP_CONTR=0;
// IAP_CMD=0;
// IAP_TRIG=0;
// IAP_ADDRH=0;
//IAP_ADDRL=0;
// }
void Sector_Erase(unsigned int addr)
{
// addr=(addr&0xfe00); //地址小于0xfe00?
ISP_ADDRH = (addr>>8);
ISP_ADDRL = (addr&0x00ff);
ISP_CONTR = ISP_IAP_ENABLE; //0x81
ISP_CMD = ISP_IAP_SECTOR_ERASE; //3
ISP_TRIG = 0x5a;
ISP_TRIG = 0xa5;
_nop_();
_nop_();
_nop_();
ISP_CONTR = 0x00;
ISP_CMD = 0x00;
ISP_TRIG = 0x00;
}