芯片破解DS3231和AT24C64的Proteus仿真程序
芯片破解使用proteus7.8 SP2,keil4,AT89C51RD2
实现DS3231的时间设置和读取,AT24C64的写入和读取
芯片解密DS3231 源程序如下:
- #include "ds3231.h"
- #include "main.h"
- #include "I2C.h"
- //功能:BCD码转换为十进制
- //参数:BCD码
- //返回值:十进制数
- uchar BCDToDEC(uchar val)
- {
- return ((val>>4)*10)+(val&0x0f);
- }
- //功能:十进制数转换为BCD码
- //参数:十进制数字
- //返回值:BCD码
- uchar DECToBCD(uchar val)
- {
- return (((val%100)/10)<<4)|(val%10);
- }
- //功能:向DS3231的某个寄存器写入数据
- //参数:addr要写入的寄存器地址,write_data 要写入的数据
- //返回值: 成功返回1,失败返回0
- uchar write_byte(uchar addr, uchar write_data)
- {
- I2CStart_I2C(); //1发送起始信号
- I2CSendByte(DS3231_WriteAddress); //2.发送写指令
- if(I2CWaitACK()==NACK ) //如果为非应答
- return 0;
-
- I2CSendByte(addr); //3.发送寄存器地址
- if(I2CWaitACK()==NACK) //如果为非应答
- return 0;
-
- I2CSendByte(write_data); //4.发送数据
- if(I2CWaitACK()==NACK) //如果为非应答
- return 0;
-
- I2CStop_I2C(); //5.发送停止信号
- delayus(4);
-
- return 1; //发送正确返回1
- }
- //功能:从DS3231某个寄存器中读取数据
- //参数:寄存器地址
- //返回值:读取的数据
- uchar read_random(uchar random_addr)
- {
- uchar idata read_data;
- I2CStart_I2C(); //1.起始信号
- I2CSendByte(DS3231_WriteAddress); //2.发送伪写指令
- if(I2CWaitACK()==NACK) //等待从机应答
- return 0;
-
- I2CSendByte(random_addr); //3.发送寄存器地址
- if(I2CWaitACK()==NACK) //等待从机应答
- return 0;
-
- I2CStart_I2C(); //4.再次发送起始信号
- I2CSendByte(DS3231_ReadAddress); //5.发送读指令
- if(I2CWaitACK()==NACK) //等待从机应答
- return 0;
-
- read_data = I2CReadByte(); //6.读取数据
- I2C_NACK(); //7.给出NACK信号
- I2CStop_I2C(); //8.发送停止信号
- return read_data;
- }
- //功能:设置DS3231时间,包括年/月/日/ 时:分:秒 周几
- //参数:Time型 t 注意,这里t中的值都是十进制的
- //返回值:void
- void ModifyTime(Time *t)
- {
- uchar temp=0;
-
- temp=DECToBCD(t->year);
- write_byte(DS3231_YEAR,temp); //修改年
-
- temp=DECToBCD(t->month);
- write_byte(DS3231_MONTH,temp); //修改月
-
- temp=DECToBCD(t->day);
- write_byte(DS3231_DAY,temp); //修改日
-
- temp=DECToBCD(t->hour);
- write_byte(DS3231_HOUR,temp); //修改时
-
- temp=DECToBCD(t->minute);
- write_byte(DS3231_MINUTE,temp); //修改分
-
- temp=DECToBCD(t->second);
- write_byte(DS3231_SECOND,temp); //修改秒
- temp=DECToBCD(t->week);
- write_byte(DS3231_WEEK,temp); //修星期
- }
- //功能:从DS3231读取数据
- //参数:Time 型变量t,读出的结构成员都是十进制数
- //返回值:void
- void GetDS3231Time(Time *t)
- {
- t->year=read_random(DS3231_YEAR);
- t->month=read_random(DS3231_MONTH);
- t->hour=read_random(DS3231_HOUR);
- t->minute=read_random(DS3231_MINUTE);
- t->second=read_random(DS3231_SECOND);
- t->year=BCDToDEC(t->year);
- t->month=BCDToDEC(t->month);
- t->day=BCDToDEC(t->day);
- t->hour=BCDToDEC(t->hour);
- t->minute=BCDToDEC(t->minute);
- t->second=BCDToDEC(t->second);
- }

芯片解密