标题:
关于RC522制作的刷卡加密码门禁系统源码资料
[打印本页]
作者:
赛哥哥
时间:
2017-7-27 13:39
标题:
关于RC522制作的刷卡加密码门禁系统源码资料
内含有源代码和12864的资料以及程序
这也是朋友给我的资料 最近才看懂
分享给大家
0.png
(29.27 KB, 下载次数: 75)
下载附件
2017-7-27 18:09 上传
单片机源程序如下:
#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; //数据信号
sbit SCLK=P3^4; //时钟信号
sbit RST=P3^3; //复位信号
/********************************************************************
* 名称 : delay()
* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
* 输入 : t
* 输出 : 无
***********************************************************************/
void delay(unsigned int t) //延时函数
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : zdata
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char zdata) // 向lcd写一个字节
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80) //一位一位的发送过去
{
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写数据的函数 其中调用了 写字节函数
{
CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
/********************************************************************
* 名称 : lcdinit()
* 功能 : 初始化函数
* 输入 : 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写一个字符串 函数调用了 写数据函数
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
/********************************************************************
* 名称 : Test()
* 功能 : 显示子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Test() // 开机的一个显示函数
{
write_com(0x03);
delay(50);
write_com(0x81);
hzkdis("13级 杨向鹏");
write_com(0x92);
hzkdis("毕业设计");
write_com(0x89);
hzkdis("电子门禁系统");
write_com(0x9a);
hzkdis("请刷卡");
}
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
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}; // 对应的按键值 对应的密码为123456
bit CmdValid;
sbit PWM = P3^6; //控制舵机的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 ) //延时函数
{
unsigned char a,b;
for(;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void iccardcode() //这是ic卡的读取函数
{
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;
}
}
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem() //初始化 中断函数 包括串口中断和外部中断 串口是用来读取ic信息发送给上位机的
{
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; // 波特率发生器
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做延时子程序
/////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1// 串口中断 上位机使用 实际中没有用处 读取ic卡信息时使用
{
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) //矩阵键盘的检测函数
{
char a = 0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms(1);//延时10ms进行消抖
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(); //分析数据
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) //按下一个按键显示一个“*”
{
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) //密码不小心数错了 删除“*” 重新输入
{
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控制舵机开门 当屏幕出现********** 然后依次减少 最后开门时间到舵机回位 门会再次上锁
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; //关闭PWM中断 节约电量
Test();
z = 0;
}
else
{
write_com(0x03);
delay(50);
write_com(0x99);
hzkdis("密码错误");
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
RC522资料.7z
(635.37 KB, 下载次数: 173)
2017-7-27 13:38 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
jubaolun
时间:
2017-7-31 12:40
谢谢分享,学习了
作者:
adminre
时间:
2019-4-1 01:03
感谢
作者:
suph007
时间:
2019-5-12 10:58
正在需要此内容啊 ,感谢分享
作者:
suph007
时间:
2019-5-12 10:59
感谢楼主分享使用
作者:
黎明zERo
时间:
2019-12-27 17:10
感谢楼主分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1