当前位置: 首页 > news >正文

STC15读取内部ID示例程序

STC15读取内部ID示例程序


  • 🎉本案例基于STC15F2K60S2为验证对象。

📑STC15 ID序列介绍

  • STC15系列STC最新一代STC15系列单片机出厂时都具有全球唯一身份证号码(ID号)。最新STC15系列单片机的程序存储器的最后7个字节单元的值是全球唯一ID号,用户不可修改,但IAP15系列单片机的 整个程序区是开放的,可以修改,建议利用全球唯一ID号加密时,使用STC15系列单片机,并将EEPROM功能使用上,从EEPROM起始地址0000H开始使用,可以有效杜绝对全球唯一ID号的攻击。
  • 除程序存储器的最后7个字节单元的内容是全球唯一ID号外,单片机内部RAM的F1H ~ F7H单元 (对于STC15F100W系列及STC15W104SW系列单片机是内部RAM的71H - 77H单元)的内容也为全球唯一ID号。用户可以在单片机上电后读取内部RAM单元F1H - F7H (对于STC15F100W系列及STC15W104SW系列单片机是内部RAM单元71H - 77H)连续7个单元的值来获取此单片机的唯一身份证号码(ID号 ), 使用“ MOV @Ri” 指令来读取。如果用户需要用全球唯一ID号进行用户自己的软件加密,建议用户在程序的多个地方有技巧地判断自己的用户程序有无被非法修改,提高解密的难度,防止解密者修改程序,绕过对全球唯一ID号的判断。
  • 使用程序区的最后7个字节的全球唯一ID号比使用内部RAM单元 F1H - F7H (或内部RAM单元71H - 77H)的全球唯一ID号更难被攻击。建议用户使用程序区最后7个字节的全球唯一ID号,而不要使用内部RAM单元 F1H - F7H (或内部RAM单元71H - 77H)的全球唯一ID号。

🌼有关ID号在大批量生产中的应用方法

  1. 先烧一个程序进去(选择下次下载用户程序时,不擦除用户EEPROM区);
    在这里插入图片描述
  2. 读程序区的ID号(STC15系列是程序区的最后7个字节),经用户自己的复杂的加密算法对程序区的ID号加密运算后生成一个新的数——用户自加密ID号,写入STC15系列用户EEPROM区的EEPROM。
  3. 再烧一个最终出厂的程序进去(选择下次下载用户程序时将用户EEPROM区一并擦除),如下图所示:
    在这里插入图片描述
  4. 在用户程序区的多处读程序区的ID号和用户自加密ID号比较(经用户自己的复杂的解密算法解密后),如不对应,则6个月后随机异常,或200次开机后随机异常最终出厂的程序不含加密算法。
  5. 另外,在程序区的多个地方判断用户自己的程序是否被修改,如被修改,则6个月后随机异常,或200次开机后随机异常,将不用的用户程序区用所谓的有效程序全部填满。

📝示例程序

  • ✨以STC15F2K60S2为例,主时钟频率:22.1184MHz,波特率:115200
    在这里插入图片描述
