- 打卡等级:以坛为家II
- 打卡总天数:578
- 最近打卡:2025-06-28 00:12:02
论坛元老
- 积分
- 5588
|
发表于 2025-6-20 11:20:51
|
显示全部楼层
可以用程序读取。
读取全球唯一 ID 号
STC32G12K128
11.5.2 读取全球唯一 ID 号
//测试工作频率为 11.0592MHz
//#include "stc8h.h"
#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
#define FOSC 11059200UL //定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200+2) / 4)
//加 2 操作是为了让 Keil 编译器
//自动实现四舍五入运算
#define ID_ADDR (&CHIPID0)
bit busy;
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
T1x12 = 1;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void main()
{
char i;
EAXFR = 1; //使能访问 XFR,没有冲突不用关闭
CKCON = 0x00; //设置外部数据总线速度为最快
WTST = 0x00; //设置程序代码等待参数,
//赋值为 0 可将 CPU 执行程序的速度设置为最快
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
for (i=0; i<7; i++)
{
UartSend(ID_ADDR);
}
while (1);
}
10.5.4 读取全球唯一 ID 号 (从 CHIPID 中读取)
C 语言代码
//测试工作频率为 11.0592MHz
#include "ai8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - (FOSC / 115200+2) / 4)
//加 2 操作是为了让 Keil 编译器
//自动实现四舍五入运算
#define CPUIDBASE 0xfde0
#define ID_ADDR ((unsigned char volatile xdata *)(CPUIDBASE + 0x00))
bit busy;
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
AUXR = 0x40;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void main()
{
char i;
P_SW2 |= 0x80; //使能访问 XFR,没有冲突不用关闭
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
for (i=0; i<7; i++)
{
UartSend(ID_ADDR);
}
while (1);
}
12.5.2 读取全球唯一 ID 号
//测试工作频率为 11.0592MHz
#include "Ai8051U.H" //头文件见下载软件
#include "intrins.h" //使用_nop_()函数所必须要包含的头文件,
//否则延时函数中调用的_nop_()函数没有被头文件引用过来,会导致编译器找不到这个而函数而报错。
#define FOSC 11059200UL //定义为无符号长整型,避免计算溢出
#define BRT (65536 - (FOSC / 115200+2) / 4)
//加 2 操作是为了让 Keil 编译器
//自动实现四舍五入运算
#define ID_ADDR (&CHIPID0)
bit busy;
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
}
}
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
T1x12 = 1;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void main()
{
char i;
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
//(32 位模式请使用这句,注释下一句)
// P_SW2 |= 0x80; //允许访问扩展的特殊寄存器,XFR
//(8 位模式请使用这句,注释上一句)
WTST = 0; //设置取程序代码等待时间,
//赋值为 0 表示不等待,程序以最快速度运行
CKCON = 0; //设置访问片内的 xdata 速度,
//赋值为 0 表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
for (i=0; i<7; i++)
{
UartSend(ID_ADDR);
}
while (1);
}
|
|