标题:
基于单片机的门禁技术(c语言)
[打印本页]
作者:
lhen
时间:
2016-4-26 17:46
标题:
基于单片机的门禁技术(c语言)
可以读普通的mifare卡,测试完全通过,通过向扇区写入门码进行加密
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include<intrins.h> //oˉêy′|àíí·Îļt
#include<string.h> //×Ö·û′®′|àíí·Îļt
#include<stdio.h> // êäèëêä3öoˉêyí·Îļt
unsigned char code data1[16] = {0x00,0x00,0x00,0xAA,0xFF,0xFF,0xFF,0x55,0x00,0x00,0x00,0xAA,0x01,0xFE,0x01,0xFE};//
//M1¿¨μÄÄ3ò»¿éD′Îaèçϸñê½£¬Ôò¸Ã¿éÎaÃŽû£¬2»í¬μÄÃÅDT¸ÄÃÅÂë¼′¿é
//4×Ö½úÃÅÂ루μí×Ö½úÔúǰ£©£«4×Ö½úÃÅÂëè¡·′£«4×Ö½úÃÅÂ룫1×Ö½ú¿éμØÖ·£«1×Ö½ú¿éμØÖ·è¡·′£«1×Ö½ú¿éμØÖ·£«1×Ö½ú¿éμØÖ·è¡·′
unsigned char code data2[16] = {0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xff,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};//
//M1¿¨μÄÄ3ò»¿éD′Îaèçϸñê½£¬Ôò¸Ã¿éÎaÃŽû£¬2»í¬μÄÃÅDT¸ÄÃÅÂë¼′¿é
//4×Ö½úÃÅÂ루μí×Ö½úÔúǰ£©£«4×Ö½úÃÅÂëè¡·′£«4×Ö½úÃÅÂ룫1×Ö½ú¿éμØÖ·£«1×Ö½ú¿éμØÖ·è¡·′£«1×Ö½ú¿éμØÖ·£«1×Ö½ú¿éμØÖ·è¡·′
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //ÃüÂë
unsigned char TYPE_DATA[2];//ààDí
unsigned char ID_DATA[4]; //IDμØÖ·
unsigned char value_DATA[4];//¿¨àïÃæμÄÖμ
unsigned char g_ucTempbuf[20];//
unsigned char code DIS1[] = {"D£Ô°ÃŽû1üàíÏμí3"};
unsigned char code DIS2[] = {"ID£o"};
unsigned char code DIS3[] = {"»′o£1¤Ñ§ÔoËTéá "};
unsigned char code DIS4[] = {"½øÃÅÇëË¢¿¨£¡ "};
unsigned char code DIS6[] = {"0123456789ABCDEF"};
unsigned char code DIS7[]= {"Çë½ø£¡ "};
unsigned char tt=0,key_data,key_olddata,mode,profalg,kaimengtime;
unsigned int a,b;
void main( )
{
unsigned char status;
InitializeSystem( );
ckcsh();
PcdReset();
PcdAntennaOff(); //1رÕììÏß
PcdAntennaOn(); //¿aÆôììÏß
while ( 1 )
{
key();//°′¼ü¼ì2a
status = PcdRequest(PICC_REQALL, g_ucTempbuf); //Ѱ¿¨
if(status!=MI_OK)//û¿¨
{
ID_DATA[0]=0x00;
ID_DATA[1]=0x00;
ID_DATA[2]=0x00;
ID_DATA[3]=0x00;
profalg=0;
b=0;
}
if (status == MI_OK)//óD¿¨
{
if(profalg==0)
{
pro();
profalg=1;
}
TYPE_DATA[0]=g_ucTempbuf[0];
TYPE_DATA[1]=g_ucTempbuf[1];
status = PcdAnticoll(g_ucTempbuf); //·à3å×2 £¬·μ»Ø¿¨Æ¬IDoÅ 4×Ö½ú
if (status == MI_OK)
{
status = PcdSelect(g_ucTempbuf); //Ñ¡¶¨¿¨Æ¬ ,êäè뿨ƬIDoÅ
if (status == MI_OK)
{
ID_DATA[0]=g_ucTempbuf[0];
ID_DATA[1]=g_ucTempbuf[1];
ID_DATA[2]=g_ucTempbuf[2];
ID_DATA[3]=g_ucTempbuf[3];
writek();//D′¿¨
readk();//¶á¿¨
}
}
}
LCD12864();//ÏÔê¾′|àí°üਿaÃÅ′|àí
PcdHalt();//ÃüáƬ½øèëDYÃß×′쬣¬òòÎaѰ¿¨ÃüáîêÇѰÕòËùóDμÄ¿¨°üà¨DYÃßμÄ¿¨£¬ÕaìõÃüáî¿éòÔè¥μô
}
}
void InitializeSystem()//êäèëêä3ö¿ú3õê¼»ˉ
{
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
}
void Delay(unsigned int time)//Ñóê±oˉêy
{
unsigned int i,k ;
for(i=0;i<255;i++)
for(k=0;k<time;k++)
_nop_();
}
void ckcsh() //3õê¼»ˉoˉêy£¬3õê¼»ˉLCD
{
fmq=1;
lcd_init();
Delay(1);
}
void LCD12864()
{
unsigned char i;
lcd_pos(1,0); //éèÖÃÏÔê¾Î»ÖÃÎaμú1DD
for(i=0;i<16;i++)
{
lcd_wdat(DIS1
);
}
lcd_pos(2,0); //éèÖÃÏÔê¾Î»ÖÃÎaμú2DD
for(i=0;i<4;i++)
{
lcd_wdat(DIS2
);
}
lcd_wdat(DIS6[ID_DATA[0]/16]); // ID
lcd_wdat(DIS6[ID_DATA[0]%16]); //
lcd_wdat(DIS6[ID_DATA[1]/16]); //
lcd_wdat(DIS6[ID_DATA[1]%16]); //
lcd_wdat(DIS6[ID_DATA[2]/16]); //
lcd_wdat(DIS6[ID_DATA[2]%16]); //
lcd_wdat(DIS6[ID_DATA[3]/16]); //
lcd_wdat(DIS6[ID_DATA[3]%16]); //
lcd_pos(3,0); //éèÖÃÏÔê¾Î»ÖÃÎaμú3DD
for(i=0;i<16;i++)
{
lcd_wdat(DIS3
);
}
lcd_pos(4,0); //éèÖÃÏÔê¾Î»ÖÃÎaμú4DD
if(b==0xaa) //Çë½ø
{
for(i=0;i<16;i++)
{
lcd_wdat(DIS7
);
}
P41=0; //¼ìμçÆ÷¿a
kaimengtime=100;
}
if(kaimengtime==0) //μ±¿aÃÅê±¼äμ½μÄ»° 1Øμô¼ìμçÆ÷
{
P41=1; //¼ìμçÆ÷1Ø
for(i=0;i<16;i++)
{
lcd_wdat(DIS4
);
}
}
}
bit lcd_busy() //¼ì2éLCDÃ|×′ì¬ , lcd_busyÎa1ê±£¬Ã|£¬μè′y¡£lcd-busyÎa0ê±,ÏD£¬¿éD′Ö¸áîóëêy¾Y¡£
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
void lcd_wcmd(unsigned char cmd) //D′Ö¸áîêy¾Yμ½LCD , RS=L£¬RW=L£¬E=¸ßÂö3壬D0-D7=Ö¸áîÂë¡£
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
P0 = cmd;
_nop_();
_nop_();
LCD_EN = 1;
LCD_EN = 0;
}
void lcd_wdat(unsigned char dat) //D′ÏÔê¾êy¾Yμ½LCD ,RS=H£¬RW=L£¬E=¸ßÂö3壬D0-D7=êy¾Y¡£
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
LCD_EN = 1;
LCD_EN = 0;
}
void lcd_init()// LCD3õê¼»ˉé趨
{
P42=1;
LCD_RST = 0; //òo¾§¸′λ
Delay(3);
LCD_RST = 1;
Delay(3);
lcd_wcmd(0x34); //à©3äÖ¸áî2ù×÷
Delay(5);
lcd_wcmd(0x30); //»ù±¾Ö¸áî2ù×÷
Delay(5);
lcd_wcmd(0x0C); //ÏÔ꾿a£¬1Ø1a±ê
Delay(5);
lcd_wcmd(0x01); //Çå3yLCDμÄÏÔê¾ÄúèY
Delay(5);
}
void lcd_pos(unsigned char X,unsigned char Y)//é趨ÏÔê¾Î»ÖÃ
{
unsigned char pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //ÏÔê¾μØÖ·
}
void clr_screen()// ÇåÆáoˉêy
{
lcd_wcmd(0x34);//à©3äÖ¸áî2ù×÷
lcd_wcmd(0x30);//»ù±¾Ö¸áî2ù×÷
lcd_wcmd(0x01);//ÇåÆá
}
void pro()//·äÃùÆ÷Æô¶ˉoˉêy
{
fmq=0;
TMOD=0x11;//éèÖö¨ê±Æ÷0Îa1¤×÷·½ê½1
TH0=(65536-50000)/256;//¸ø¶¨ê±Æ÷×°3õÖμ ¸ß°Ëλ
TL0=(65536-50000)%256;//¸ø¶¨ê±Æ÷×°3õÖμ μí°Ëλ
EA=1; //¿a×üÖD¶Ï
ET0=1; //
TR0=1; //
}
void key()//16¼ü °′¼üé¨Ãè¼ì2a
{
keya=0;
keyb=1;
keyc=1;
keyd=1;
Delay(1);
switch(P2&0xf0)
{
case 0xe0:
key_data=1;
fmq=0;
break;
case 0xd0:
key_data=4;
break;
case 0xb0:
key_data=7;
break;
case 0x70:
key_data=0;
break;
default:
key_data=0Xff;
break;
}
keya=1;
keyb=0;
keyc=1;
keyd=1;
Delay(1);
switch(P2&0xf0)
{
case 0xe0:
key_data=2;
break;
case 0xd0:
key_data=5;
break;
case 0xb0:
key_data=8;
break;
case 0x70:
key_data=13;
break;
default:
break;
}
keya=1;
keyb=1;
keyc=0;
keyd=1;
Delay(1);
switch(P2&0xf0)
{
case 0xe0:
key_data=3;
break;
case 0xd0:
key_data=6;
break;
case 0xb0:
key_data=9;
break;
case 0x70:
key_data=15;
break;
default:
break;
}
keya=1;
keyb=1;
keyc=1;
keyd=0;
Delay(1);
switch(P2&0xf0)
{
case 0xe0:
key_data=10;
break;
case 0xd0:
key_data=11;
break;
case 0xb0:
key_data=12;
break;
case 0x70:
key_data=14;
break;
default:
break;
}
if(key_data!=key_olddata) //°′¼üÖμ¸üDÂóë·ñ
{
key_olddata=key_data;
if(key_data!=0Xff)
{
if( key_data==14)//·¢¿¨
{
mode=3;
}
if( key_data==12)//Ç忨
{
mode=2;
}
pro();
}
}
}
void time0() interrupt 1// ÖD¶Ï·tÎñ×ó3ìDò£¬·äÃùÆ÷éùòô½øèë3′Σ¬¿aÃÅê±¼ä-1
{
TH0=(65536-50000)/256;//¸ø¶¨ê±Æ÷×°3õÖμ ¸ß°Ëλ
TL0=(65536-50000)%256;//¸ø¶¨ê±Æ÷×°3õÖμ μí°Ëλ
tt++;
if(tt==3)
{
tt=0;
fmq=1;
}
if(kaimengtime>0)
{
kaimengtime--;
}
}
void readk()//¶á¿¨£¬bμÄÖμ¼°Îa±êÖ¾
{
unsigned char status;
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A ÑéÖ¤ÃüÂëÄ£ê½60AÃüÂë 61BÃüÂ룬¡°1¡±¿éμØÖ·£¬DefaultKey3õê¼ÃüÂ룬g_ucTempbuf IDoÅ
if (status == MI_OK) //ÑéÖ¤ÃüÂë
{
status = PcdRead(1, g_ucTempbuf);//¶á¿éμØÖ·¡°1¡±μÄêy¾Y£¬·μ»ØÖμ′æÔú g_ucTempbuf
if (status == MI_OK)
{
value_DATA[0]=g_ucTempbuf[0];
value_DATA[1]=g_ucTempbuf[1];
value_DATA[2]=g_ucTempbuf[2];
value_DATA[3]=g_ucTempbuf[3];
b=value_DATA[3];
}
}
}
void writek()//¸øÃŽû¿¨D′èëÖ죬00»òÕßaa AA¿éòÔ¿aÃÅ 00μÄ2»¿éòÔ¿aÃÅ
{
unsigned char status;
if( mode==3)//D′èë0xaa3äÖμ
{
mode=0;
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A ÑéÖ¤ÃüÂëÄ£ê½60AÃüÂë 61BÃüÂ룬¡°1¡±¿éμØÖ·£¬DefaultKey3õê¼ÃüÂ룬g_ucTempbuf IDoÅ
if (status == MI_OK) //ÑéÖ¤ÃüÂë
{
status = PcdWrite(1, data1);//D′èëÃÅÂë
if (status == MI_OK)
{
pro();
}
}
}
if(mode==2) //D′èë0x00
{
mode=0;
status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//PICC_AUTHENT1A ÑéÖ¤ÃüÂëÄ£ê½60AÃüÂë 61BÃüÂ룬¡°1¡±¿éμØÖ·£¬DefaultKey3õê¼ÃüÂ룬g_ucTempbuf IDoÅ
if (status == MI_OK) //ÑéÖ¤ÃüÂë
{
status = PcdWrite(1, data2);//D′èëÃÅÂë
if (status == MI_OK)
{
pro();
}
}
}
}
作者:
admin
时间:
2016-4-27 06:16
楼主 缺少头文件
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1