C51/STC 单片机 实现计算自身STC-ISP提供的 代码长度,校验和是否正确? 防止程序被篡改
#include "reg51.h"
#include "intrins.h"
#include "absacc.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
//修改程序需要修改以下3个常量
#define ROM_SIZE 0x008B //STC-ISP 代码长度
#define CHECKSUM 0x004800 //STC-ISP 校验和
#define CHECK_BYTE 0x9B //调整1字节 使校验和计算正确
sbit led = P3 ^ 2; //校验通过 (低电平点亮) 否则熄灭
u32 checksum() { //取校验和 返回:0x000000~0xFFFFFF
u32 sum = 0;
u16 pc;
for (pc = 0; pc < ROM_SIZE; pc++) {
sum += CBYTE;
}
return sum & 0xFFFFFF;
}
void main() { //只要改动任意一处就无法通过校验
u32 sum = checksum();
u8 check_byte = CHECK_BYTE;
if (sum == CHECKSUM) {
led = 0;
} else {
led = 1;
}
while (1);
}
页:
[1]