STC12读取内部ID方法介绍

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;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前版本支持MCU设备: ■ARM7 32位处理器 【LPC2214、LPC2292、LPC2131、LPC2132、LPC2136、LPC2138】 ■ARM Cortex-M3 处理器【STM32F10x家族】 ■STC 8051 微处理器(没有讨厌的狗头金广告) 【STC89C51RC、STC89C52RC、STC89C55RD+、STC89C516RD+】 对于"ARM7 32位处理器"、"ARM Cortex-M3 处理器"、"STC 8051 微处理器" 三类中的 各个型号选择,在ISP下载时可以忽略型号,软件自动识别并控制相应的下载命令。 当前版本支持 Oscillator: 8.000M、11.0592M、12.00M、18.432M、22.1184M、24.00M、36.864M ! ComMagic 是一款让您爱不释手的工具软件,串口调试 + 常用MCU设 备ISP上载软件, 使用完全免费! 本软件可以在Win95/98、Win2000、 WinNT、WinXP、Vista下面运行.软件功能主要为: 1.接收从串口进来的数据并在窗口显示. 2.所接收到的数据数据显示方式可以选择为字符方式或者HEX方式 3.中文显示无乱码,且不影响速度 4.串口波特率可以选择为110bps-115200bps 5.可以选择“5、6、7、8”四种数据长度. 6.可以选择为“1、1.5、2”三种停止位.(1.5停止位需要硬件支持) 7.第9位数据可以选择为“无、奇校验、偶校验、1、0”四种方式. 8.串口设置和字符串操作等设置在程序关闭时自动保存,打开时自 动载入. 9.可以选择在发送窗口按键即发送该键值. 10.可以在字符串输入框输入您想发送的字符串,并发送. 11.可以在字符串输入框输入您想发送的HEX数据串,数据的值从00 到FF,没有任何限制. 12.可以定时重复发送数据,并可以设置发送时间间隔. 13.可以在发送字符串时选择发送新行,即自动加上回车换行. 14.可以自由控制当前串口的DTR、RTS信号线的输出状态. 15.可以打开一个文本文件或者一个二进制文件预览其内容,查看方 式可以是文本方式. 16.可以打开一个文本文件或者一个二进制文件并以当前波特率发送 到串口. 17.可以保存窗口内容到一个文本文件 18.可以即时显示发送的字节数和接收到的字节数,按清除窗口将会 清零. 19.带有常用MCU设备ISP上载功能. 20.这是个绿色软件,单个文件即可执行,不会给您的机器增加任何 负担.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值