#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 //STC15F2K08S2 ,0X1FF9 ;STC15F2K16S2 ,0X3FF9
void InitUart(void);
void SendUart(unsigned char dat);
void Delay10ms() ;
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;
unsigned long crc_cal(unsigned char *ptr,unsigned char len) ;
sfr AUXR=0x8E;
void main()
{
unsigned char idata *iptr;
unsigned char code *cptr;
unsigned char i;
unsigned long xdata outdata;
unsigned char xdata outdata1 ,outdata2,outdata3,outdata4;
unsigned char xdata stc_15[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_15[i]=*cptr++;
}
outdata=crc_cal(stc_15,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(0xcbff);_nop_();_nop_(); byte_write(0xcbff,outdata1);_nop_(); _nop_();
Sector_Erase(0xcdff);_nop_(); _nop_();byte_write(0xcdff,outdata2);_nop_(); _nop_();
Sector_Erase(0xcfff);_nop_();_nop_(); byte_write(0xcfff,outdata3);_nop_(); _nop_();
Sector_Erase(0xd1ff);_nop_(); _nop_();byte_write(0xd1ff,outdata4);_nop_(); _nop_();
//加密数据写入EEPROM
while(1);
}
void InitUart(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TB8=1;
TI=1;
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xFE; //设定定时初值
TH1 = 0xFF; //设定定时初值
//ET1 =0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES=1;
//EA=1; //关闭全局中断
}
void SendUart(unsigned char dat)
{
while(!TI);
TI=0;
SBUF=dat;
}
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
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;
}