基于51,人体红外感应和RC522的门禁系统
总结一下最近学的东西,这两天学的东西,rfid门卡系统终于弄出来来了,这个程序算现在写过的比较满意的程序,大家可以参考参考
主函数:
#include<reg52.h> #include"mian.h" #include"rc522.h" #include"12864.h"//卡号为0扇区0块内容的前四字节为卡号,且此块内容不能改写 uchar status; uchar g_ucTempbuf[20]; unsigned char hextoasc(unsigned char i) {if(i<0x09){i=i+'0';return i;}else{i=i+0x37;return i;} }void main() {uint i;uchar flagren,flagzhenque;uchar xule[4] = "8171";//初始化: init_12864();lcd_pos(1,2);write_string("实验重地");lcd_pos(2,2);write_string("闲人免进");while(1){flagren = hwgy();if(flagren == 1)break;}write_cmd(0x01);//清除lcd的显示内容lcd_pos(1,3);write_string("欢迎");lcd_pos(2,2);write_string("请刷卡!!"); PcdReset();//rc522初始化PcdAntennaOff(); //关闭和打开天线 PcdAntennaOn();M500PcdConfigISOType('A');//设定工作模式//防冲突,这里需要一个循环,让读卡器不断去读卡while(1){status = PcdRequest(PICC_REQALL, g_ucTempbuf);//PICC_REQALL他是个宏定义 意思是寻找天线内的所有卡片,// g_ucTempbuf 是个数组,在这里函数读取卡内的前两位放在数组中if(status != MI_OK)//没有找到卡,继续执行PcdRequest() {continue;}status = PcdAnticoll(g_ucTempbuf);//防冲突//卡片序列号,4字节,这里的status可以判PcdAnticoll的执行情况//如果执行成功,表示g_ucTempbuf上面已经记在唯一的卡号了//在这里g_ucTempbuf已经用了2+4个if(status != MI_OK)//没有找到卡,继续执行PcdRequest() {continue;}if(status == MI_OK){LED_GREEN =0;for(i=0;i<4;i++)//在12864上显示卡号 {if( hextoasc((g_ucTempbuf[i]&0xf0)>>4) == xule[i]){write_cmd(0x01);lcd_pos(1,2);write_string("封韦杰");lcd_pos(2,2);write_string("请进!!");flagzhenque = 1; }else {write_cmd(0x01);flagzhenque = 0;lcd_pos(1,3);write_string("错误!");lcd_pos(2,2);write_string("请出示门卡!");break; //寻卡失败跳出循环 }}if(flagzhenque == 1){for(i=0;i<125;i++){step();}}LED_GREEN = 1;}}}void DelayMs(unsigned int _MS) {TH1 = (unsigned char)(RCAP2_1ms>>8);TL1 = (unsigned char)(RCAP2_1ms);ET1 = 0; // Disable timer2 interruptTR1 = 1;while (_MS--){ while (!TF1);TF1 = 0;TH1 = (unsigned char)(RCAP2_1ms>>8);TL1 = (unsigned char)(RCAP2_1ms);}TR1 = 0; }
View Code
rc522.c
#include <intrins.h> #include <REG52.H>#include "mian.h" #include "rc522.h" #define MAXRLEN 18/ //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK / char PcdRequest(unsigned char req_code,unsigned char *pTagType) {char status; unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0] = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x10)){ *pTagType = ucComMF522Buf[0];*(pTagType+1) = ucComMF522Buf[1];}else{ status = MI_ERR; }return status; } / //功 能:防冲撞 //参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK / char PcdAnticoll(unsigned char *pSnr) {char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){ *(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);return status; }/ //功 能:选定卡片 //参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK/ /*char PcdSelect(unsigned char *pSnr) {char status;unsigned char i;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x70;ucComMF522Buf[6] = 0;for (i=0; i<4; i++){ucComMF522Buf[i+2] = *(pSnr+i);ucComMF522Buf[6] ^= *(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x18)){ status = MI_OK; }else{ status = MI_ERR; }return status; }*/ / //功 能:验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码 // pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK / /*char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) {char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode;ucComMF522Buf[1] = addr;for (i=0; i<6; i++){ ucComMF522Buf[i+2] = *(pKey+i); }for (i=0; i<6; i++){ ucComMF522Buf[i+8] = *(pSnr+i); }// memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))){ status = MI_ERR; }return status; }*/ / //功 能:读取M1卡一块数据 //参数说明: addr[IN]:块地址 // pData[OUT]:读出的数据,16字节 //返 回: 成功返回MI_OK / /*char PcdRead(unsigned char addr,unsigned char *pData) {char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_READ;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status == MI_OK) && (unLen == 0x90))// { memcpy(pData, ucComMF522Buf, 16); }{for (i=0; i<16; i++){ *(pData+i) = ucComMF522Buf[i]; }}else{ status = MI_ERR; }return status; }*/ / //功 能:写数据到M1卡一块 //参数说明: addr[IN]:块地址 // pData[IN]:写入的数据,16字节 //返 回: 成功返回MI_OK / /*char PcdWrite(unsigned char addr,unsigned char *pData) {char status;unsigned int unLen;unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_WRITE;ucComMF522Buf[1] = addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }if (status == MI_OK){//memcpy(ucComMF522Buf, pData, 16);for (i=0; i<16; i++){ ucComMF522Buf[i] = *(pData+i); }CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)){ status = MI_ERR; }}return status; }*/ / //功 能:扣款和充值 //参数说明: dd_mode[IN]:命令字 // 0xC0 = 扣款 // 0xC1 = 充值 // addr[IN]:钱包地址 // pValue[IN]:4字节增(减)值,低位在前 //返 回: 成功返回MI_OK / // char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue) // { // char status; // unsigned int unLen; // unsigned char i,ucComMF522Buf[MAXRLEN]; // // ucComMF522Buf[0] = dd_mode; // ucComMF522Buf[1] = addr; // CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);// status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);// if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // { status = MI_ERR; } // // if (status == MI_OK) // { // // memcpy(ucComMF522Buf, pValue, 4); // for (i=0; i<16; i++) // { ucComMF522Buf[i] = *(pValue+i); } // CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]); // unLen = 0; // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); // if (status != MI_ERR) // { status = MI_OK; } // } // // if (status == MI_OK) // { // ucComMF522Buf[0] = PICC_TRANSFER; // ucComMF522Buf[1] = addr; // CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);// if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // { status = MI_ERR; } // } // return status; // }/ //功 能:备份钱包 //参数说明: sourceaddr[IN]:源地址 // goaladdr[IN]:目标地址 //返 回: 成功返回MI_OK / // char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr) // { // char status; // unsigned int unLen; // unsigned char ucComMF522Buf[MAXRLEN]; // ucComMF522Buf[0] = PICC_RESTORE; // ucComMF522Buf[1] = sourceaddr; // CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);// if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // { status = MI_ERR; } // // if (status == MI_OK) // { // ucComMF522Buf[0] = 0; // ucComMF522Buf[1] = 0; // ucComMF522Buf[2] = 0; // ucComMF522Buf[3] = 0; // CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]); // // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); // if (status != MI_ERR) // { status = MI_OK; } // } // // if (status != MI_OK) // { return MI_ERR; } // // ucComMF522Buf[0] = PICC_TRANSFER; // ucComMF522Buf[1] = goaladdr;// CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // // status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);// if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // { status = MI_ERR; }// return status; // }/ //功 能:命令卡片进入休眠状态 //返 回: 成功返回MI_OK / char PcdHalt(void) {char status;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_HALT;ucComMF522Buf[1] = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK; }/ //用MF522计算CRC16函数 / void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData) {unsigned char i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i++){ WriteRawRC(FIFODataReg, *(pIndata+i)); }WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do {n = ReadRawRC(DivIrqReg);i--;}while ((i!=0) && !(n&0x04));pOutData[0] = ReadRawRC(CRCResultRegL);pOutData[1] = ReadRawRC(CRCResultRegM); }/ //功 能:复位RC522 //返 回: 成功返回MI_OK / char PcdReset(void) {MF522_RST=1;_nop_();MF522_RST=0;_nop_();MF522_RST=1;_nop_();WriteRawRC(CommandReg,PCD_RESETPHASE);_nop_();WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40); return MI_OK; } // //设置RC632的工作方式 // char M500PcdConfigISOType(unsigned char type) {if (type == 'A') //ISO14443_A { ClearBitMask(Status2Reg,0x08);/* WriteRawRC(CommandReg,0x20); //as default WriteRawRC(ComIEnReg,0x80); //as defaultWriteRawRC(DivlEnReg,0x0); //as defaultWriteRawRC(ComIrqReg,0x04); //as defaultWriteRawRC(DivIrqReg,0x0); //as defaultWriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensorWriteRawRC(WaterLevelReg,0x08); //as defaultWriteRawRC(ControlReg,0x20); //as defaultWriteRawRC(CollReg,0x80); //as default */WriteRawRC(ModeReg,0x3D);//3F /* WriteRawRC(TxModeReg,0x0); //as default???WriteRawRC(RxModeReg,0x0); //as default???WriteRawRC(TxControlReg,0x80); //as default???WriteRawRC(TxSelReg,0x10); //as default???*/WriteRawRC(RxSelReg,0x86);//84// WriteRawRC(RxThresholdReg,0x84);//as default// WriteRawRC(DemodReg,0x4D); //as default// WriteRawRC(ModWidthReg,0x13);//26WriteRawRC(RFCfgReg,0x7F); //4F/* WriteRawRC(GsNReg,0x88); //as default???WriteRawRC(CWGsCfgReg,0x20); //as default???WriteRawRC(ModGsCfgReg,0x20); //as default??? */WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);// PcdSetTmo(106);DelayMs(1);PcdAntennaOn();}else{ return -1; }return MI_OK; } / //功 能:读RC632寄存器 //参数说明:Address[IN]:寄存器地址 //返 回:读出的值 / unsigned char ReadRawRC(unsigned char Address) {unsigned char i, ucAddr;unsigned char ucResult=0;MF522_SCK = 0;MF522_NSS = 0;ucAddr = ((Address<<1)&0x7E)|0x80;for(i=8;i>0;i--){MF522_SI = ((ucAddr&0x80)==0x80);MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;}for(i=8;i>0;i--){MF522_SCK = 1;ucResult <<= 1;ucResult|=(bit)MF522_SO;MF522_SCK = 0;}MF522_NSS = 1;MF522_SCK = 1;return ucResult; }/ //功 能:写RC632寄存器 //参数说明:Address[IN]:寄存器地址 // value[IN]:写入的值 / void WriteRawRC(unsigned char Address, unsigned char value) { unsigned char i, ucAddr;MF522_SCK = 0;MF522_NSS = 0;ucAddr = ((Address<<1)&0x7E);for(i=8;i>0;i--){MF522_SI = ((ucAddr&0x80)==0x80);MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;}for(i=8;i>0;i--){MF522_SI = ((value&0x80)==0x80);MF522_SCK = 1;value <<= 1;MF522_SCK = 0;}MF522_NSS = 1;MF522_SCK = 1; }/ //功 能:置RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:置位值 / void SetBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); // set bit mask }/ //功 能:清RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:清位值 / void ClearBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & ~mask); // clear bit mask } / //功 能:通过RC522和ISO14443卡通讯 //参数说明:Command[IN]:RC522命令字 // pInData[IN]:通过RC522发送到卡片的数据 // InLenByte[IN]:发送数据的字节长度 // pOutData[OUT]:接收到的卡片返回数据 // *pOutLenBit[OUT]:返回数据的位长度 / char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit) {char status = MI_ERR;unsigned char irqEn = 0x00;unsigned char waitFor = 0x00;unsigned char lastBits;unsigned char n;unsigned int i;switch (Command){case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<InLenByte; i++){ WriteRawRC(FIFODataReg, pInData[i]); }WriteRawRC(CommandReg, Command);if (Command == PCD_TRANSCEIVE){ SetBitMask(BitFramingReg,0x80); }// i = 600;//根据时钟频率调整,操作M1卡最大等待时间25msi = 2000;do {n = ReadRawRC(ComIrqReg);i--;}while ((i!=0) && !(n&0x01) && !(n&waitFor));ClearBitMask(BitFramingReg,0x80);if (i!=0){ if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK;if (n & irqEn & 0x01){ status = MI_NOTAGERR; }if (Command == PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07;if (lastBits){ *pOutLenBit = (n-1)*8 + lastBits; }else{ *pOutLenBit = n*8; }if (n == 0){ n = 1; }if (n > MAXRLEN){ n = MAXRLEN; }for (i=0; i<n; i++){ pOutData[i] = ReadRawRC(FIFODataReg); }}}else{ status = MI_ERR; }}SetBitMask(ControlReg,0x80); // stop timer now WriteRawRC(CommandReg,PCD_IDLE); return status; }/ //开启天线 //每次启动或关闭天险发射之间应至少有1ms的间隔 / void PcdAntennaOn() {unsigned char i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)){SetBitMask(TxControlReg, 0x03);} }/ //关闭天线 / void PcdAntennaOff() {ClearBitMask(TxControlReg, 0x03); }
View Code
step.c
#include<reg52.h> #define Step 500 void step() {unsigned int i;P3 = 0x01;//0000 0001for(i = 0;i<Step;i++);P3 = 0x02;//0000 0010for(i = 0;i<Step;i++);P3 = 0x04;//0000 0100for(i = 0;i<Step;i++);P3 = 0x08;//0000 1000for(i = 0;i<Step;i++);}
View Code
12864.c
#include"12864.h" #include<reg52.h>sbit lcdrs = P2^4;//数据还是指令选择端口 sbit lcdwr = P2^5;//读写选择端口 sbit lcden = P2^6;//使能端口 sbit PSB = P2^1;//串并口选择端口/*uchar code table1[]={"Welcome!!"}; uchar code table2[]={"Psw:"}; uchar code table3[] ={"Open"}; uchar code table4[] ={"Error try again!"}; uchar code table5[] ={"Error 3 times!!"};*/void delay1ms(uint x)//延时函数 {uint i,j;for(i= x;i>0;i--)for(j=110;j>0;j--); }void write_cmd(uchar cmd)//写指令函数 {lcdrs = 0;lcdwr = 0;P0 = cmd;lcden = 1;delay1ms(5);// lcden = 0; }void write_date(uchar date)//写数据函数 {lcdrs = 1;lcdwr = 0;P0 = date;lcden = 1;delay1ms(5);// lcden = 0; }void write_string(uchar *str)//写入字符串函数 {for(;*str!='\0';str++){write_date(*str);delay1ms(2);}}void init_12864() {PSB = 1;//并口方式传送数据write_cmd(0x30);//基本指令操作write_cmd(0x0c);//开显示,关光标write_cmd(0x01);//清除lcd的显示内容 }void lcd_putpic(unsigned char code *img)//画图函数 {uint i,j;//画图上半部分for(i = 0;i<32;i++){write_cmd(0x80+i);// write_cmd(0x80);// for(j=0;j<16;j++){write_date(*img);img++;}}//画下部分的屏幕 for(i = 0;i<32;i++){write_cmd(0x80+i);//设定列write_cmd(0x88);//从第三行开始画图for(j=0;j<16;j++){write_date(*img);img++;}} }void setpic()//设定画图功能的函数 {write_cmd(0x36);//设定画图其画图功能delay1ms(5); }void lcd_pos(uchar x,uchar y)//设定显示位置的函数 {uchar pos;if(x==0)x=0x80;else if(x==1)x=0x90;else if(x==2)x=0x88;else if(x==3)x=0x98;pos=x+y;write_cmd(pos); }
View Code
hongwai.c
#include<reg52.h> #include"12864.h" sbit led = P3^5; sbit hongwai = P3^6;uchar flag;uchar hwgy() {hongwai = 1;while(1){ if(hongwai ==1)//检测到高电平的话,延时一下 {delay1ms(20);if(hongwai == 1)//再次检测一下 {led = 0;flag = 1;return flag;break;}}else{led = 1;flag = 0;return flag;}}}
View Code
头文件:
12864.h
#ifndef __12864_H__ #define _12864_H__#include<reg52.h> typedef unsigned int uint; typedef unsigned char uchar;/*extern uchar code table1[] ; extern uchar code table2[] ; extern uchar code table3[] ; extern uchar code table4[] ; extern uchar code table5[] ;*/extern unsigned char code pic1[]; void delay1ms(uint x);//延时函数 void write_cmd(uchar cmd);//写指令函数 void write_date(uchar date);//写数据函数void init_12864(); void lcd_putpic(unsigned char code *img);//画图函数 void setpic();//设定画图功能的函数 void lcd_pos(uchar x,uchar y);//设定显示位置的函数 void write_string(uchar *str);//红外感应模块 uchar hwgy(); #endif
View Code
main.h
#ifndef __MIAN_H_ #define __MIAN_H_// //端口定义 / //MFRC500 sbit MF522_RST = P1^1; //RC500?? sbit MF522_NSS = P1^7; sbit MF522_SCK = P1^6; sbit MF522_SI = P1^5; sbit MF522_SO = P1^2; //??? sbit LED_GREEN = P1^0; / //函数原型 / void InitializeSystem(); void step(); #define OSC_FREQ 7372800L #define RCAP2_50us 65536L - OSC_FREQ/40417L #define RCAP2_1ms 65536L - OSC_FREQ/2000L #define RCAP2_10ms 65536L - OSC_FREQ/1200L #define TIME0_500us 65536L - OSC_FREQ/8000L #define TIME0_10ms 65536L - OSC_FREQ/200 void DelayMs(unsigned int _MS);#endif
View Code
rc522.h
/ //函数原型 / char PcdReset(void); void PcdAntennaOn(void); void PcdAntennaOff(void); char PcdRequest(unsigned char req_code,unsigned char *pTagType); char PcdAnticoll(unsigned char *pSnr); char PcdSelect(unsigned char *pSnr); char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr); char PcdRead(unsigned char addr,unsigned char *pData); char PcdWrite(unsigned char addr,unsigned char *pData); char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue); char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr); char PcdHalt(void); char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit); void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData); void WriteRawRC(unsigned char Address,unsigned char value); unsigned char ReadRawRC(unsigned char Address); void SetBitMask(unsigned char reg,unsigned char mask); void ClearBitMask(unsigned char reg,unsigned char mask); char M500PcdConfigISOType(unsigned char type); / //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_ANTICOLL1 0x93 //防冲撞 #define PICC_ANTICOLL2 0x95 //防冲撞 #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 FIFO长度定义 / #define DEF_FIFO_LENGTH 64 //FIFO size=64byte/ //MF522寄存器定义 / // PAGE 0 #define RFU00 0x00 #define CommandReg 0x01 #define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 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 RFU0F 0x0F // PAGE 1 #define RFU10 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 RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F // PAGE 2 #define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F // PAGE 3 #define RFU30 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 RFU3C 0x3C #define RFU3D 0x3D #define RFU3E 0x3E #define RFU3F 0x3F/ //和MF522通讯时返回的错误代码 / #define MI_OK 0 #define MI_NOTAGERR (-1) #define MI_ERR (-2)
View Code
完整版本的程序:请见:http://download.csdn.net/detail/generoius/6700269
版权所有:转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3469995.html
转载于:https://www.cnblogs.com/fengdashen/p/3469995.html
基于51,人体红外感应和RC522的门禁系统相关推荐
- 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计)
基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 文章目录 基于低功耗蓝牙和微信小程序的门禁系统(FPGA课设设计) 一.低功耗蓝牙(BLE)的配置和与FPGA通信代码 1.1 低功耗蓝牙的介 ...
- 毕业设计 基于stm32的RFID与指纹识别的门禁系统 (项目开源)
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...
- 基于51单片机的指纹识别锁管理门禁密码锁系统方案原理图程序设计
硬件电路的设计 (附文件) 3.1系统的功能分析及体系结构设计 3.1.1系统功能分析 本系统由STC89C52单片机电路+指纹模块传感器电路+LCD1602液晶显示电路+继电器电路+按键电路+电源电 ...
- 基于Pxa270和Qt图形界面技术的人脸识别与密码电子锁的门禁系统
目 录 第1章 绪论 1 1.1 应用背景 1 1.2 系统描述 1 1.2.1 系统方案 1 1.2.2 系统主要功能描述 2 1.3 性能指标 2 1.4 系统特色 3 1.4.1 充分利用班上资 ...
- Linux毕业设计:基于OpenCV和QT库实现的人脸识别考勤/门禁系统(arm嵌入式ubuntu)
本文介绍:Linux上以opencv和qt库实现的人脸识别系统,可应用于考勤.门禁等场景,具有人脸录入.删除.人脸检测.识别.用户管理等完整功能.可运行于ARM嵌入式linux.ubuntu即纯软件. ...
- 【基于RFID的门禁系统】
本文为毕业设计分享,门禁系统已经很多了,本人做的就只是参考刷卡门禁系统,在里面添加一些自己的需求,设计时参考了其他资料,并综合了其他作品的功能,主要包含后台设置和刷卡以及密码等功能,该设计还是能够满足 ...
- RFID RC522门禁系统
RFID RC522门禁系统 RFID RC522门禁系统说明: 基于51单片机的RFID RC522门禁系统的主要功能是,在本系统中主要是演示了RFID RC522门禁系统,在单片机内部的RAM中I ...
- 基于STM32的多功能门禁系统(AS608指纹识别、密码解锁、刷卡解锁)
目录 一.项目功能 二.视频 三.原理图 4.材料选择 5.部分程序 资料下载地址:基于STM32的多功能门禁系统 一.项目功能 1.AS608指纹解锁:可以录入.删除.验证指纹: 2.密码解锁:可以 ...
- 一种基于嵌入式的多重识别门禁系统设计方案
一种基于嵌入式的多重识别门禁系统设计方案 1. 前言 门禁系统已广泛的应用在各行各业,随着社会经济的发展,人们对门禁系统的要求越来越高,设计更加安全.更加方便的门禁系统势在必行.由于不同企业对于门禁系 ...
最新文章
- 常用构建数据科学应用程序的七个Python库
- #软件更新#Visual Studio更新到16.3.8
- 开源库OpenNMT-py使用记录
- FLASH与E²PROM的区别
- 一个传值的问题”*”与”*”
- 面了三次字节,他的一些感悟
- [系列文章]上传文件管理控件v2
- String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围
- 对象创建型 - 单利模式
- 正则校验日期,不考虑闰年和闰月
- 这几条Mac技巧可能在你使用mac时锦上添花
- 解读神书《凤凰项目》,带你跳出DevOps转型的所有坑
- Exchange 2010输入序列号方式
- 响应式Web设计:HTML5和CSS3实战
- WPF中应用toolkit Chart控件安装
- 数据化运营17 留存:如何通过数据、社交、内容手段提升用户留存?
- centos7 glibc2.17升级到glibc2.28
- VIF-Net:RGB和红外图像融合的无监督框架
- 杰克 - 鬼马海盗主角加勒比海盗系列的
- 常见工作中遇到的问题
热门文章
- 【opencv】异常:Microsoft C++ exception: cv::Exception at memory location xxxxxxxx解决
- android 常用机型尺寸_Android中图片大小与各种hdpi
- js和html:周岁年龄计算器
- [从头读历史] 第301节 山海经 其实这不是一本神话书
- 云开发:微信小程序开发-组件化开发
- 围观历史上最著名的十大思想实验,一起来疯狂思考一下
- 【大数据】医疗大数据“九大业务应用”相关研究
- 运行pixellib出现错误
- uClinux on Blackfin BF533 STAMP - A DSP Linux Port
- C语言基础知识:*p++与*++p;(*p)++ 与 ++(*p)的理解