ID号怎么读取不出来,请教各位高手老师了!
#include "stc8h.h"// 全局变量:存储16字节芯片ID(STC8H8K64U标准长度)
unsigned char chip_id;// 先存7字节,可根据需求扩展到16字节
void Uart1_Init(void) //9600bps@30.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xF3; //设置定时初始值
TH1 = 0xFC; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
// ================= 串口发送基础函数 =================
void UART_SendChar(unsigned char dat)
{
SBUF = dat; // 写入串口数据寄存器
while(!TI); // 等待发送完成
TI = 0; // 清除发送标志
}
void UART_SendString(unsigned char *str)
{
while(*str != '\0')
{
UART_SendChar(*str);
str++;
}
}
void UART_SendHex(unsigned char dat)
{
unsigned char high = dat >> 4;
unsigned char low = dat & 0x0F;
UART_SendChar(high > 9 ? (high + 0x37) : (high + 0x30)); // A-F转大写
UART_SendChar(low > 9 ? (low + 0x37) : (low + 0x30));
}
// ================= 核心:读取STC8H8K64U真实ID(0x7FF9地址) =================
void Read_ChipID(void)
{
unsigned char i;
unsigned char *p = (unsigned char *)0xFDE0; // 正确的ID起始地址
for(i = 0; i < 7; i++)// 读取前7字节(可扩展到16字节)
{
chip_id = *p++;
}
}
// ================= 主函数 =================
void main(void)
{
unsigned char i;
P_SW2 |= 0x80; // 使能扩展SFR访问
P3M0 = 0x00; // P3口设为推挽/准双向(根据需求,可省略)
P3M1 = 0x00;
// XOSCCR = 0xc0; // 启动外部晶振
// while (!(XOSCCR & 0x01))
// ; // 等待时钟稳定
// CLKDIV = 0x00;
// CLKSEL = 0x01; // 选择外部晶振
Uart1_Init(); // 初始化串口
Read_ChipID(); // 读取芯片ID
// 打印提示信息
UART_SendString("STC8H8K64U 真实芯片ID:\r\n");
UART_SendString("ID: ");
// 打印ID(7字节)
for(i = 0; i < 7; i++)
{
UART_SendHex(chip_id);
UART_SendChar(' ');
}
UART_SendString("\r\n\r\n");
while(1); // 死循环
}
用附件例子试试 你的代码需要像下面这样改一下
读出来了,谢谢你!{:4_165:} 金南京 发表于 2026-3-21 00:18
读出来了,谢谢你!
毛病就在这里{:qiang:} zhp 发表于 2026-3-20 13:13
你的代码需要像下面这样改一下
#include <stc8h.h>
#include <intrins.h>
sbit S1 = P1^0;
// 类型重定义,增强代码可读性
typedef unsigned char u8;
typedef unsigned int u16;
// 修复:数组初始化必须用{},否则会编译警告/错误
u8 chip_id = {0};// 存储读取到的7字节芯片ID
u16 enc_sum = 0; // 重命名:enc_num -> enc_sum,语义更清晰
// 200ms延时函数(@24.000MHz)
void Delay200ms(void)
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 25;
j = 90;
k = 176;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
// ========== 需根据实际芯片ID修改以下宏定义 ==========
// !!!重要:需先读取自己芯片的真实ID替换以下值!!!
#define RAW_ID_0 0xf7// 芯片真实ID第0字节
#define RAW_ID_1 0x84// 芯片真实ID第1字节
#define RAW_ID_2 0xc9// 芯片真实ID第2字节
#define RAW_ID_3 0xb9// 芯片真实ID第3字节
#define RAW_ID_4 0x03// 芯片真实ID第4字节
#define RAW_ID_5 0x48// 芯片真实ID第5字节
#define RAW_ID_6 0x62// 芯片真实ID第6字节
#define AUTH_KEY 0x3f// 加密密钥(可自定义,建议0x01~0xFE)
// 读取芯片ID(STC8H的芯片ID固定地址:0xFDE0~0xFDE6)
void Read_ChipID(void)
{
u8 i;
// xdata修饰符:访问外部数据存储器(STC8H的ID存储在此区域)
u8 *p = (u8 xdata *)0xFDE0;
for(i = 0; i < 7; i++)
{
chip_id = *p++; // 逐字节读取ID到全局数组
}
}
// 加密函数:异或密钥 + 计算校验和
// 参数说明:
// chip_id:输入-原始芯片ID
// enc_id:输出-加密后的ID
// sum:输出-加密后ID的校验和
void EncryptID(u8 *chip_id, u8 *enc_id, u16 *sum)
{
u8 i;
*sum = 0; // 初始化校验和
for(i=0; i<7; i++)
{
enc_id = chip_id ^ AUTH_KEY; // 异或加密核心逻辑
*sum += enc_id; // 累加计算校验和
}
}
// ID校验函数:比对加密后的数据和校验和
// 返回值:1=合法,0=非法
u8 CheckChipID(void)
{
u8 enc_id; // 存储读取ID加密后的值
u16 read_sum = 0; // 存储读取ID加密后的校验和
u8 i; // 【关键修复】提前定义循环变量(C51要求)
// 计算预设ID加密后的值和校验和
u8 auth_id = {
RAW_ID_0 ^ AUTH_KEY,
RAW_ID_1 ^ AUTH_KEY,
RAW_ID_2 ^ AUTH_KEY,
RAW_ID_3 ^ AUTH_KEY,
RAW_ID_4 ^ AUTH_KEY,
RAW_ID_5 ^ AUTH_KEY,
RAW_ID_6 ^ AUTH_KEY
};
u16 auth_sum = auth_id + auth_id + auth_id +
auth_id + auth_id + auth_id + auth_id;
Read_ChipID(); // 读取芯片真实ID
EncryptID(chip_id, enc_id, &read_sum); // 加密并计算校验和
// 【关键修复】循环变量i已提前定义,符合C51语法
for(i=0; i<7; i++)
{
if(enc_id != auth_id)
{
return 0; // 任意一字节不匹配,直接返回非法
}
}
// 校验和二次比对(双重验证)
if(read_sum == auth_sum)
{
return 1; // ID合法
}
else
{
return 0; // 校验和不匹配,非法
}
}
void main(void)
{
u8 id_valid;
// GPIO初始化:P1^0推挽输出(驱动LED)
P1M0 = 0x01;// P1.0推挽输出模式(bit0置1)
P1M1 = 0x00;// P1.0推挽输出模式(bit0置0)
S1 = 1; // 初始置高(LED灭,假设LED共阳接法)
// 执行ID校验
id_valid = CheckChipID();
if(id_valid)
{
// ID合法:LED闪烁(200ms亮/200ms灭)
while(1)
{
S1 = 0;
Delay200ms();
S1 = 1;
Delay200ms();
}
}
else
{
// ID非法:LED常亮
S1 = 0;
while(1); // 死循环
}
}
帮我看看这个判断程序问题出在哪里,麻烦老师了 金南京 发表于 2026-3-21 20:16
#include
#include
数组或者指针变量的访问问题,如下:
zhp 发表于 2026-3-24 10:08
数组或者指针变量的访问问题,如下:
好的,谢谢
页:
[1]