|
內(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; //時鐘信號
- sbit RST=P3^3; //復(fù)位信號
-
- /********************************************************************
- * 名稱 : delay()
- * 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。
- * 輸入 : t
- * 輸出 : 無
- ***********************************************************************/
- void delay(unsigned int t) //延時函數(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寫一個字節(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寫一個字符串 函數(shù)調(diào)用了 寫數(shù)據(jù)函數(shù)
- {
- while(*s > 0)
- {
- write_data(*s);
- s++;
- delay(50);
- }
- }
- /********************************************************************
- * 名稱 : Test()
- * 功能 : 顯示子函數(shù)
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void Test() // 開機(jī)的一個顯示函數(shù)
- {
- write_com(0x03);
- delay(50);
- write_com(0x81);
- hzkdis("13級 楊向鵬");
- write_com(0x92);
- hzkdis("畢業(yè)設(shè)計");
- 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ù)
- {
- 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做延時子程序
- /////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////
- // 接收和發(fā)送中斷
- ///////////////////////////////////////////////////////////////////////
- void isr_UART(void) interrupt 4 using 1// 串口中斷 上位機(jī)使用 實際中沒有用處 讀取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) //矩陣鍵盤的檢測函數(shù)
- {
- char a = 0;
- GPIO_KEY=0x0f;
- if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
- {
- Delay10ms(1);//延時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) //按下一個按鍵顯示一個“*”
- {
- 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ù)錯了 刪除“*” 重新輸入
- {
- 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)********** 然后依次減少 最后開門時間到舵機(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("密碼錯誤");
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
RC522資料.7z
(635.37 KB, 下載次數(shù): 173)
2017-7-27 13:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|