Arduino中MFRC-522射频IC卡感应模块使用
来源:互联网 发布:sql server 2008r2语句 编辑:程序博客网 时间:2024/05/03 20:00
连接图和 http://blog.csdn.net/zitech/article/details/24130405 中的一样
在这次试验中,我们会进行写与读两种操作,全部代码如下:
#include <SPI.h>#include <RFID.h>RFID rfid(10,5); //D10--读卡器MOSI引脚、D5--读卡器RST引脚//4字节卡序列号,第5字节为校验字节unsigned char serNum[5];//写卡数据unsigned char writeDate[16] ={'G', 'e', 'e', 'k', '-', 'W', 'o', 'r', 'k', 'S', 'h', 'o', 'p', 0, 0, 0};//原扇区A密码,16个扇区,每个扇区密码6Byteunsigned char sectorKeyA[16][16] = { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};//新扇区A密码,16个扇区,每个扇区密码6Byteunsigned char sectorNewKeyA[16][16] = { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};void setup(){ Serial.begin(9600); SPI.begin(); rfid.init();}void loop(){ unsigned char i,tmp; unsigned char status; unsigned char str[MAX_LEN]; unsigned char RC_size; unsigned char blockAddr; //选择操作的块地址0~63 //找卡 rfid.isCard(); //读取卡序列号 if (rfid.readCardSerial()) { Serial.print("The card's number is : "); Serial.print(rfid.serNum[0],HEX); Serial.print(rfid.serNum[1],HEX); Serial.print(rfid.serNum[2],HEX); Serial.print(rfid.serNum[3],HEX); Serial.print(rfid.serNum[4],HEX); Serial.println(" "); } //选卡,返回卡容量(锁定卡片,防止多次读写) rfid.selectTag(rfid.serNum); //写数据卡 blockAddr = 7; //数据块7 if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证 { //写数据 status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]); Serial.print("set the new card password, and can modify the data of the Sector: "); Serial.println(blockAddr/4,DEC); //写数据 blockAddr = blockAddr - 3 ; //数据块4 status = rfid.write(blockAddr, writeDate); if(status == MI_OK) { Serial.println("Write card OK!"); } } //读卡 blockAddr = 7; //数据块7 status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum); if (status == MI_OK) //认证 { //读数据 blockAddr = blockAddr - 3 ; //数据块4 if( rfid.read(blockAddr, str) == MI_OK) { Serial.print("Read from the card ,the data is : "); Serial.println((char *)str); } } rfid.halt();}
在这里我们写了一个专门用于 Arduino中MFRC-522射频IC卡感应模块使用的RC522库文件。
#include <RFID.h>
所有代码(库文件)下载: RFID_MFRC522库文件
库文件 见:
#ifndef RFID_h#define RFID_h#include <Arduino.h>#include <SPI.h>/****************************************************************************** * 定义 ******************************************************************************/#define MAX_LEN 16 // 数组最大长度//MF522命令字#define PCD_IDLE 0x00 //无动作,取消当前命令#define PCD_AUTHENT 0x0E //验证密钥#define PCD_RECEIVE 0x08 //接收数据#define PCD_TRANSMIT 0x04 //发送数据#define PCD_TRANSCEIVE 0x0C //发送并接收数据#define PCD_RESETPHASE 0x0F //复位#define PCD_CALCCRC 0x03 //CRC计算//Mifare_One卡片命令字#define PICC_REQIDL 0x26 //寻天线区内未进入休眠状态#define PICC_REQALL 0x52 //寻天线区内全部卡#define PICC_ANTICOLL 0x93 //防冲撞#define PICC_SElECTTAG 0x93 //选卡#define PICC_AUTHENT1A 0x60 //验证A密钥#define PICC_AUTHENT1B 0x61 //验证B密钥#define PICC_READ 0x30 //读块#define PICC_WRITE 0xA0 //写块#define PICC_DECREMENT 0xC0 #define PICC_INCREMENT 0xC1 #define PICC_RESTORE 0xC2 //调块数据到缓冲区#define PICC_TRANSFER 0xB0 //保存缓冲区中数据#define PICC_HALT 0x50 //休眠 //和MF522通讯时返回的错误代码#define MI_OK 0#define MI_NOTAGERR 1#define MI_ERR 2//------------------MFRC522寄存器---------------//Page 0:Command and Status#define Reserved00 0x00 #define CommandReg 0x01 #define CommIEnReg 0x02 #define DivlEnReg 0x03 #define CommIrqReg 0x04 #define DivIrqReg 0x05#define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09#define FIFOLevelReg 0x0A#define WaterLevelReg 0x0B#define ControlReg 0x0C#define BitFramingReg 0x0D#define CollReg 0x0E#define Reserved01 0x0F//Page 1:Command #define Reserved10 0x10#define ModeReg 0x11#define TxModeReg 0x12#define RxModeReg 0x13#define TxControlReg 0x14#define TxAutoReg 0x15#define TxSelReg 0x16#define RxSelReg 0x17#define RxThresholdReg 0x18#define DemodReg 0x19#define Reserved11 0x1A#define Reserved12 0x1B#define MifareReg 0x1C#define Reserved13 0x1D#define Reserved14 0x1E#define SerialSpeedReg 0x1F//Page 2:CFG #define Reserved20 0x20 #define CRCResultRegM 0x21#define CRCResultRegL 0x22#define Reserved21 0x23#define ModWidthReg 0x24#define Reserved22 0x25#define RFCfgReg 0x26#define GsNReg 0x27#define CWGsPReg 0x28#define ModGsPReg 0x29#define TModeReg 0x2A#define TPrescalerReg 0x2B#define TReloadRegH 0x2C#define TReloadRegL 0x2D#define TCounterValueRegH 0x2E#define TCounterValueRegL 0x2F//Page 3:TestRegister #define Reserved30 0x30#define TestSel1Reg 0x31#define TestSel2Reg 0x32#define TestPinEnReg 0x33#define TestPinValueReg 0x34#define TestBusReg 0x35#define AutoTestReg 0x36#define VersionReg 0x37#define AnalogTestReg 0x38#define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define Reserved31 0x3C #define Reserved32 0x3D #define Reserved33 0x3E #define Reserved34 0x3F//-----------------------------------------------class RFID{ public:RFID(int chipSelectPin, int NRSTPD); //读卡器MOSI引脚、读卡器RST引脚bool isCard();bool readCardSerial();void init();void reset();void setBitMask(unsigned char reg, unsigned char mask);void clearBitMask(unsigned char reg, unsigned char mask);void antennaOn(void);void antennaOff(void);void calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData);void writeMFRC522(unsigned char addr, unsigned char val);unsigned char readMFRC522(unsigned char addr);unsigned char MFRC522Request(unsigned char reqMode, unsigned char *TagType);unsigned char MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen);unsigned char anticoll(unsigned char *serNum);unsigned char auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum);unsigned char read(unsigned char blockAddr, unsigned char *recvData);unsigned char write(unsigned char blockAddr, unsigned char *writeData);unsigned char selectTag(unsigned char *serNum);void halt();unsigned char serNum[5]; // 4字节卡序列号,第5字节为校验字节 private:int _chipSelectPin;int _NRSTPD;};#endif
头文件中函数的实现是在一个名为 RFID.cpp 的文件中,具体为:
****************************************************************************** * 包含文件 ******************************************************************************/#include <Arduino.h>#include <RFID.h>/****************************************************************************** * 构造 RFID * int chipSelectPin RFID /ENABLE pin ******************************************************************************/RFID::RFID(int chipSelectPin, int NRSTPD){ _chipSelectPin = chipSelectPin; _NRSTPD = NRSTPD; pinMode(_chipSelectPin,OUTPUT); // 设置管脚_chipSelectPin为输出并连接到模块使能口 digitalWrite(_chipSelectPin, LOW); pinMode(_NRSTPD,OUTPUT); // 设置管脚NRSTPD为输出,非重置或掉电 digitalWrite(_NRSTPD, HIGH);}/****************************************************************************** * 用户 API ******************************************************************************//****************************************************************************** * 函 数 名:isCard * 功能描述:寻卡 * 输入参数:无 * 返 回 值:成功返回ture 失败返回false ******************************************************************************/bool RFID::isCard(){ unsigned char status; unsigned char str[MAX_LEN]; status = MFRC522Request(PICC_REQIDL, str); if (status == MI_OK) return true; else return false;}/****************************************************************************** * 函 数 名:readCardSerial * 功能描述:返回卡的序列号 4字节 * 输入参数:无 * 返 回 值:成功返回ture 失败返回false ******************************************************************************/bool RFID::readCardSerial(){ unsigned char status; unsigned char str[MAX_LEN]; // 防冲撞,返回卡的序列号 4字节,存入serNum中 status = anticoll(str); memcpy(serNum, str, 5); if (status == MI_OK) return true; else return false;}/****************************************************************************** * 函 数 名:init * 功能描述:初始化RC522 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::init(){ digitalWrite(_NRSTPD,HIGH); reset(); //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms writeMFRC522(TModeReg, 0x8D); //Tauto=1; f(Timer) = 6.78MHz/TPreScaler writeMFRC522(TPrescalerReg, 0x3E); //TModeReg[3..0] + TPrescalerReg writeMFRC522(TReloadRegL, 30); writeMFRC522(TReloadRegH, 0); writeMFRC522(TxAutoReg, 0x40); //100%ASK writeMFRC522(ModeReg, 0x3D); // CRC valor inicial de 0x6363 //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 //writeMFRC522(RxSelReg, 0x86); //RxWait = RxSelReg[5..0] //writeMFRC522(RFCfgReg, 0x7F); //RxGain = 48dB antennaOn(); //打开天线}/****************************************************************************** * 函 数 名:reset * 功能描述:复位RC522 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::reset(){ writeMFRC522(CommandReg, PCD_RESETPHASE);}/****************************************************************************** * 函 数 名:writeMFRC522 * 功能描述:向MFRC522的某一寄存器写一个字节数据 * 输入参数:addr--寄存器地址;val--要写入的值 * 返 回 值:无 ******************************************************************************/void RFID::writeMFRC522(unsigned char addr, unsigned char val){ digitalWrite(_chipSelectPin, LOW); //地址格式:0XXXXXX0 SPI.transfer((addr<<1)&0x7E); SPI.transfer(val); digitalWrite(_chipSelectPin, HIGH);}/****************************************************************************** * 函 数 名:readMFRC522 * 功能描述:从MFRC522的某一寄存器读一个字节数据 * 输入参数:addr--寄存器地址 * 返 回 值:返回读取到的一个字节数据 ******************************************************************************/unsigned char RFID::readMFRC522(unsigned char addr){ unsigned char val; digitalWrite(_chipSelectPin, LOW); SPI.transfer(((addr<<1)&0x7E) | 0x80); val =SPI.transfer(0x00); digitalWrite(_chipSelectPin, HIGH); return val;}/****************************************************************************** * 函 数 名:setBitMask * 功能描述:置RC522寄存器位 * 输入参数:reg--寄存器地址;mask--置位值 * 返 回 值:无 ******************************************************************************/void RFID::setBitMask(unsigned char reg, unsigned char mask){ unsigned char tmp; tmp = readMFRC522(reg); writeMFRC522(reg, tmp | mask); // set bit mask}/****************************************************************************** * 函 数 名:clearBitMask * 功能描述:清RC522寄存器位 * 输入参数:reg--寄存器地址;mask--清位值 * 返 回 值:无 ******************************************************************************/void RFID::clearBitMask(unsigned char reg, unsigned char mask){ unsigned char tmp; tmp = readMFRC522(reg); writeMFRC522(reg, tmp & (~mask)); // clear bit mask}/****************************************************************************** * 函 数 名:antennaOn * 功能描述:开启天线,每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::antennaOn(void){ unsigned char temp; temp = readMFRC522(TxControlReg); if (!(temp & 0x03)) { setBitMask(TxControlReg, 0x03); }}/****************************************************************************** * 函 数 名:antennaOff * 功能描述:关闭天线,每次启动或关闭天险发射之间应至少有1ms的间隔 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::antennaOff(void){ unsigned char temp; temp = readMFRC522(TxControlReg); if (!(temp & 0x03)) { clearBitMask(TxControlReg, 0x03); }}/****************************************************************************** * 函 数 名:calculateCRC * 功能描述:用MF522计算CRC * 输入参数:pIndata--要读数CRC的数据,len--数据长度,pOutData--计算的CRC结果 * 返 回 值:无 ******************************************************************************/void RFID::calculateCRC(unsigned char *pIndata, unsigned char len, unsigned char *pOutData){ unsigned char i, n; clearBitMask(DivIrqReg, 0x04); //CRCIrq = 0 setBitMask(FIFOLevelReg, 0x80); //清FIFO指针 //Write_MFRC522(CommandReg, PCD_IDLE); //向FIFO中写入数据 for (i=0; i<len; i++) writeMFRC522(FIFODataReg, *(pIndata+i)); writeMFRC522(CommandReg, PCD_CALCCRC); //等待CRC计算完成 i = 0xFF; do { n = readMFRC522(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); //CRCIrq = 1 //读取CRC计算结果 pOutData[0] = readMFRC522(CRCResultRegL); pOutData[1] = readMFRC522(CRCResultRegM);}/****************************************************************************** * 函 数 名:MFRC522ToCard * 功能描述:RC522和ISO14443卡通讯 * 输入参数:command--MF522命令字, * sendData--通过RC522发送到卡片的数据, * sendLen--发送的数据长度 * backData--接收到的卡片返回数据, * backLen--返回数据的位长度 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::MFRC522ToCard(unsigned char command, unsigned char *sendData, unsigned char sendLen, unsigned char *backData, unsigned int *backLen){ unsigned char status = MI_ERR; unsigned char irqEn = 0x00; unsigned char waitIRq = 0x00; unsigned char lastBits; unsigned char n; unsigned int i; switch (command) { case PCD_AUTHENT: //认证卡密 { irqEn = 0x12; waitIRq = 0x10; break; } case PCD_TRANSCEIVE: //发送FIFO中数据 { irqEn = 0x77; waitIRq = 0x30; break; } default: break; } writeMFRC522(CommIEnReg, irqEn|0x80); //允许中断请求 clearBitMask(CommIrqReg, 0x80); //清除所有中断请求位 setBitMask(FIFOLevelReg, 0x80); //FlushBuffer=1, FIFO初始化 writeMFRC522(CommandReg, PCD_IDLE); //无动作,取消当前命令 //向FIFO中写入数据 for (i=0; i<sendLen; i++) writeMFRC522(FIFODataReg, sendData[i]); //执行命令 writeMFRC522(CommandReg, command); if (command == PCD_TRANSCEIVE) setBitMask(BitFramingReg, 0x80); //StartSend=1,transmission of data starts //等待接收数据完成 i = 2000; //i根据时钟频率调整,操作M1卡最大等待时间25ms do { //CommIrqReg[7..0] //Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRq n = readMFRC522(CommIrqReg); i--; } while ((i!=0) && !(n&0x01) && !(n&waitIRq)); clearBitMask(BitFramingReg, 0x80); //StartSend=0 if (i != 0) { if(!(readMFRC522(ErrorReg) & 0x1B)) //BufferOvfl Collerr CRCErr ProtecolErr { status = MI_OK; if (n & irqEn & 0x01) status = MI_NOTAGERR; //?? if (command == PCD_TRANSCEIVE) { n = readMFRC522(FIFOLevelReg); lastBits = readMFRC522(ControlReg) & 0x07; if (lastBits) *backLen = (n-1)*8 + lastBits; else *backLen = n*8; if (n == 0) n = 1; if (n > MAX_LEN) n = MAX_LEN; //读取FIFO中接收到的数据 for (i=0; i<n; i++) backData[i] = readMFRC522(FIFODataReg); } } else status = MI_ERR; } //SetBitMask(ControlReg,0x80); //timer stops //Write_MFRC522(CommandReg, PCD_IDLE); return status;}/****************************************************************************** * 函 数 名:MFRC522Request * 功能描述:寻卡,读取卡类型号 * 输入参数:reqMode--寻卡方式, * TagType--返回卡片类型 * 0x4400 = Mifare_UltraLight * 0x0400 = Mifare_One(S50) * 0x0200 = Mifare_One(S70) * 0x0800 = Mifare_Pro(X) * 0x4403 = Mifare_DESFire * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::MFRC522Request(unsigned char reqMode, unsigned char *TagType){ unsigned char status; unsigned int backBits; //接收到的数据位数 writeMFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] ??? TagType[0] = reqMode; status = MFRC522ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits); if ((status != MI_OK) || (backBits != 0x10)) status = MI_ERR; return status;}/****************************************************************************** * 函 数 名:anticoll * 功能描述:防冲突检测,读取选中卡片的卡序列号 * 输入参数:serNum--返回4字节卡序列号,第5字节为校验字节 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::anticoll(unsigned char *serNum){ unsigned char status; unsigned char i; unsigned char serNumCheck=0; unsigned int unLen; //ClearBitMask(Status2Reg, 0x08); //TempSensclear //ClearBitMask(CollReg,0x80); //ValuesAfterColl writeMFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0] serNum[0] = PICC_ANTICOLL; serNum[1] = 0x20; status = MFRC522ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen); if (status == MI_OK) { //校验卡序列号 for (i=0; i<4; i++) serNumCheck ^= serNum[i]; if (serNumCheck != serNum[i]) status = MI_ERR; } //SetBitMask(CollReg, 0x80); //ValuesAfterColl=1 return status;}/****************************************************************************** * 函 数 名:auth * 功能描述:验证卡片密码 * 输入参数:authMode--密码验证模式 * 0x60 = 验证A密钥 * 0x61 = 验证B密钥 * BlockAddr--块地址 * Sectorkey--扇区密码 * serNum--卡片序列号,4字节 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::auth(unsigned char authMode, unsigned char BlockAddr, unsigned char *Sectorkey, unsigned char *serNum){ unsigned char status; unsigned int recvBits; unsigned char i; unsigned char buff[12]; //验证指令+块地址+扇区密码+卡序列号 buff[0] = authMode; buff[1] = BlockAddr; for (i=0; i<6; i++) buff[i+2] = *(Sectorkey+i); for (i=0; i<4; i++) buff[i+8] = *(serNum+i); status = MFRC522ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits); if ((status != MI_OK) || (!(readMFRC522(Status2Reg) & 0x08))) status = MI_ERR; return status;}/****************************************************************************** * 函 数 名:read * 功能描述:读块数据 * 输入参数:blockAddr--块地址;recvData--读出的块数据 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::read(unsigned char blockAddr, unsigned char *recvData){ unsigned char status; unsigned int unLen; recvData[0] = PICC_READ; recvData[1] = blockAddr; calculateCRC(recvData,2, &recvData[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen); if ((status != MI_OK) || (unLen != 0x90)) status = MI_ERR; return status;}/****************************************************************************** * 函 数 名:write * 功能描述:写块数据 * 输入参数:blockAddr--块地址;writeData--向块写16字节数据 * 返 回 值:成功返回MI_OK ******************************************************************************/unsigned char RFID::write(unsigned char blockAddr, unsigned char *writeData){ unsigned char status; unsigned int recvBits; unsigned char i; unsigned char buff[18]; buff[0] = PICC_WRITE; buff[1] = blockAddr; calculateCRC(buff, 2, &buff[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; if (status == MI_OK) { for (i=0; i<16; i++) //?FIFO?16Byte?? Datos a la FIFO 16Byte escribir buff[i] = *(writeData+i); calculateCRC(buff, 16, &buff[16]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits); if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR; } return status;}/****************************************************************************** * 函 数 名:selectTag * 功能描述:选卡,读取卡存储器容量 * 输入参数:serNum--传入卡序列号 * 返 回 值:成功返回卡容量 ******************************************************************************/unsigned char RFID::selectTag(unsigned char *serNum){ unsigned char i; unsigned char status; unsigned char size; unsigned int recvBits; unsigned char buffer[9]; //ClearBitMask(Status2Reg, 0x08); //MFCrypto1On=0 buffer[0] = PICC_SElECTTAG; buffer[1] = 0x70; for (i=0; i<5; i++) buffer[i+2] = *(serNum+i); calculateCRC(buffer, 7, &buffer[7]); status = MFRC522ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits); if ((status == MI_OK) && (recvBits == 0x18)) size = buffer[0]; else size = 0; return size;}/****************************************************************************** * 函 数 名:Halt * 功能描述:命令卡片进入休眠状态 * 输入参数:无 * 返 回 值:无 ******************************************************************************/void RFID::halt(){ unsigned char status; unsigned int unLen; unsigned char buff[4]; buff[0] = PICC_HALT; buff[1] = 0; calculateCRC(buff, 2, &buff[2]); status = MFRC522ToCard(PCD_TRANSCEIVE, buff, 4, buff,&unLen);}
0 0
- Arduino中MFRC-522射频IC卡感应模块使用
- Arduino 使用人体红外感应模块 HC-SR501
- 射频IC卡-M1卡介绍-转
- Arduino:L298N模块使用
- Arduino使用雨滴模块
- Azoteq的电容感应IC IQS127的特点与使用
- 非接触式IC卡中的射频识别技术
- 【Arduino】SD卡模块
- arduino巡线模块使用
- Arduino使用蓝牙BLE模块
- Arduino使用高感度声音模块
- Arduino使用蓝牙通信模块
- arduino中使用watchdog
- 网页中使用刷IC卡认证的实现
- [Arduino]HC-06蓝牙模块使用小结
- 在Arduino上面使用震动开关模块
- Arduino 单片机之 ESP8266模块使用
- Arduino使用手指测心跳模块
- Android访问服务器地址是10.0.2.2的原因
- Android学习之学习路线图
- 今日有感-对研究问题范围的限定与算法效果的关系
- user ... lacks CREATE SESSION privilege:logon denied
- GSL+DevC++使用
- Arduino中MFRC-522射频IC卡感应模块使用
- java编程中容易犯2的细节汇总
- leetcode 第5题 Longest Palindromic Substring
- 数据结构-----层次遍历二叉树算法(利用队列实现)
- Ruby输出中文报错
- 2014编程之美初赛A题焦距
- sqlite3 的安装步骤:
- Asp.Net MVC4 系列--进阶篇之Model(1)
- ZOJ-2027