標(biāo)題:
關(guān)于RC522制作的刷卡加密碼門禁系統(tǒng)源碼資料
[打印本頁]
作者:
賽哥哥
時(shí)間:
2017-7-27 13:39
標(biāo)題:
關(guān)于RC522制作的刷卡加密碼門禁系統(tǒng)源碼資料
內(nèi)含有源代碼和12864的資料以及程序
這也是朋友給我的資料 最近才看懂
分享給大家
0.png
(29.27 KB, 下載次數(shù): 75)
下載附件
2017-7-27 18:09 上傳
單片機(jī)源程序如下:
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
/*和刷卡模塊之間通信的 i\o口 使用SPI通信*/
sbit CS=P3^2; //片選信號
sbit SID=P3^5; //數(shù)據(jù)信號
sbit SCLK=P3^4; //時(shí)鐘信號
sbit RST=P3^3; //復(fù)位信號
/********************************************************************
* 名稱 : delay()
* 功能 : 延時(shí),延時(shí)時(shí)間為 100us * t。這是通過軟件延時(shí),有一定誤差。
* 輸入 : t
* 輸出 : 無
***********************************************************************/
void delay(unsigned int t) //延時(shí)函數(shù)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名稱 : sendbyte()
* 功能 : 按照液晶的串口通信協(xié)議,發(fā)送數(shù)據(jù)
* 輸入 : zdata
* 輸出 : 無
***********************************************************************/
void sendbyte(unsigned char zdata) // 向lcd寫一個(gè)字節(jié)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80) //一位一位的發(fā)送過去
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
}
/********************************************************************
* 名稱 : write_com()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void write_com(unsigned char cmdcode) //給lcd寫命令的
{
CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名稱 : write_data()
* 功能 : 寫串口指令
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void write_data(unsigned char Dispdata) // 向lcd寫數(shù)據(jù)的函數(shù) 其中調(diào)用了 寫字節(jié)函數(shù)
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名稱 : lcdinit()
* 功能 : 初始化函數(shù)
* 輸入 : cmdcode
* 輸出 : 無
***********************************************************************/
void lcdinit() //lcd12864的初始化
{
RST = 0;
delay(100);
RST = 1;
delay(20000);
write_com(0x30);
delay(50);
write_com(0x0c);
delay(50);
}
/********************************************************************
* 名稱 : hzkdis()
* 功能 : 顯示字符串
* 輸入 : *s
* 輸出 : 無
***********************************************************************/
void hzkdis(unsigned char code *s) //向lcd寫一個(gè)字符串 函數(shù)調(diào)用了 寫數(shù)據(jù)函數(shù)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名稱 : Test()
* 功能 : 顯示子函數(shù)
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Test() // 開機(jī)的一個(gè)顯示函數(shù)
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis("13級 楊向鵬");
write_com(0x92);
hzkdis("畢業(yè)設(shè)計(jì)");
write_com(0x89);
hzkdis("電子門禁系統(tǒng)");
write_com(0x9a);
hzkdis("請刷卡");
}
//M1卡的某一塊寫為如下格式,則該塊為錢包,可接收扣款和充值命令
//4字節(jié)金額(低字節(jié)在前)+4字節(jié)金額取反+4字節(jié)金額+1字節(jié)塊地址+1字節(jié)塊地址取反+1字節(jié)塊地址+1字節(jié)塊地址取反
unsigned char code data2[4] = {0x12,0,0,0};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //unsigned char g_ucTempbuf[20];
unsigned char idata MLastSelectedSnr[4];
unsigned char idata RevBuffer[30];// = {02,02,26};
unsigned char data SerBuffer[20];
unsigned char flag,statu;
unsigned char cmd;
unsigned char j;
unsigned char table_shuju[10];
unsigned char code mima[6] = {14,10,6,13,9,5}; // 對應(yīng)的按鍵值 對應(yīng)的密碼為123456
bit CmdValid;
sbit PWM = P3^6; //控制舵機(jī)的io口 使用pwm控制
#define GPIO_KEY P2 //矩陣鍵盤的輸入口
unsigned char pwm,num;
unsigned char KeyValue,z,x,y;
//unsigned int code table[] = {0x00,0xfa,0x3a,0xb0,0xab}; // 這是我的一卡通的id 等你回來可以換成你的
unsigned int code table[] = {0x00,0xe4,0x8a,0x3a,0xdb};
void Delay10ms(int c ) //延時(shí)函數(shù)
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void iccardcode() //這是ic卡的讀取函數(shù)
{
unsigned char status;
cmd++;
switch(cmd)
{
case 1: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
// 尋卡,防沖突,選擇卡 返回卡類型(2 bytes)+ 卡系列號(4 bytes)
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
}
RevBuffer[0]=3;
RevBuffer[1]=status;
break;
case 2: // 防沖突 讀卡的系列號 MLastSelectedSnr
cmd = 0;
status = PcdAnticoll(&RevBuffer[2]);
if(status!=0)
{
RevBuffer[0]=1;
RevBuffer[1]=status;
break;
}
memcpy(MLastSelectedSnr,&RevBuffer[2],4);
RevBuffer[0]=5;
RevBuffer[1]=status;
break;
}
}
/////////////////////////////////////////////////////////////////////
//系統(tǒng)初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem() //初始化 中斷函數(shù) 包括串口中斷和外部中斷 串口是用來讀取ic信息發(fā)送給上位機(jī)的
{
P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;
ET2 = 0;
T2CON = 0x04;
// PCON = 0x80;
SCON = 0x70;
TMOD = 0x21; //TMOD = 0x22;
TH1 = 0xfd;//BAUD_9600;
TL1 = TH1;
TR1 = 1; // 波特率發(fā)生器
TH0 = (65536-458)/256;
TL0 = (65536-458)%256;
ET0=1;
ET1=0;
EA=1;
EX0=1;
IT0 = 1;
TR2=0;
ES = 1;
CmdValid=0;
LED_GREEN = 1;
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType( 'A' );
LED_GREEN = 0;
delay_10ms(10);
LED_GREEN = 1;
delay_10ms(10);
LED_GREEN = 0;
}
/////////////////////////////////////////////////////////////////////
//用T2做延時(shí)子程序
/////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// 接收和發(fā)送中斷
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1// 串口中斷 上位機(jī)使用 實(shí)際中沒有用處 讀取ic卡信息時(shí)使用
{
unsigned char len,i;
unsigned int j=0;
if(!RI && TI)
{
TI=0;
len=RevBuffer[0];
for(i=0;i<len+1;i++)
{
SBUF=RevBuffer[i];
while(!TI);
TI=0;
}
REN=1;
}
}
void KeyDown(void) //矩陣鍵盤的檢測函數(shù)
{
char a = 0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
Delay10ms(1);//延時(shí)10ms進(jìn)行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): table_shuju[y]=KeyValue+3;y++;break;
case(0Xb0): table_shuju[y]=KeyValue+2;;y++;break;
case(0Xd0): table_shuju[y]=KeyValue+1;y++;break;
case(0Xe0): table_shuju[y]=KeyValue+16;y++;break;
}
while((a<50) && (GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
{
Delay10ms(1);
a++;
}
}
}
}
void main( )
{
cmd = 0;
num = 0;
y = 0;
flag = 0;
InitializeSystem( );
TR0 = 1;
pwm = 5;
Delay10ms(30);
TR0 = 0;
delay(1); //12864初始化
lcdinit();
delay(10);
Test();
while (1)
{
z = 1;
y = 0;
iccardcode(); //分析數(shù)據(jù)
iccardcode();
TI = 1;//CALL_isr_UART();
//讀取ic卡信息后判斷信息對不對
for(j = 0;j<5;j++)
{
if(RevBuffer[j+1] == table[j])
{
flag++;
}
}
if(flag ==5) //ic信息正確
{
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("請輸入密碼");
flag = 0;
while (z) //ic卡信息正確后 開始讓輸入密碼
{
KeyDown();
switch(y) //按下一個(gè)按鍵顯示一個(gè)“*”
{
case 1:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("* "); break;
case 2:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("** "); break;
case 3:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("*** "); break;
case 4:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("**** "); break;
case 5:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("***** "); break;
case 6:
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("****** "); break;
default:break;
}
if(table_shuju[y-1] == 16) //密碼不小心數(shù)錯(cuò)了 刪除“*” 重新輸入
{
y = 0;
flag = 0;
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis(" ");
}
if(table_shuju[y-1] == 3) //按下紅色的的確定按鍵
{
for(x = 0;x<6;x++) //判定密碼對不對 如果對flag = 6
{
if(table_shuju[x] == mima[x])
flag++;
}
if(flag == 6) // 密碼正確
{
TR0 = 1;
pwm = 2; //輸出PWM控制舵機(jī)開門 當(dāng)屏幕出現(xiàn)********** 然后依次減少 最后開門時(shí)間到舵機(jī)回位 門會再次上鎖
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("**********");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("********* ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("******** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("******* ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("****** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("***** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("**** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("*** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("** ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("* ");
Delay10ms(10);
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis(" ");
pwm = 7;
Delay10ms(30);
TR0 = 0; //關(guān)閉PWM中斷 節(jié)約電量
Test();
z = 0;
}
else
{
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("密碼錯(cuò)誤");
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
RC522資料.7z
(635.37 KB, 下載次數(shù): 173)
2017-7-27 13:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
jubaolun
時(shí)間:
2017-7-31 12:40
謝謝分享,學(xué)習(xí)了
作者:
adminre
時(shí)間:
2019-4-1 01:03
感謝
作者:
suph007
時(shí)間:
2019-5-12 10:58
正在需要此內(nèi)容啊 ,感謝分享
作者:
suph007
時(shí)間:
2019-5-12 10:59
感謝樓主分享使用
作者:
黎明zERo
時(shí)間:
2019-12-27 17:10
感謝樓主分享
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1