STC12读取内部ID方法介绍

news2024/11/27 18:25:14

STC12读取内部ID方法介绍


  • 🔖这里以STC12LE5A60S2为例,从STC12手册的第一章,1.10小结可以找到相关的ID相关的信息。这个信息主要是用于程序加密或产品销售管理等方面。
  • 🌿STC12LE5A60S2系统板: https://oshwhub.com/perseverance51/stc12le5a60s2-ji-tong-ban
    在这里插入图片描述

📓芯片的ID信息源

  • 📑芯片ID信息源:内部RAM的F1H ~ F7H单元的内容也为全球唯一ID号。以及在程序区的最后7个字节的全球唯一ID号。后者需要在使用STC-ISP下载程序的时候,勾选相应的选项:在代码区的最后添加ID号
    在这里插入图片描述
  • 📜读取ID效果:
    在这里插入图片描述

✨在采用代码区的最后添加ID号的方法,在通过STC-ISP写入程序到单片机时,根据芯片型号flash容量的大小,擦除和写入的时间会有所增长。

📝示例代码

  • 🌿串口采用独立波特率发生器。
  • 🌿采用外部22.1184MHz晶振
  • 🌿波特率:9600
  • 📋通过串口发送对应的字符,来获取相对于的信息。

/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Programme Demo ----------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

/*      本程序经过测试完全正常, 不提供电话技术支持, 如不能理解, 请自行补充相关基础.  */


/*************	本程序功能说明	**************
	测试方法:
	根据您的主时钟和波特率修改下面的相关定义,编译后下载到MCU。
	通过串口助手向MCU发送数据,MCU收到后原样返回。
	发单个字符'a',将返回RAM区的唯一 ID号。
	发单个字符'o',将返回ROM区的唯一 ID号。(需要在STC-ISP下载时勾选“在代码区的最后添加ID号”选项)
	发单个字符'r',将返回内部震荡频率。
*/


/*************** 用户定义参数 *****************************/

#define MAIN_Fosc		22118400L	//define main clock
#define Baudrate0		9600		//define the baudrate,
//12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
//1T  mode: 7200~1382400 for 22.1184MHZ, 3600~691200 for 11.0592MHZ

/**********************************************************/
#include	<reg51.h>

//ID号的存放在程序区的地址为程序空间的最后7字节
//#define ID_ADDR_ROM 0x03f9 //1K程序空间的MCU
//#define ID_ADDR_ROM 0x07f9 //2K程序空间的MCU
//#define ID_ADDR_ROM 0x0bf9 //3K程序空间的MCU
//#define ID_ADDR_ROM 0x0ff9 //4K程序空间的MCU
//#define ID_ADDR_ROM 0x13f9 //5K程序空间的MCU
//#define ID_ADDR_ROM 0x1ff9 //8K程序空间的MCU
//#define ID_ADDR_ROM 0x27f9 //10K程序空间的MCU
//#define ID_ADDR_ROM 0x2ff9 //12K程序空间的MCU
//#define ID_ADDR_ROM 0x3ff9 //16K程序空间的MCU
//#define ID_ADDR_ROM 0x4ff9 //20K程序空间的MCU
//#define ID_ADDR_ROM 0x5ff9 //24K程序空间的MCU
//#define ID_ADDR_ROM 0x6ff9 //28K程序空间的MCU
//#define ID_ADDR_ROM 0x7ff9 //32K程序空间的MCU
//#define ID_ADDR_ROM 0x9ff9 //40K程序空间的MCU
//#define ID_ADDR_ROM 0xbff9 //48K程序空间的MCU
//#define ID_ADDR_ROM 0xcff9 //52K程序空间的MCU
//#define ID_ADDR_ROM 0xdff9 //56K程序空间的MCU
#define ID_ADDR_ROM 0xeff9 //60K程序空间的MCU -->STC12LE5A60S2

sfr	AUXR = 0x8E;
sfr BRT = 0x9c;	//独立波特率发生器
bit		B_TI;

unsigned char id[7];		//用于读取RAM区的ID
unsigned char ROM_id[7];	//用于读取ROM区的ID
unsigned long Rosc, RoscZ;
unsigned char Command;

