【笔记】单片机的“身份证号码”实现的三种方式

许多ic芯片都具有唯一的身份码(或序列号),用于识别和区分不同的芯片。以下是一些常见的ic芯片具有身份码的类型、优势以及针对每种芯片的读取身份码的示例程序:
1.at24c02 eeprom芯片
软件环境和库:arduino ide、wire库。
#include 
#define eeprom_addr 0x50
void setup() { wire.begin(); // 初始化wire库 serial.begin(9600);}
void loop() { wire.begintransmission(eeprom_addr); wire.write(0xfa); // 身份码存储地址 wire.endtransmission();
wire.requestfrom(eeprom_addr, 4); // 请求读取4个字节的数据 while (wire.available()) { byte data = wire.read(); serial.print(data < 0x10 ? 0 : ); serial.print(data, hex); serial.print( ); } serial.println(); delay(1000);}
注释和分析:
通过wire库与at24c02 eeprom芯片进行i2c通信。
将eeprom芯片的i2c地址设置为0x50。
在循环中,首先开始i2c传输并写入读取身份码的地址0xfa。
接着请求从eeprom芯片读取4个字节的数据。
使用wire.available()检查是否有可用的数据,并逐个读取字节。
打印每个字节的值(如果小于0x10,在前面补0)。
延迟1秒钟后,再次执行读取操作。
型号:at24c02
优势:低功耗、可靠性高、容量适中(2k位),适用于存储配置信息、产品序列号等。
2.stm32系列mcu芯片
软件环境和库:stm32cube hal库。
#include stm32f1xx_hal.h#include 
void systemclock_config(void);
int main(void) { hal_init(); systemclock_config();
uint32_t uniqueid[3];
uniqueid[0] = hal_getuidw0(); uniqueid[1] = hal_getuidw1(); uniqueid[2] = hal_getuidw2();
printf(unique id: %08x-%08x-%08x\n, uniqueid[2], uniqueid[1], uniqueid[0]);
while (1) { // 主程序其他逻辑 }}
void systemclock_config(void) { rcc_oscinittypedef rcc_oscinitstruct; rcc_clkinittypedef rcc_clkinitstruct;
__hal_rcc_pwr_clk_enable(); __hal_pwr_voltagescaling_config(pwr_regulator_voltage_scale1);
rcc_oscinitstruct.oscillatortype = rcc_oscillatortype_hsi; rcc_oscinitstruct.hsistate = rcc_hsi_on; rcc_oscinitstruct.hsicalibrationvalue = rcc_hsicalibration_default; rcc_oscinitstruct.pll.pllstate = rcc_pll_on; rcc_oscinitstruct.pll.pllsource = rcc_pllsource_hsi_div2; rcc_oscinitstruct.pll.pllmul = rcc_pll_mul16;
hal_rcc_oscconfig(&rcc_oscinitstruct);
rcc_clkinitstruct.clocktype = rcc_clocktype_hclk | rcc_clocktype_sysclk | rcc_clocktype_pclk1 | rcc_clocktype_pclk2; rcc_clkinitstruct.sysclksource = rcc_sysclksource_pllclk; rcc_clkinitstruct.ahbclkdivider = rcc_sysclk_div1; rcc_clkinitstruct.apb1clkdivider = rcc_hclk_div2; rcc_clkinitstruct.apb2clkdivider = rcc_hclk_div1;
hal_rcc_clockconfig(&rcc_clkinitstruct, flash_latency_2);}
注释和分析:
使用stm32cube hal库进行开发。
在主函数中,初始化系统和时钟,获取mcu的唯一身份码(通过hal_getuidw0、hal_getuidw1和hal_getuidw2函数)。
使用printf函数打印身份码。
在while循环中可以添加其他主程序逻辑。
systemclock_config函数配置mcu的时钟设置。
型号:stm32f103c8t6
优势:高性能、丰富的外设接口,适用于嵌入式系统、工业自动化等领域。
3.rfid芯片 mfrc522:
软件环境和库:arduino ide、mfrc522库。
#include #include 
mfrc522 mfrc522(10, 9); // 定义mfrc522模块的rst和ss引脚
void setup() { serial.begin(9600); spi.begin(); mfrc522.pcd_init(); // 初始化mfrc522模块}
void loop() { if (mfrc522.picc_isnewcardpresent() && mfrc522.picc_readcardserial()) { serial.print(uid: ); for (byte i = 0; i < mfrc522.uid.size; i++) { serial.print(mfrc522.uid.uidbyte[i] < 0x10 ? 0 : ); // 打印uid的每个字节,不足两位前面补0 serial.print(mfrc522.uid.uidbyte[i], hex); } serial.println(); mfrc522.picc_halta(); }}
注释和分析:
使用mfrc522库和spi库与mfrc522 rfid芯片进行通信。
在setup函数中,初始化串口、spi和mfrc522模块。
在循环中,检测是否有新的rfid卡片出现,并读取卡片的序列号(uid)。
逐个字节打印uid,并在不足两位时前面补0。
打印完uid后,通过mfrc522.picc_halta()命令使rfid卡片进入休眠状态。
型号:mfrc522
优势:长通信距离、多种安全特性,适用于物流追踪、智能卡、门禁等领域。
这些程序示例提供了读取身份码的基本框架和库函数的使用方法。根据不同的芯片和库,具体的程序实现会有所差异。请根据所使用的芯片和开发环境,参考相关的数据手册、库文档和示例代码,进行必要的调试和修改。

SIMV薄膜表面瑕疵在线检测设备的原理、参数及特点
模拟信号有哪些常见参数?放大器的功能有哪些?
紫光同芯又双叒叕荣获中国芯“优秀技术创新产品”奖
为什么机器人需要5G技术
使用Verilog实现基于FPGA的SDRAM控制器
【笔记】单片机的“身份证号码”实现的三种方式
Magic Leap和微软正在推销的MR又是什么?
如何构筑家庭听音室,环境与校声
学eda技术必看的8本书_eda技术方面的书籍推荐
日本机器人订单额再度呈现增长
诺基亚P1:侧边指纹识别 下月发布
诺基亚8、iPhone8什么时候上市?诺基亚8或将全面屏进行到底,成iphone 8最强势对手
盛思锐推出了一款微型SCD40二氧化碳和温湿度传感器
电竞俱乐部GK获近千万元天使轮融资,网友:人家这才叫打游戏!
AD5770R:分辨率低噪音可编电流输出的数模转换器
重庆万亿雄芯,全面揭秘 | GSIE 2024深耕不止!
爱立信:将4G技术演进冠以“4.5G”之名,这只是一种市场营销的手段
风向风速仪在农业生产中的作用是什么
家用太阳能板储能电池的相关知识
RCA清洁变量对颗粒去除效率的影响