基于STC15单片机ID应用加密试验例程源代码

#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;
}    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

探索者我有我路向

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值