void	uart0_init(void);


/****************** 编译器自动生成,用户请勿修改 ************************************/

#define T1_TimerReload		(256 - MAIN_Fosc / 192 / Baudrate0)		//Calculate the timer1 reload value	at 12T mode
//#define T1_TimerReload	(256 - MAIN_Fosc / 16 / Baudrate0)		//Calculate the timer1 reload value ar 1T mode

/**********************************************************/

void TxByte(unsigned char dat);
unsigned char HEX2DEC(unsigned char dat);
void PrintStrings(unsigned char code* sts);


void main(void)
{
    unsigned char i;
    unsigned int  j;
    unsigned char idata* p;
    unsigned char code* cptr;

    p = 0xf1;
    for(i = 0; i < 7; i++)	//从RAM区读取ID号
    {
        id[i] = *p;
        p++;
    }
    cptr = ID_ADDR_ROM; //从程序区读取ID号
    for(i = 0; i < 7; i++) //读7个字节
    {
        ROM_id[i] = *cptr;
        cptr++;
    }
    cptr = 0;
    Rosc = 0;
    for(p = 0xf8; p <= 0xfb; p++)	Rosc = (Rosc << 8) + *p;
    RoscZ = 0;
    for(p = 0xfc; p > 0; p++)	RoscZ = (RoscZ << 8) + *p;

    uart0_init();
    PrintStrings("读ID和内部震荡频率\r\n");
    PrintStrings("发单个字符'a',将返回唯一RAM ID号。\r\n");
    PrintStrings("发单个字符'o',将返回唯一ROM ID号。\r\n");
    PrintStrings("发单个字符'r',将返回内部震荡频率。\r\n");

    while(1)
    {
        for(j = 0; j < 1500; j++)	;	//14T per loop, delay 1ms
        if(Command != 0)		//收到命令
        {
            if(Command == 'a')	//读取ID命令
            {
                PrintStrings("本IC的RAM ID号为:");
                for(i = 0; i < 7; i++)
                {
                    TxByte(HEX2DEC(id[i] >> 4));
                    TxByte(HEX2DEC(id[i] & 0x0f));
                    TxByte(' ');
                }
                TxByte(0x0d);
                TxByte(0x0a);
            }
            if(Command == 'o')	//读取ID命令
            {
                PrintStrings("本IC的ROM ID号为:");
                for(i = 0; i < 7; i++)
                {
                    TxByte(HEX2DEC(ROM_id[i] >> 4));
                    TxByte(HEX2DEC(ROM_id[i] & 0x0f));
                    TxByte(' ');
                }
                TxByte(0x0d);
                TxByte(0x0a);
            }
            if(Command == 'r')	//读取内部频率命令
            {
                PrintStrings("内部震荡频率为:");
                TxByte(Rosc / 10000000L + '0');
                TxByte(Rosc % 10000000L / 1000000L + '0');
                TxByte('.');
                TxByte(Rosc % 1000000L / 100000L + '0');
                TxByte(Rosc % 100000L / 10000 + '0');
                TxByte(Rosc % 10000 / 1000 + '0');
                TxByte(Rosc % 1000 / 100 + '0');
                TxByte(Rosc % 100 / 10 + '0');
                TxByte(Rosc % 10 + '0');
                TxByte('M');
                TxByte('H');
                TxByte('Z');
                TxByte(0x0d);
                TxByte(0x0a);
            }
            Command = 0;
        }
    }
}


unsigned char HEX2DEC(unsigned char dat)
{
    dat &= 0x0f;
    if(dat <= 9)	return (dat + '0');
    else			return (dat + 55);
}

void TxByte(unsigned char dat)
{
    B_TI = 0;
    SBUF = dat;
    while(!B_TI)	;
    B_TI = 0;
}

/**********************************************/
void	PrintStrings(unsigned char code* sts)
{
    for(; *sts != 0; sts++)	TxByte(*sts);
}