//#include "reg51.h"
#include <STC15F2K60S2.H>
//#include "STC15Fxxxx.H"
//typedef unsigned char u8;
//typedef unsigned    int u16;#define FOSC 22118400L          //系统频率
#define BAUD 115200             //串口波特率#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7
bit busy;
//sfr T2H = 0xd6; //定时器2高8位
//sfr T2L = 0xd7; //定时器2低8位
//sfr AUXR = 0x8e; //辅助寄存器
#define ID_ADDR_RAM 0xf1 //ID号的存放在RAM区的地址为0F1H
//ID号的存放在程序区的地址为程序空间的最后7字节
//#define ID_ADDR_ROM 0x03f9 //1K程序空间的MCU(如STC15F201EA, STC15F101EA)
//#define ID_ADDR_ROM 0x07f9 //2K程序空间的MCU(如STC15F402AD,
//STC15F202EA, STC15F102EA)
//#define ID_ADDR_ROM 0x0bf9 //3K程序空间的MCU(如STC15F203EA, STC15F103EA)
//#define ID_ADDR_ROM 0x0ff9 //4K程序空间的MCU(如STC15F404AD, STC15F204EA,
//STC15F104EA)
//#define ID_ADDR_ROM 0x13f9 //5K程序空间的MCU(如 STC15F206EA, STC15F106EA)
//#define ID_ADDR_ROM 0x1ff9 //8K程序空间的MCU(如STC15F2K08S2, STC15F1K08AD,
//STC15F408AD)
//#define ID_ADDR_ROM 0x27f9 //10K程序空间的MCU(如STC15F410AD)
//#define ID_ADDR_ROM 0x2ff9 //12K程序空间的MCU(如STC15F408AD)
//#define ID_ADDR_ROM 0x3ff9 //16K程序空间的MCU(如STC15F2K16S2,
//STC15F1K16AD)
//#define ID_ADDR_ROM 0x4ff9 //20K程序空间的MCU(如STC15F2K20S2)
//#define ID_ADDR_ROM 0x5ff9 //24K程序空间的MCU
//#define ID_ADDR_ROM 0x6ff9 //28K程序空间的MCU
//#define ID_ADDR_ROM 0x7ff9 //32K程序空间的MCU(如STC15F2K32S2)
//#define ID_ADDR_ROM 0x9ff9 //40K程序空间的MCU(如STC15F2K40S2)
//#define ID_ADDR_ROM 0xbff9 //48K程序空间的MCU(如STC15F2K48S2)
//#define ID_ADDR_ROM 0xcff9 //52K程序空间的MCU(如STC15F2K52S2)
//#define ID_ADDR_ROM 0xdff9 //56K程序空间的MCU(如STC15F2K56S2)
#define ID_ADDR_ROM 0xeff9 //60K程序空间的MCU(如STC15W4K60S4,STC15F2K60S2)//-----------------------------------------
void InitUart();
void SendUart(u8 dat);
//-----------------------------------------
void main()
{u8   idata *iptr;u8 code *cptr;u8   i;P0M0 = 0x00;P0M1 = 0x00;P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00;P3M0 = 0x00;ACC = P_SW1;ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
//	S1_USE_P30P31();        //UART1 使用P30 P31口   默认InitUart(); //串口初始化iptr = ID_ADDR_RAM; //从RAM区读取ID号for (i = 0; i < 7; i++) //读7个字节{SendUart(*iptr++); //发送ID到串口}cptr = ID_ADDR_ROM; //从程序区读取ID号for (i = 0; i < 7; i++) //读7个字节{SendUart(*cptr++); //发送ID到串口}while (1); //程序终止
}
/*----------------------------
串口初始化
----------------------------*/
void InitUart()//115200bps@22.1184MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR = 0x40;                //定时器1为1T模式TMOD = 0x00;                //定时器1为模式0(16位自动重载)TL1 = (65536 - (FOSC/4/BAUD));   //设置波特率重装值TH1 = (65536 - (FOSC/4/BAUD))>>8;TR1 = 1;                    //定时器1开始启动ES = 1;                     //使能串口中断EA = 1;}
/*----------------------------
发送串口数据
----------------------------*/
void SendUart(u8 dat)
{while (busy);               //等待前面的数据发送完成ACC = dat;                  //获取校验位P (PSW.0)busy = 1;SBUF = ACC;                 //写数据到UART数据寄存器
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4
{
//    if (RI)
//    {
//        RI = 0;                 //清除RI位
//    }if (TI){TI = 0;                 //清除TI位busy = 0;               //清忙标志}
}

📚程序源码

复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1z5i6KBB_6B397_o8QUTEMw
提取码: eaqb

相关文章:

STC15读取内部ID示例程序

STC15读取内部ID示例程序&#x1f389;本案例基于STC15F2K60S2为验证对象。 &#x1f4d1;STC15 ID序列介绍 STC15系列STC最新一代STC15系列单片机出厂时都具有全球唯一身份证号码(ID号)。最新STC15系列单片机的程序存储器的最后7个字节单元的值是全球唯一ID号&#xff0c;用…...

Xml格式化与高亮显示

具体请参考&#xff1a;Xml格式化与高亮显示...

【GlobalMapper精品教程】045:空间分析工具(2)——相交

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述相交工具的使用。 文章目录 一、实验数据二、符号化设置三、相交运算四、结果展示五、心灵感悟一、实验数据 加载配套实验数据(…...

4年外包终上岸,我只能说这类公司能不去就不去..

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是4年。现在终于跳槽到了互联网公司了&#xff0c;我想说的是&#xff0c;但凡有点机会&#xff0c;千万…...

sklearn降维算法1 - 降维思想与PCA实现

目录1、概述1.1 维度概念2、PCA与SVD2.1 降维实现2.2 重要参数n_components2.2.1 案例&#xff1a;高维数据的可视化2.2.2 最大似然估计自选超参数2.2.3 按信息量占比选超参数1、概述 1.1 维度概念 shape返回的结果&#xff0c;几维几个方括号嵌套 特征矩阵特指二维的 一般来…...

「期末复习」线性代数

第一章 行列式 行列式是一个数&#xff0c;是一个结果三阶行列式的计算&#xff1a;主对角线的乘积全排列与对换逆序数为奇就为奇排列&#xff0c;逆序数为偶就为偶排列对换&#xff1a;定理一&#xff1a;一个排列的任意两个元素对换&#xff0c;排列改变奇偶性&#xff08;和…...

伏并网低电压穿越技术

国内光伏并网低电压穿越要求 略&#xff1a; 低电压穿越方法 当前&#xff0c;光伏电站实现低电压穿越可通过两种方式&#xff0c;即增加硬件设备或者改变控制策略。本节对基于储能设备、基于无功补偿设备、基于无功电流电压支撑控制策略三种实现LVRT的典型方法进行介绍。 …...

opencv的环境搭建

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…...

C++智能指针

c11的三个智能指针 unique_ptr独占指针&#xff0c;用的最多 shared_ptr记数指针&#xff0c;其次 weak_ptr&#xff0c;shared_ptr的补充&#xff0c;很少用 引用他们要加上头文件#include unique_ptr独占指针&#xff1a; 1.只能有一个智能指针管理内存 2.当指针超出作用域…...

MongoDB--》MongoDB数据库以及可视化工具的安装与使用—保姆级教程

目录 数据库简介 MongoDB数据库的安装 MongoDB数据库的启动 MongoDB数据库环境变量的配置 MongoDB图形化管理工具 数据库简介 在使用MongoDB数据库之前&#xff0c;我们应该要知道我们使用它的原因&#xff1a; 在数据库当中&#xff0c;有常见的三高需求&#xff1a; Hi…...

JAVA 基础题

1. 面向对象有哪些特征&#xff1f;答&#xff1a;继承、封装、多态2. JDK与JRE的区别是什么&#xff1f;答&#xff1a;JDK是java开发时所需环境&#xff0c;它包含了Java开发时需要用到的API&#xff0c;JRE是Java的运行时环境&#xff0c;JDK包含了JRE&#xff0c;他们是包含…...

Flutter desktop端多屏幕展示问题处理

目前越来越多的人用Flutter来做桌面程序的开发&#xff0c;很多应用场景在Flutter开发端还不是很成熟&#xff0c;有些场景目前还没有很好的插件来支持&#xff0c;所以落地Flutter桌面版还是要慎重。 下面来说一下近期我遇到的一个问题&#xff0c;之前遇到一个需要双屏展示的…...

每天10个前端小知识 【Day 9】

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…...

Elasticsearch的读写搜索过程

问题 Elasticsearch在读写数据的过程是什么样的?你该如何理解这个问题&#xff01; Elasticsearch的写数据过程 客户端选择一个节点发送请求&#xff0c;这个时候我们所说的这个节点就是协调节点&#xff08;coordinating node&#xff09;协调节点对document进行了路由&am…...

线上服务质量的问题该如何去处理?你有什么思路?

线上服务质量的问题该如何去处理&#xff1f;你有什么思路&#xff1f; 目录&#xff1a;导读 发现线上故障 处理线上故障 修复线上故障 运营线上质量 就是前几天有个同学问了我一个问题&#xff1a;目前业内高可用部署主要采用方案&#xff1f; 看到这个问题&#xff0c…...

IOC 配置,依赖注入的三种方式

xml 配置 顾名思义&#xff0c;就是将bean的信息配置.xml文件里&#xff0c;通过Spring加载文件为我们创建bean。这种方式出现很多早前的SSM项目中&#xff0c;将第三方类库或者一些配置工具类都以这种方式进行配置&#xff0c;主要原因是由于第三方类不支持Spring注解。 优点…...

自动机,即有限状态机

文章目录一、问题来源二、题目描述三、题解中的自动机四、自动机学习五、有限状态机的使用场景一、问题来源 今天做力克题目的时候看到了字符串转换整数的一道算法题&#xff0c;其中又看到了题解中有自动机的概念&#xff0c;所以在这里对自动机做个笔记。题目链接 二、题目描…...

第一部分:简单句——第一章:简单句的核心——二、简单句的核心变化(主语/宾语/表语的变化)

二、简单句的核心变化 简单句的核心变化其实就是 一主一谓&#xff08;n. v.&#xff09; 表达一件事情&#xff0c;谓语动词是其中最重要的部分&#xff0c;谓语动词的变化主要有四种&#xff1a;三态加一否&#xff08;时态、语态、情态、否定&#xff09;&#xff0c;其中…...

VSCode Markdown写作引入符合规范的参考文献

Markdown可以用来写论文&#xff0c;写论文的时候无一例外要用到参考文献&#xff0c;今天来谈谈怎么自动生成参考文献。之前讲了怎么导出的pdf&#xff0c;文章在这里 VSCode vscode-pandoc插件将中文Markdown转换为好看的pdf文档&#xff08;使用eisvogel模板&#xff09; …...

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(四级)答案解析

目录 一、单选题(共15题&#xff0c;共30分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共50分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;四级&#xff09; 一、单选题(共15题&#xff0c;共30分) 1. 运行下列程序…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...