找回密码
 立即注册
查看: 108|回复: 7

ID号怎么读取不出来,请教各位高手老师了!

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:335
  • 最近打卡:2026-04-02 11:58:21
已绑定手机

22

主题

129

回帖

1120

积分

金牌会员

STC-镇江-老蔡

积分
1120
发表于 2026-3-20 08:46:24 | 显示全部楼层 |阅读模式
#include "stc8h.h"

// 全局变量:存储16字节芯片ID(STC8H8K64U标准长度)
unsigned char chip_id[7];  // 先存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);            // 死循环 Snipaste_2026-03-20_08-45-05.png
}

平安快乐
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:653
  • 最近打卡:2026-04-02 10:07:54
已绑定手机

52

主题

2542

回帖

8922

积分

论坛元老

积分
8922
发表于 2026-3-20 08:58:57 | 显示全部楼层
用附件例子试试

串口打印STC8系列芯片参数-CHIPID.zip

9.5 KB, 下载次数: 4

回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2026-04-02 10:49:01

31

主题

1254

回帖

4754

积分

超级版主

积分
4754
发表于 2026-3-20 13:13:16 | 显示全部楼层
你的代码需要像下面这样改一下


截图202603201312569007.jpg

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:335
  • 最近打卡:2026-04-02 11:58:21
已绑定手机

22

主题

129

回帖

1120

积分

金牌会员

STC-镇江-老蔡

积分
1120
发表于 2026-3-21 00:18:40 | 显示全部楼层
读出来了,谢谢你!
平安快乐
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:335
  • 最近打卡:2026-04-02 11:58:21
已绑定手机

22

主题

129

回帖

1120

积分

金牌会员

STC-镇江-老蔡

积分
1120
发表于 2026-3-21 00:37:36 | 显示全部楼层
金*** 发表于 2026-3-21 00:18
读出来了,谢谢你!

毛病就在这里
平安快乐
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:335
  • 最近打卡:2026-04-02 11:58:21
已绑定手机

22

主题

129

回帖

1120

积分

金牌会员

STC-镇江-老蔡

积分
1120
发表于 2026-3-21 20:16:46 | 显示全部楼层
zh*** 发表于 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[7] = {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[7];        // 存储读取ID加密后的值
    u16 read_sum = 0;    // 存储读取ID加密后的校验和
    u8 i;                // 【关键修复】提前定义循环变量(C51要求)
   
    // 计算预设ID加密后的值和校验和
    u8 auth_id[7] = {
        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[0] + auth_id[1] + auth_id[2] +
                   auth_id[3] + auth_id[4] + auth_id[5] + auth_id[6];

    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); // 死循环
    }
}
帮我看看这个判断程序问题出在哪里,麻烦老师了

点评

数组或者指针变量的访问问题,如下: [attachimg]134343[/attachimg]  详情 回复 发表于 2026-3-24 10:08
平安快乐
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2026-04-02 10:49:01

31

主题

1254

回帖

4754

积分

超级版主

积分
4754
发表于 2026-3-24 10:08:13 | 显示全部楼层



数组或者指针变量的访问问题,如下:

截图202603241007449143.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:335
  • 最近打卡:2026-04-02 11:58:21
已绑定手机

22

主题

129

回帖

1120

积分

金牌会员

STC-镇江-老蔡

积分
1120
发表于 9 小时前 | 显示全部楼层
zh*** 发表于 2026-3-24 10:08
数组或者指针变量的访问问题,如下:

好的,谢谢
平安快乐
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-2 21:11 , Processed in 0.114673 second(s), 81 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表