void	uart0_init(void)
{

    SCON = 0x50;		//UART0 set as 10bit , UART0 RX enable
	BRT = 0xFA;			//设置定时重载值:22.1184MHz,9600
    AUXR |= 0x01;		//串口1使用独立波特率发射器为波特率发生器
    AUXR |= 0x10;		//启动独立波特率发射器
    ES  = 1;
    EA = 1;
}


/**********************************************/
void UART0_RCV(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        Command = SBUF;
    }

    if(TI)
    {
        TI = 0;
        B_TI = 1;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/628953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaScript蓝桥杯----阅读吧

目录 一、介绍二、准备三、目标四、代码五、完成 一、介绍 “读万卷书&#xff0c;行万里路”&#xff0c;无论你现在贫穷或富有&#xff0c;身和心一定要有一个在路上。那么&#xff0c;在快节奏的今天&#xff0c;人们是如何利用碎片化的时间去阅读的呢&#xff1f;没错&…

【MySQL高级篇笔记-事务基础知识(中) 】

此笔记为尚硅谷MySQL高级篇部分内容 目录 一、数据库事务概述 1、存储引擎支持情况 2、基本概念 3、事务的ACID特性 1.原子性&#xff08;atomicity&#xff09; 2.一致性&#xff08;consistency&#xff09; 3.隔离型&#xff08;isolation&#xff09; 4.持久性&a…

卷积编码和维特比译码

文章目录 卷积编码维特比译码 卷积编码 卷积码是一种非分组码&#xff0c;通常适用于前向纠错。在分组码中&#xff0c;编码器产生的 n 个码元的一个码组&#xff0c;完全决定于这段时间中 k 比特输入信息。这个码组中的监督位仅监督本码组中 k 个信息位。卷积码在编码时虽然也…

Calico介绍

Calico 是一个基于 BGP 的纯三层的网络方案&#xff0c;与 OpenStack 、Kubernetes 、AWS 、GCE 等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由…

msf渗透练习-php后门反弹

说明&#xff1a; 本章内容&#xff0c;仅供学习&#xff0c;不要用于非法用途&#xff08;做个好白帽&#xff09; &#xff08;一&#xff09;后门反弹是什么 后门反弹是指攻击者在成功入侵一台计算机后&#xff0c;在目标计算机上安装一个“后门程序”&#xff0c;将该程序…

内网安全:横向传递攻击(SMB || WMI 明文或 hash 传递)

内网安全&#xff1a;横向传递攻击. 横向移动就是在拿下对方一台主机后&#xff0c;以拿下的那台主机作为跳板&#xff0c;对内网的其他主机再进行后面渗透&#xff0c;利用既有的资源尝试获取更多的凭据、更高的权限&#xff0c;一步一步拿下更多的主机&#xff0c;进而达到控…

解决语言障碍:如何将Axure变为中文版?

Axure 是一款备受称赞的原型设计工具&#xff0c;被誉为 "交互神器"。然而&#xff0c;在国内&#xff0c;一些设计师对于使用 Axure 有所犹豫&#xff0c;其中语言环境不适应是主要的顾虑之一。在本文中&#xff0c;我们将探讨一种更适合国内设计师的 Axure 中文版即…

网工内推 | 国企专场,补贴福利多,CCNP认证以上优先

01 凯盛数智信息技术科技&#xff08;上海&#xff09;有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师&#xff08;IT工程师&#xff09; &#x1f537;职责描述&#xff1a; 1、负责公司数据中心机房、服务器及网络设备的管理和维护工作&#xff1b; 2、负责公司基础…

微信小程序实用工具——渐变色按钮(二)

今日推荐&#x1f481;‍♂️ 今年的国美毕业展已经开始了&#x1f9d1;‍&#x1f3a8;&#x1f9d1;‍&#x1f3a8;在杭州的小伙伴可以快速出击了&#x1f3c3;‍♂️&#x1f3c3;‍♂️ 这里我想推荐其中的一副版画作品《突围》 在众多版画系作品中被它所吸引 文章目录 今…

【linux离线升级gcc版本---gcc4.8.5-->gcc12.2.0】

【linux离线升级gcc版本---gcc4.8.5--&#xff1e;gcc12.2.0】 &#x1f53b; 一、gcc简介&#x1f53b; 二、gcc下载上传&#x1f53b; 三、查看和安装gcc-12.2.0需要的依赖3.1 &#x1f341; 查看gcc-12.2.0所需依赖库3.2 &#x1f341; 安装gmp、mpfr、mpc、isl &#x1f53…

DJ4-8 抖动与工作集

目录 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 2、CPU 利用率急剧下降的原因 3、抖动 4、工作集模型 5、抖动的预防 4.9 请求分段存储管理方式 4.9.1 请求分段中的硬件支持 4.9.2 分段的共享与保护 4.8 抖动与工作集 1、缺页率对有效访问时间的影响 有…

总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划

近日&#xff0c;坪山区城市更新和土地整备局发布&#xff0c;关于《坪山区马峦街道江岭竹元片区城市更新单元规划》已通过深圳市城市规划委员会法定图则委员会审批。现予以公告。 项目位于坪山区马峦街道&#xff0c;南邻南坪快速路&#xff0c;北邻比亚迪路&#xff0c;东西两…

一种新型智能优化算法—鼠群优化(RSO)算法

目录 一、RSO理论基础 二、RSO数学模型 2.1 追逐猎物 2.2 攻击猎物 三、RSO流程图 四、运行结果 鼠群优化(Rat Swarm Optimizer&#xff0c;RSO)算法是由Dhiman G等人于2020年提出&#xff0c;主要启发于老鼠追逐和攻击猎物的种群行为。该优化算法具有结构简单&#xf…

DJ4-2 程序的装入和链接

目录 4.2.1 程序的装入 一、绝对装入方式 二 、可重定位装入方式 三、动态运行时装入方式 4.2.2 程序的链接 一、静态链接 二、装入时动态链接 三、运行时动态链接 在多道程序环境下&#xff0c;如果程序要运行&#xff0c;那么必须为之创建进程。而创建进程的第一件…

六级备考8天|CET-6|阅读强化2|19:30~21:00

目录 正确选项两大标准 练习 问题一 问题二 问题三 问题四​ 问题五 ​ 正确选项两大标准 1. 定位准确 2. 改写正确 举例&#xff1a; 练习 问题一 immediate vicinity oftoo close unprecedented 前所未有的&#xff1b; 问题二 主语&#xff1a;a global campaign 谓…

解决问题 Could not obtain transaction-synchronized Session for current thread

一、问题现象 在使用Hibernate的项目中&#xff0c;在一个定时任务中&#xff0c;执行某段代码&#xff0c;满足条件后&#xff0c;更新表数据。 程序在执行到更新表数据的时候&#xff0c;报错如下&#xff1a; Could not obtain transaction-synchronized Session for cur…

chatgpt赋能python:用Python优化微信群SEO

用Python优化微信群SEO 随着微信群的普及&#xff0c;越来越多的人开始将其作为社交媒体和个人品牌的重要推广渠道之一。然而&#xff0c;想要让你的微信群在搜索引擎中排名靠前&#xff0c;就需要进行一些有效的SEO技巧&#xff0c;以吸引更多的目标用户。 在本文中&#xf…

黏糊糊的菜单

先看效果&#xff1a; 再看代码&#xff1a; <!--黏糊糊的菜单 可融合--> <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

【pytorch】维度变换

【pytorch】维度变换 View操作unSqueeze操作图片处理的一个案例squeeze 维度删减操作维度扩展-expand维度扩展-repeat矩阵的转置操作-transpose View操作 将一个四维的张量&#xff08;b x c x h x w&#xff09;转换成一个二维的张量 对于四张图片 将每一张图像用一行向量进…

阿里内部秀出新天际的SpringBoot实战笔记,让开发像搭积木一样简单

​什么是 Spring Boot Java (面向对象编程语言)经过 30 多年的发展&#xff0c;产生了非常多的优秀框架。Spring (为解决企业应用程序开发的复杂性而创建的框架)曾是最受欢迎的 Java 框架之一&#xff0c; 但随着 Node、Ruby、Groovy、PHP 等脚本语言的蓬勃发展&#xff0c;使…