代码如下:
#include<reg52.h> //头文件
#include <intrins.h> //头文件
#include <string.h> //头文件
#include <stdio.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define nop() _nop_()
#define INBUF_LEN 4 //数据长度
#define _Nop() _nop_() //定义空指令
#define LCD1602_dat P0 //LCD 1602 数据传输IO口
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //IC卡校验地址
sbit LCD1602_rs=P2^5; //LCD1602控制IO口 //I/O 定义
sbit LCD1602_rw=P2^6; //I/O 定义
sbit LCD1602_e=P2^7;
sbit key_1=P3^5; //按键控制IO口
sbit key_2=P3^6; //按键控制IO口
sbit beep=P2^0; //蜂鸣器控制IO口
sbit men=P1^5; //门控制IO口
uchar shu[16]; //IC卡 输入输出暂存数组
uchar RevBuffer[4]; //IC卡序列号暂存数组
uchar state,i; //系统状态标志位,循环变量
uchar data ms,time,time1; //50ms定时计数变量,模式倒计时,报警时间计时
bit ka_flag,js,bj,ok; //检测IC卡标志位,模式操作完成标志位,报警标志位,完成标志位
#include"rc522.c" //RC522标准控制程序
/********************************************************************
* 名称 : delay()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint T)
{
while(T--);
}
/********************************************************************
* 名称 : LCD1602_write(uchar order,dat)
* 功能 : 1602写如数据函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_write(uchar order,dat) //1602 一个字节 处理
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
/********************************************************************
* 名称 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602写入数据函数 指针式
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_writebyte(uchar *prointer) //1602 字符串 处理
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
/********************************************************************
* 名称 : LCD1602_cls()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_cls() //1602 初始化
{
LCD1602_write(0,0x01); //1602 清屏 指令
delay(1500);
LCD1602_write(0,0x38); // 功能设置 8位、5*7点阵
delay(1500);
LCD1602_write(0,0x0c); //设置 光标 不显示开关、不显示光标、字符不闪烁
LCD1602_write(0,0x06);
LCD1602_write(0,0xd0);
delay(1500);
}
/********************************************************************
* 名称 : zuce()
* 功能 : 系统注册模式控制程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void zuce(void) //注册
{
char status;
PcdReset(); //复位
status=PcdRequest(Picc_Reqidl,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
if(status!=MI_OK)
{
bj=0;
ka_flag=0;
return;
} // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#
status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status=PcdSelect(&RevBuffer[0]); //选卡部分
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B
if(status!=MI_OK)
{
ka_flag=0;
return;
}
ka_flag=1;
status=PcdRead(60,&shu[0]); //读取IC卡中的数
shu[0]=66;
status=PcdWrite(60,&shu[0]); //写入IC卡中的数
// time1=0;
if(bj==0)
{
bj=1;
beep=0;
delay(20000);//检测报警
beep=1;
}
ok=1;
}
/********************************************************************
* 名称 : qingchu()
* 功能 : 系统注销模式控制程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void qingchu(void) //清楚卡号
{
char status;
PcdReset(); //复位
status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
if(status!=MI_OK)
{
bj=0;
ka_flag=0;
return;
} // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#
status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status=PcdSelect(&RevBuffer[0]); //选卡部分
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B
if(status!=MI_OK)
{
ka_flag=0;
return;
}
ka_flag=1;
status=PcdRead(60,&shu[0]); //读取IC卡中的数
shu[0]=0;
status=PcdWrite(60,&shu[0]); //写入IC卡中的数
// time1=0;
if(bj==0)
{
bj=1;
beep=0;
delay(20000);
beep=1;
}
ok=1;
}
/********************************************************************
* 名称 : jiance()
* 功能 : 系统检测IC卡模式控制程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void jiance(void) //判断是否开门
{
char status;
PcdReset(); //复位
status=PcdRequest(PICC_REQIDL,&RevBuffer[0]);//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
if(status!=MI_OK)
{
ok=0;
bj=0;
ka_flag=0;
return;
} // http://find.qq.com/index.html?version=1&im_version=5389&width=910&height=610&search_target=0#
status=PcdAnticoll(&RevBuffer[0]);//防冲撞,返回卡的序列号 4字节
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status=PcdSelect(&RevBuffer[0]); //选卡部分
if(status!=MI_OK)
{
ka_flag=0;
return;
}
status = PcdAuthState(0x61,63,DefaultKey,&RevBuffer[0]);// 校验卡密码B
if(status!=MI_OK)
{
ka_flag=0;
return;
}
ka_flag=1;
status=PcdRead(60,&shu[0]); //读取IC卡中的数
if(ok==0)
{
if(shu[0]==66)
{
men=0;
js=1;
ms=0;
time1=5;
}else
{
men=1;
js=0;
ms=0;
time1=2;
}
}
if(bj==0)
{
bj=1;
beep=0;
delay(20000);
beep=1;
}
}
/********************************************************************
* 名称 : key()
* 功能 : 按键控制程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void key()
{
if(!key_1) //判断按键是否按下
{
delay(888); //按键延时去抖
if(!key_1) //在次判断按键是否按下
{
while(!key_1); //按键判断释放
ms=0;
time=2; //执行按键对应的控制内容 切换模式
state=1;
}
}
if(!key_2) //判断按键是否按下
{
delay(888); //按键延时去抖
if(!key_2) //在次判断按键是否按下
{
while(!key_2); //按键判断释放
ms=0;
time=2; //执行按键对应的控制内容 切换模式
state=2;
}
}
}
/********************************************************************
* 名称 : show()
* 功能 : LCD1602 液晶显示函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void show()
{
if(state==0) //模式判断
{
if(time1==0)
{
LCD1602_write(0,0x80); //没有检测到IC卡模式显示内容
LCD1602_writebyte("Please Bush Card");
LCD1602_write(0,0xC0);
LCD1602_writebyte(" () ");
}else
{
LCD1602_write(0,0x80);
if(ka_flag) //
{
LCD1602_writebyte(" ");
for(i=0;i<4;i++) //显示IC卡序列号
{
if(RevBuffer[i]/16<10)
LCD1602_write(1,0x30+RevBuffer[i]/16);
else LCD1602_write(1,0x41+RevBuffer[i]/16-10);
if(RevBuffer[i]%16<10)
LCD1602_write(1,0x30+RevBuffer[i]%16);
else LCD1602_write(1,0x41+RevBuffer[i]%16-10);
}
LCD1602_writebyte(" ");
}
LCD1602_write(0,0xc0); //显示检测到IC卡的状态
if(js==1)
{
LCD1602_writebyte(" Door Open ");
}else
{
LCD1602_writebyte(" Door Close ");
}
}
}else if(state==1) //注册模式LCD1602液晶显示内容
{
LCD1602_write(0,0x80);
LCD1602_writebyte(" Register Mode ");
LCD1602_write(0,0xC0);
LCD1602_writebyte(" (()) ");
}else
{
LCD1602_write(0,0x80); //注销模式LCD1602液晶显示内容
LCD1602_writebyte(" Clear Mode ");
LCD1602_write(0,0xC0);
LCD1602_writebyte(" Bush IC Card ");
}
}
/********************************************************************
* 名称 : main()
* 功能 : 主程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
flag=0; //标志位初始化
TMOD=0x01; //定时器0配置 方式0 定时模式
TH0=0x3c; //定时50ms 赋初值
TL0=0xb0;
EA=1; //打开总中断
TR0=1; //定时器0启动定时
ET0=1; //定时器0中断
LCD1602_cls(); //LCD1602初始化
while(1)
{
show(); //调用显示函数
key(); //调用按键控制程序
switch(state) //根据当前模式选择对应的控制程序
{
case 0:
jiance(); //检测模式
break;
case 1:
zuce(); //注册模式
if(ok==1) state=0;
break;
case 2:
qingchu(); //注销模式
if(ok==1) state=0;
break;
}
}
}
void timer() interrupt 1 /*中断*/
{
TH0=0x3c; //重新赋值
TL0=0xb0;
ms++; //计时变量计时
if(ms==20) //1S定时
{
ms=0; //倒计时
if(time!=0) time--;
else state=0;
if(time1!=0) time1--;
else men=1;
}
}
变量未定义,找找这两个变量在哪