内含有源代码和12864的资料以及程序
这也是朋友给我的资料 最近才看懂
分享给大家
单片机源程序如下:
- #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)
|