|
電路原理圖:
0.jpg (71.81 KB, 下載次數(shù): 156)
下載附件
2018-3-26 03:03 上傳
pcb布線:
0.jpg (84.43 KB, 下載次數(shù): 118)
下載附件
2018-3-26 03:04 上傳
使用說(shuō)明
一、實(shí)現(xiàn)功能:5張卡
1、用戶密碼以及IC卡號(hào)和IC卡刷入序列號(hào),保存到STC12C5A60S2的EEPROM中,掉電數(shù)據(jù)保存功能。
2、支持非接觸式IC卡授權(quán)功能,可連續(xù)授權(quán)(授權(quán)需輸入管理員密碼)。
3、支持手動(dòng)選卡銷卡,支持單卡刷入銷卡,支持注銷所有卡(注銷所有卡需輸入管理員密碼)
4、自動(dòng)識(shí)別非接觸式IC卡功能。如刷授權(quán)過(guò)的IC卡,提示“歡迎光臨”,顯示卡號(hào)并且開(kāi)門(mén),5秒后自動(dòng)關(guān)門(mén)。如果刷未授權(quán)的IC卡,提示“該卡未授權(quán)”,顯示卡號(hào)不開(kāi)門(mén)。
5、如忘記攜帶IC卡,可通過(guò)鍵盤(pán)手動(dòng)輸入用戶密碼。密碼輸入錯(cuò)誤顯示器會(huì)出現(xiàn)錯(cuò)誤提示且繼電器不工作(不開(kāi)門(mén));若密碼輸入正確則繼電器工作(開(kāi)門(mén))。
6、支持手動(dòng)更改用戶密碼(更改用戶密碼需輸入管理員密碼)
7、支持無(wú)卡時(shí)鐘顯示功能(功能:顯示年月日時(shí)分秒周,陰歷,天干地支,生肖,溫度,可改時(shí)間,具有掉電走時(shí)功能)
二、按鍵定義
如圖示:采用4X4鍵盤(pán)輸入,鍵盤(pán)對(duì)應(yīng)名稱如下:
1 2 3 A
4 5 6 B
7 8 9 C
* 0 # D
其中, 【0—9】為數(shù)字鍵,用于輸入相應(yīng)的密碼,
【*】號(hào)鍵為清除所有卡
【A】鍵為返回功能
|->長(zhǎng)按A鍵2秒可調(diào)時(shí)間,此時(shí)按下1鍵為選擇修改項(xiàng),按下2鍵為加,按下3鍵為減,再次長(zhǎng)按A鍵退出時(shí)間修改。
【B】鍵為授權(quán)IC卡功能->提示輸入管理員密碼->輸入管理員密碼->刷入IC卡號(hào)->提示授權(quán)成功->是否繼續(xù)授權(quán)->按A鍵返回
【C】鍵為注銷IC卡功能->提示刷入IC卡號(hào)->提示注銷成功->按A鍵返回
|->或按下#鍵 手動(dòng)選擇卡注銷->按D鍵確認(rèn)并退出
【D】鍵為確認(rèn)功能
【#】號(hào)鍵為手動(dòng)輸入密碼功能->提示輸入密碼->輸入密碼
|->改密碼->提示輸入管理員密碼->輸入管理員密碼->改用戶密碼->輸入用戶密碼->確認(rèn)并再次輸入->修改成功
提示:所有的輸密碼和改密碼功能,輸入三次錯(cuò)誤后則退出輸入或修改功能,輸入或修改失敗。
0.jpg (24.69 KB, 下載次數(shù): 114)
下載附件
2018-3-26 03:02 上傳
單片機(jī)源程序如下:
- /*********************************
- 按鍵分布
- 1 2 3 A
- 4 5 6 B
- 7 8 9 C
- * 0 # D
- 其中, 【0—9】為數(shù)字鍵,用于輸入相應(yīng)的密碼,
- 【*】號(hào)鍵為清除所有卡
- 【A】鍵為返回功能
- 【B】鍵為授權(quán)IC卡功能
- 【C】鍵為注銷IC卡功能
- 【D】鍵為確認(rèn)功能
- 【#】號(hào)鍵為手動(dòng)輸入密碼功能
- 時(shí)鐘功能調(diào)時(shí)說(shuō)明:長(zhǎng)按A鍵2秒可調(diào)時(shí)間,此時(shí)按下1鍵為選擇修改項(xiàng),按下2鍵為加,按下3鍵為減,再次長(zhǎng)按A鍵退出時(shí)間修改
- ********************************************************************************************************/
- #include <stc12c5a60s2.h>
- #include <stdio.h>
- #include "spi.h"
- #include "12864.h"
- #include "eeprom.h"
- #include "mfrc522.h"
- #include "uart.h"
- #include "KEYBOARD.h"
- #include "clock.h"
- #include "ds1302.h"
- #define IAP_ADDRESS1 0x0100 //用戶密碼起始地址
- #define IAP_ADDRESS 0x0200 //IC卡序列號(hào)起始地址
- uchar code administer_key[]={0,0,0,};//管理員卡密碼
- static uchar xdata IC_EEPROM[5][5];//存入EEPROM密碼 每行前4位為卡號(hào) 第5位為卡片輸入順序號(hào)
- static uchar xdata User_len; //用戶密碼長(zhǎng)度
- static uchar xdata Userpassword[16];//用戶密碼
- static uchar xdata ICCODE[4];//返回卡號(hào)4位
- static uchar xdata Rec_Buffer[REC_BUFFER_SIZE];//串口接收緩沖區(qū)
- static uchar xdata RELAY_NUM=0;//開(kāi)門(mén)計(jì)時(shí)變量
- static uchar xdata IC_NUM=0;//刷入卡的順序
- static uchar Recvd_Count;//串口已接收數(shù)據(jù)的個(gè)數(shù)
- bit lock_ok=0;//密碼匹配標(biāo)記
- bit shouquan_flag=0;//授權(quán)標(biāo)記
- bit shoudongshuru_flag=0; //手動(dòng)輸入密碼標(biāo)記
- bit IC_flag=0; //尋卡標(biāo)記
- //bit shanshuo;//較表時(shí)閃爍用
- void io_init()
- {
- //P0M1=0XFF;//開(kāi)漏模式
- //P0M0=0XFF;
- P1M1=0XFF;//P1.7-P1.3開(kāi)漏模式用于RC522;
- P1M0=0XFF;
- P2M1=0X00;//P2.7,P2.0推挽輸出模式
- P2M0=0X81;
- //P3M1=0X00;
- //P3M0=0XFF;
- P4SW=0x70;
- P4M1=0X00;//推挽模式
- P4M0=0XFF;
- }
- /****************************************************
- 函數(shù)名稱:bit Auto_Reader(void)
- 入口參數(shù):無(wú)
- 出口參數(shù):有卡返回0,無(wú)卡返回1
- 功能:尋卡
- 尋卡并在液晶屏上顯示序列號(hào)
- ****************************************************/
- bit Auto_Reader(void)
- {
- uchar temp[4];
- // uchar g_ucTempbuf1[16];
- // uchar code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //初始密碼
- uchar i;
- uchar ID_ASC[8];
- if (MI_OK==PcdRequest(PICC_REQALL,temp))//尋卡,輸出為卡類型//*PICC_REQALL=0x52:尋天線區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的卡 PICC_REQIDL=0x26:只尋未進(jìn)入休眠狀態(tài)的卡
- {
- if (MI_OK==PcdAnticoll(temp))//防沖撞處理,輸出卡片序列號(hào),4字節(jié)
- if (MI_OK==PcdSelect(temp)) //選擇卡片,輸入卡片序列號(hào),4字節(jié)
- //if (MI_OK==PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, temp)) //驗(yàn)證密碼 輸出卡片序列號(hào)
- //if(MI_OK==PcdRead(0, g_ucTempbuf1))//卡中第一塊數(shù)據(jù)內(nèi)容
- {
- IC_flag=1;
- lcd_clear();
- display_GB2312_string(3,1,"IC序列號(hào):");
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- { ICCODE[i]=temp[i];
- if(temp[i]/16>9) ID_ASC[i*2]=temp[i]/16+'7';
- else ID_ASC[i*2]=temp[i]/16+'0';
- if(temp[i]%16>9) ID_ASC[i*2+1]=temp[i]%16+'7';
- else ID_ASC[i*2+1]=temp[i]%16+'0';
- }
- display_GB2312_string(5,1,ID_ASC);
- }
- return 0;
- }
- else
- {
- BELL=0;return 1;
- }
- }
- /****************************************************
- 函數(shù)名稱:bit administer(void)
- 入口參數(shù):無(wú)
- 出口參數(shù):密碼正確返回0,錯(cuò)誤返回1
- 全局變量shouquan_flag :允許授權(quán)shouquan_flag=0; 不允許授權(quán)shouquan_flag=1;
- 功能:管理員
- 驗(yàn)證系統(tǒng)密碼 用于授權(quán)管理、注銷全部卡管理、修改用戶密碼,三次輸入錯(cuò)誤返回
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro(); bit Auto_Reader(void);
- ****************************************************/
- bit administer(void)
- {
- uchar asterisk='*';
- uchar spacing =' ';
- uchar temp=0,error=0,j=0,num=0,i=0,k=0;//
- bit Flag; //比較位置
- unsigned char passwordlength,PLEN; //輸入密碼長(zhǎng)度,實(shí)際密碼長(zhǎng)度
- unsigned char passwordtemp[16]; //最大輸入16個(gè)
- PLEN=sizeof(administer_key)/sizeof(administer_key[0]);//用于計(jì)算出實(shí)際密碼長(zhǎng)度
- display_GB2312_string(1,1,"請(qǐng)輸入管理員密碼");
- while(shouquan_flag==1)
- {
- temp=KeyPro();
- if(temp!=0xff)
- {
- if(i==0) //輸入是第一個(gè)字符的時(shí)候需要把改行清空,方便觀看密碼
- display_GB2312_string(3,1," ");//清除該行
- if((i<16)&&(temp<=9))
- {
- passwordtemp[i]=temp;
- display_GB2312_string(3,i*8+1,&asterisk);//輸入的密碼用"*"代替
- i++; //輸入數(shù)值累加
- }
- if('*'==temp&&i>0)
- {
- i--;
- for(k=i;k<16;k++)
- display_GB2312_string(3,k*8,&spacing);//輸入用空格代替
- }
- if('A'==temp)//退出
- {
- display_GB2312_string(3,1," ");//清除該行
- shouquan_flag=1;
- return 0;
- }
- if(('D'==temp)|| (i==16))//輸入按鍵值D或者密碼輸入到最大值16,表示輸入結(jié)束,需要進(jìn)行比對(duì)
- {
- passwordlength=i; //計(jì)算輸入密碼長(zhǎng)度
- i=0; //計(jì)數(shù)器復(fù)位
- if(passwordlength==PLEN)//長(zhǎng)度相等則比較,否則直接輸出錯(cuò)誤
- {
- Flag=1;//先把比較位置1
-
- for(j=0;j<PLEN;j++)//循環(huán)比較8個(gè)數(shù)值,如果有一個(gè)不等 則最終Flag值為0
- Flag=Flag&&(passwordtemp[j]==administer_key[j]);//比較輸入值和已有密碼
- }
- if(Flag)//如果比較全部相同,標(biāo)志位置1
- {
- pass();
- lcd_clear();
- error=0;//輸入正確則次數(shù)清零,重新計(jì)數(shù)
- Flag=0; //清除正確標(biāo)志
- shouquan_flag=0;
- return 0;
- }
- else
- {
- display_GB2312_string(3,1," ");//清除該行
- display_GB2312_string(3,1,"Wrong! Retry!");//密碼錯(cuò)誤,提示重新輸入
- error++;//連續(xù)輸入錯(cuò)誤,則次數(shù)累加
- if(error==3)
- {
- display_GB2312_string(3,1," ");//清除該行
- display_GB2312_string(3,1,"Wrong 3 times!");//密碼錯(cuò)誤,提示重新輸入
- delayms(1500);
- shouquan_flag=1;
- return 0;
- //while(1);//停止該位置,重啟電源后才能輸入,實(shí)際實(shí)用中則需要等到一定時(shí)間后才能再次輸入。
- }
- }
- }
- }
- }
- }
- /****************************************************
- 函數(shù)名稱:void shouquan(uchar key)
- 入口參數(shù):key->按鍵值
- 出口參數(shù):無(wú)
- 功能:授權(quán)
- 按下B鍵進(jìn)入授權(quán)
- 流程->提示輸入系統(tǒng)密碼->輸入系統(tǒng)密碼->刷入IC卡號(hào)->提示是否繼續(xù)授權(quán)->按A鍵返回 (授權(quán)期間均可按A鍵返回)
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro(); bit administer(); bit Auto_Reader(void);
- ****************************************************/
- void shouquan(uchar key)
- {
- uchar j=0,k=0,flag,flag1;
- if(key=='B')//授權(quán)檢測(cè)
- {
- lcd_clear();
- //Sent_Byte(IC_NUM);
- shouquan_flag=1;
- while(administer()); //管理員返回0,密碼正確shouquan_flag=0
- display_GB2312_string(1,1,"請(qǐng)刷入授權(quán)IC卡號(hào)");//密碼正確顯示的信息
- if(IC_EEPROM[4][4]==5&&(shouquan_flag==0))//如果最后一位不是0XFF說(shuō)明有卡刷入
- {
- display_GB2312_string(1,1,"IC卡超出5張請(qǐng)按C");
- display_GB2312_string(3,1,"IC卡超出5張請(qǐng)按*");
- shouquan_flag=1;
- delayms(2000);
- }
- else if(shouquan_flag==0) //刷卡授權(quán)
- {
- flag1=1;
- while(IC_NUM<5&&flag1==1)
- {
- flag=1;
- while(flag) //刷入卡號(hào),正確返回0,退出 并在LCD顯示
- {
- flag=Auto_Reader();
- if('A'==KeyPro())//退出
- {
- flag=1;
- flag1=0;
- break;
- }
- }
- if(flag==0)
- {
- //delayms(1000);
- IC_NUM++;
- for(j=0;j<5;j++)
- {
- if(j<4)IC_EEPROM[IC_NUM-1][j]=ICCODE[j];//卡號(hào)
- else IC_EEPROM[IC_NUM-1][j]=IC_NUM;//刷入的順序
- //Sent_Byte(IC_EEPROM[IC_NUM-1][j]);
- }
- IapEraseSector(IAP_ADDRESS);//清除數(shù)據(jù)
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫(xiě)入數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- pass();
- if(IC_NUM<5)
- {
- delayms(1000);
- lcd_clear();
- display_GB2312_string(1,1,"IC卡授權(quán)成功 ");
- display_GB2312_string(3,1,"是否繼續(xù)刷入 ");
- display_GB2312_string(5,1,"繼續(xù)請(qǐng)刷卡 ");
- display_GB2312_string(7,1,"停止請(qǐng)按’A‘鍵 ");
- }
- else
- {
- delayms(1000);
- lcd_clear();
- display_GB2312_string(1,1,"IC卡存儲(chǔ)到5張 ");
- delayms(2000);
- }
- }
- }
- }
- }
- }
- /****************************************************
- 函數(shù)名稱:void zhuxiao_all(uchar key)
- 入口參數(shù):key->按鍵值
- 出口參數(shù):無(wú)
- 功能:注銷所有IC卡
- 按下*鍵為注銷IC卡功能->提示輸入系統(tǒng)密碼->輸入系統(tǒng)密碼->確定注銷全部卡->注銷成功->自動(dòng)返回 (注銷期間均可按A鍵返回)
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro(); administer();
- ****************************************************/
- void zhuxiao_all(uchar key)
- {
- uchar j,k;
- if(key=='*')
- {
- lcd_clear();
- shouquan_flag=1;
- while(administer()); //管理員返回0,密碼正確shouquan_flag=0
- key=0xff;
- while(key!='*'&&shouquan_flag==0)
- {
- if(key=='A') break;
- key=KeyPro();
- display_GB2312_string(1,1,"是否注銷所有IC卡");
- display_GB2312_string(3,1,"確定請(qǐng)按'*'號(hào)鍵");
- }
- if(shouquan_flag==0&&key=='*')
- { lcd_clear();
- IC_NUM=0;
- pass();
- display_GB2312_string(1,1,"注銷所有IC卡 ");
- delayms(1000);
- IapEraseSector(IAP_ADDRESS);//清除數(shù)據(jù)
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//4列
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*4+k);//讀出數(shù)據(jù)
- display_GB2312_string(1,1,"注銷成功 ");
- delayms(1000);
- }
- }
- }
- /****************************************************
- 函數(shù)名稱:void shoudong_zhuxiao_one(uchar key)
- 入口參數(shù):key->按鍵值
- 出口參數(shù):無(wú)
- 功能:手動(dòng)注銷單張IC卡
- 按#號(hào)鍵手動(dòng)銷卡
- 流程->提示按下對(duì)應(yīng)刷入的卡順序號(hào)->按下1-5按鍵選擇對(duì)應(yīng)卡->提示確認(rèn)注銷按相應(yīng)按鍵->按D鍵確認(rèn)并返回 (期間按A鍵不可退出手動(dòng)銷卡模式)
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro();
- ****************************************************/
- void shoudong_zhuxiao_one(uchar key)
- {
- uchar key2,j,k,v,i;
- uchar ID_ASC[9]={1,1,};
- if(key=='#')
- {
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- lcd_clear();
- key2=0xff;
- display_GB2312_string(1,1,"按對(duì)應(yīng)順序號(hào)銷卡");
- while(key2!='D')//確認(rèn)
- {
- display_GB2312_string(3,1,"確認(rèn)并退出請(qǐng)按D");
- key2=KeyPro();
- if(key2==1)
- {
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- {
- if(IC_EEPROM[0][i]/16>9) ID_ASC[i*2]=IC_EEPROM[0][i]/16+'7';
- else ID_ASC[i*2]=IC_EEPROM[0][i]/16+'0';
- if(IC_EEPROM[0][i]%16>9) ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'7';
- else ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'0';
- }
- //Sent_Buffer(ID_ASC,8);
- display_GB2312_string(5,1,ID_ASC);
- display_GB2312_string(7,1,"注銷按1,返回按A ");
- key2=0xff;
- while(key2!=1)
- {
- key2=KeyPro();
- if(key2=='A')break;//退出
- }
- pass();
- if(key2==1)for(j=0;j<5;j++)IC_EEPROM[0][j]=0xff;
- }
- else if(key2==2)
- {
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- {
- if(IC_EEPROM[1][i]/16>9) ID_ASC[i*2]=IC_EEPROM[1][i]/16+'7';
- else ID_ASC[i*2]=IC_EEPROM[1][i]/16+'0';
- if(IC_EEPROM[1][i]%16>9) ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'7';
- else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
- }
- //Sent_Buffer(ID_ASC,8);
- display_GB2312_string(5,1,ID_ASC);
- display_GB2312_string(7,1,"注銷按2,返回按A ");
- key2=0xff;
- while(key2!=2)
- {
- key2=KeyPro();
- if(key2=='A')break;//退出
- }
- pass();
- if(key2==2)for(j=0;j<5;j++)IC_EEPROM[1][j]=0xff;
- }
- else if(key2==3)
- {
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- {
- if(IC_EEPROM[2][i]/16>9) ID_ASC[i*2]=IC_EEPROM[2][i]/16+'7';
- else ID_ASC[i*2]=IC_EEPROM[2][i]/16+'0';
- if(IC_EEPROM[2][i]%16>9) ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'7';
- else ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'0';
- }
- //Sent_Buffer(ID_ASC,8);
- display_GB2312_string(5,1,ID_ASC);
- display_GB2312_string(7,1,"注銷按3,返回按A ");
- key2=0xff;
- while(key2!=3)
- {
- key2=KeyPro();
- if(key2=='A')break;//退出
- }
- pass();
- if(key2==3)for(j=0;j<5;j++)IC_EEPROM[2][j]=0xff;
- }
- else if(key2==4)
- {
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- {
- if(IC_EEPROM[3][i]/16>9) ID_ASC[i*2]=IC_EEPROM[3][i]/16+'7';
- else ID_ASC[i*2]=IC_EEPROM[3][i]/16+'0';
- if(IC_EEPROM[3][i]%16>9) ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'7';
- else ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'0';
- }
- //Sent_Buffer(ID_ASC,8);
- display_GB2312_string(5,1,ID_ASC);
- display_GB2312_string(7,1,"注銷按4,返回按A ");
- key2=0xff;
- while(key2!=4)
- {
- key2=KeyPro();
- if(key2=='A')break;//退出
- }
- pass();
- if(key2==4)for(j=0;j<5;j++)IC_EEPROM[3][j]=0xff;
- }
- else if(key2==5)
- {
- for(i=0;i<4;i++) //卡ID號(hào)轉(zhuǎn)化成ASCII
- {
- if(IC_EEPROM[4][i]/16>9) ID_ASC[i*2]=IC_EEPROM[4][i]/16+'7';
- else ID_ASC[i*2]=IC_EEPROM[4][i]/16+'0';
- if(IC_EEPROM[4][i]%16>9) ID_ASC[i*2+1]=IC_EEPROM[4][i]%16+'7';
- else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
- }
- //Sent_Buffer(ID_ASC,8);
- display_GB2312_string(5,1,ID_ASC);
- display_GB2312_string(7,1,"注銷按5,返回按A ");
- key2=0xff;
- while(key2!=5)
- {
- key2=KeyPro();
- if(key2=='A')break;//退出
- }
- pass();
- if(key2==5)for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;
- }
- display_GB2312_string(5,1," ");
- display_GB2312_string(7,1," ");
- }
- for(v=0,j=0;j<5;j++)//得到刷入的卡順序號(hào)
- {
- if(0xff!=IC_EEPROM[j][4])
- {
- for(k=0;k<5;k++)
- {
- IC_EEPROM[v][k]=IC_EEPROM[j][k];//重新排列卡號(hào)
- //Sent_Byte(IC_EEPROM[v][k]);
- }
- v++;
- }
- }
- IC_NUM=v;//Sent_Byte(IC_NUM);
- for(j=0;j<5;j++)
- for(k=0;k<5;k++)
- {
- if(j>=IC_NUM)IC_EEPROM[j][k]=0XFF;
- else IC_EEPROM[j][4]=j+1;
- }
- IapEraseSector(IAP_ADDRESS);//清除數(shù)據(jù)
- delayms(10);
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫(xiě)入數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- delayms(10);
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- pass();
- }
- }
- /****************************************************
- 函數(shù)名稱:void zhuxiao_one(uchar key)
- 入口參數(shù):key->按鍵值
- 出口參數(shù):無(wú)
- 功能:持卡或手動(dòng)注銷單張IC卡
- 按下C鍵進(jìn)入持卡或手動(dòng)注銷單張IC卡
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro(); shoudong_zhuxiao_one();
- ****************************************************/
- void zhuxiao_one(uchar key)
- {
- uchar i,j,k,ok,flag,m=0,key1;
- if(key=='C')
- {
- // while(administer()); //管理員返回0,密碼正確shouquan_flag=0
- lcd_clear();
- display_GB2312_string(1,1," 刷入注銷卡 ");
- display_GB2312_string(3,1,"或按#鍵手動(dòng)注銷 ");
- flag=1;
- key1=0xff;
- while(flag==1&&key1!='A'&&key1!='#') //刷入卡號(hào),正確返回0,退出 并在LCD顯示
- {
- flag=Auto_Reader();
- key1=KeyPro();
- if('A'==key1&&key1=='#')//退出
- {
- flag=1;
- break;
- }
- }
- if(key1=='#')
- {
- shoudong_zhuxiao_one(key1);
- key1=0xff;
- }
- if(flag==0)//刷卡標(biāo)記
- {
- //IC_flag=0;
- for(j=0;j<5;j++)//5行///比較刷入的是哪張卡
- {
- ok=1;
- for(k=0;k<4;k++)//4列
- {
- ok=ok&&(IC_EEPROM[j][k]==ICCODE[k]);
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- if(ok==1)
- {
- ok=0;
- m=IC_EEPROM[j][4]+0X30;
- display_GB2312_string(7,1,"注銷卡序列號(hào): ");
- display_GB2312_string(7,105,&m);
- pass();
- delayms(1000);
- m=IC_EEPROM[j][4];
- //Sent_Byte(n);
- break;
- //goto addr1;
- }
- }
- //addr1:
- if(ok==0) //重新排列對(duì)齊數(shù)據(jù)
- {
- ok=1;
- i=0;
- //Sent_Byte(n);
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- if(m==5)//如果是最后一張卡直接替換最后一個(gè)數(shù)據(jù) 前4個(gè)不用移位
- for(j=0;j<5;j++)
- IC_EEPROM[4][j]=0xff;//最后一個(gè)數(shù)據(jù)補(bǔ)oxff
- else //不是最后一個(gè)卡 則進(jìn)行數(shù)據(jù)移位
- {
- for(j=0;j<5;j++)//得到刷入的卡順序號(hào)
- {
- if(m==IC_EEPROM[j][4])i+=1;
- for(k=0;k<5;k++)
- {
- IC_EEPROM[j][k]=IC_EEPROM[i][k];//重新排列卡號(hào)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- i++;
- }
- for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;//最后一個(gè)數(shù)據(jù)補(bǔ)oxff
- ok=1;
- for(j=0;j<5;j++)
- {
- ok=1;
- for(k=0;k<4;k++)
- ok=ok&&(IC_EEPROM[j][k]==0xff);
- if(ok==1) IC_NUM=IC_EEPROM[j][4]=0xff;//無(wú)數(shù)據(jù)的存儲(chǔ)地址卡序號(hào)初始為0xff
- else IC_NUM=IC_EEPROM[j][4]=j+1;
- }
- }
- IapEraseSector(IAP_ADDRESS);//清除數(shù)據(jù)
- delayms(10);
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫(xiě)入數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- delayms(10);
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//5列
- {
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數(shù)據(jù)
- //Sent_Byte(IC_EEPROM[j][k]);
- }
- for(j=0;j<5;j++)
- if(IC_EEPROM[j][4]!=0xff) IC_NUM=IC_EEPROM[j][4];//讀出卡刷入順序
- if(IC_NUM==0xff)IC_NUM=0;
- //Sent_Byte(IC_NUM);
- }
- }
- }
- }
- /****************************************************
- 函數(shù)名稱:bit shudongshuru(uchar key)
- 入口參數(shù):key->按鍵值
- 出口參數(shù):正確返回0,錯(cuò)誤返回1
- 功能:手動(dòng)輸入用戶密碼、可改用戶密碼
- 按#鍵手動(dòng)輸入密碼 *鍵后退清除一位 D鍵確定 A鍵退出 改用戶密碼時(shí)按B鍵授權(quán)后 方可更改
- 調(diào)用函數(shù):EEPROM.C 12864.c KeyPro();
- ***************************************************/
- bit shudongshuru(uchar key)
- {
- uchar asteris='*';
- uchar spacin =' ';
- uchar key2=0,error=0,j=0,num=0,i=0,k=0,n=0;
- bit Flag; //比較相等標(biāo)記
- unsigned char passwordlength; //輸入密碼長(zhǎng)度,實(shí)際密碼長(zhǎng)度
- unsigned char passwordtemp[16]; //最大輸入16個(gè)
- unsigned char passwordlast[16];
- if(key=='#')
- {
- lcd_clear();
- display_GB2312_string(1,1," 請(qǐng)輸入密碼 ");
- display_GB2312_string(3,1,"或按B授權(quán)改密碼 ");
- shoudongshuru_flag=1;
- while(shoudongshuru_flag==1)
- {
- key2=KeyPro();
- if(key2=='A') return 1;
- if(key2!=0xff)
- {
- if(i==0) //輸入是第一個(gè)字符的時(shí)候需要把改行清空,方便觀看密碼
- display_GB2312_string(5,1," ");//清除該行
- if((i<16)&&(key2<=9))
- {
- passwordtemp[i]=key2;
- // Sent_Byte(key2);
- //display_graphic_5x7(5,i*8+1,xing);//輸入的密碼用"*"代替
- display_GB2312_string(5,i*8+1,&asteris);//輸入的密碼用"*"代替
- i++; //輸入數(shù)值累加
- }
- if('*'==key2&&i>0)
- {
- i--;
- for(k=i;k<16;k++)
- display_GB2312_string(5,k*8,&spacin);//輸入用空格代替
- }
- if('A'==key2)//退出
- {
- lcd_clear();
- shoudongshuru_flag=0;
- return 0;
- }
- if(('D'==key2)|| (i==16))//輸入按鍵值15或者密碼輸入到最大值16,表示輸入結(jié)束,需要進(jìn)行比對(duì)
- {
- passwordlength=i; //計(jì)算輸入密碼長(zhǎng)度
- if(passwordlength==User_len)//長(zhǎng)度相等則比較,否則直接輸出錯(cuò)誤
- {
- Flag=1;//先把比較位置1
- for(j=0;j<User_len;j++)//循環(huán)比較數(shù)值,如果有一個(gè)不等 則最終Flag值為0
- {
- Flag=Flag&&(passwordtemp[j]==Userpassword[j]);//比較輸入值和已有密碼
- }
- }
- i=0; //計(jì)數(shù)器復(fù)位
- if(Flag)//如果比較全部相同,標(biāo)志位置1
- {
- pass();
- display_GB2312_string(5,1," ");//清除該行
- TR0=1;
- RELAY=0;
- error=0;//輸入正確則次數(shù)清零,重新計(jì)數(shù)
- Flag=0; //清除正確標(biāo)志
- shoudongshuru_flag=1;
- return 0;
- }
- else
- {
- display_GB2312_string(5,1," ");//清除該行
- display_GB2312_string(5,1,"Wrong! Retry! ");//密碼錯(cuò)誤,提示重新輸入
- error++;//連續(xù)輸入錯(cuò)誤,則次數(shù)累加
- if(error==3)
- {
- error=0;
- lcd_clear();
- display_GB2312_string(5,1,"禁止入內(nèi) ");//密碼錯(cuò)誤,提示重新輸入
- delayms(1500);
- shoudongshuru_flag=0;
- return 1;
- }
- }
- }
- if(key2=='B') //授權(quán)修改用戶密碼
- {
- shouquan_flag=1;
- lcd_clear();
- while(administer()) //管理員返回0,密碼正確shouquan_flag=0
- {
- if(KeyPro()=='A')
- {
- shoudongshuru_flag=0;
- return 1;
- }
- }
- if(shouquan_flag==0)display_GB2312_string(1,1," 請(qǐng)輸入新密碼 ");//管理員密碼正確后的提示
- if(shouquan_flag==1)//管理員密碼錯(cuò)誤,或退出管理員時(shí)的提示
- {
- display_GB2312_string(1,1," 請(qǐng)輸入密碼 ");
- display_GB2312_string(3,1,"或按B授權(quán)改密碼 ");
- }
- num=0;//輸入次數(shù)計(jì)數(shù)清零
- n=0; //輸入密碼長(zhǎng)度計(jì)數(shù)清零
- while(shouquan_flag==0)//管理員密碼正確進(jìn)入密碼修改
- {
- key2=KeyPro();
- if(key2=='A')return 1;
- if(key2!=0xff)
- {
- if(n==0&&num==0)//第一次輸入并且是第一位密碼
- {
- display_GB2312_string(1,1," 請(qǐng)輸入新密碼 ");
- display_GB2312_string(3,1," ");
- }
- if((n<16)&&(key2<=9))//按鍵為1-9 且密碼長(zhǎng)度小于16位
- {
- passwordtemp[n]=key2;
- Sent_Byte(key2);
- display_GB2312_string(3,n*8+1,&asteris);//輸入的密碼用"*"代替
- n++; //輸入數(shù)值累加
- }
- if('*'==key2&&n>0)//清除、后退一位
- {
- n--;
- for(k=n;k<16;k++)
- display_GB2312_string(3,k*8,&spacin);//輸入用空格代替
- }
- if(('D'==key2)||(n==16))//輸入按鍵值D或者密碼輸入到最大值16,表示輸入結(jié)束,需要進(jìn)行比對(duì)
- {
- if(num==0) //第一次輸入密碼
- {
- passwordlength=n; //計(jì)算輸入密碼長(zhǎng)度
- for(n=0;n<passwordlength;n++)//暫時(shí)存儲(chǔ)
- {
- passwordlast[n]=passwordtemp[n];//轉(zhuǎn)存密碼
- passwordtemp[n]=0;//清空當(dāng)前
- }
- n=0;//計(jì)數(shù)器復(fù)位
- display_GB2312_string(1,1," 請(qǐng)?jiān)俅屋斎朊艽a ");
- display_GB2312_string(3,1," ");//清除
- num++;
- }
- else if(passwordlength==n&&num==1)//第二次輸入密碼 長(zhǎng)度相等則比較,否則直接輸出錯(cuò)誤
- {
- Flag=1;//先把比較位置1
- for(j=0;j<passwordlength;j++)//循環(huán)比較數(shù)值,如果有一個(gè)不等 則最終Flag值為0
- Flag=Flag&&(passwordlast[j]==passwordtemp[j]);//比較上次輸入值和現(xiàn)在密碼是否一樣
- if(Flag==1)
- {
- //pass();
- num=0;
- shouquan_flag=0;
- IapEraseSector(IAP_ADDRESS1); //清除
- delayms(10);
- IapProgramByte(IAP_ADDRESS1,n);//寫(xiě)入密碼個(gè)數(shù)
- for(n=1;n<=passwordlength;n++)//存儲(chǔ)
- {
- IapProgramByte(IAP_ADDRESS1+n,passwordtemp[n-1]);//寫(xiě)入密碼
- Sent_Byte(passwordtemp[n-1]);
- }
- delayms(10);
- User_len=IapReadByte(IAP_ADDRESS1);//讀取密碼個(gè)數(shù)
- Sent_Byte(User_len);
- for(n=1;n<=User_len;n++)
- {
- Userpassword[n-1]=IapReadByte(IAP_ADDRESS1+n); //讀取 密碼
- Sent_Byte(Userpassword[n-1]);
- }
- n=0;
- display_GB2312_string(1,1," 修改密碼成功 ");
- delayms(1500);
- num=0;
- return 0;
- }
- else if(Flag==0)
- {
- display_GB2312_string(3,1," 請(qǐng)重新輸入 ");//清除
- display_GB2312_string(1,1," 兩次輸入不同 ");//清除該行
- num=0;
- n=0;
- error++;//連續(xù)輸入錯(cuò)誤,則次數(shù)累加
- if(error==3)
- {
- display_GB2312_string(3,1," ");//清除
- display_GB2312_string(1,1,"錯(cuò)誤3次,修改失敗");//密碼錯(cuò)誤,返回界面
- delayms(1500);
- shouquan_flag=1;
- return 1;
- //while(1);//停止該位置,重啟電源后才能輸入,實(shí)際實(shí)用中則需要等到一定時(shí)間后才能再次輸入。
- }
- }
- }
- else if(num==1)
- {
- display_GB2312_string(3,1," 請(qǐng)重新輸入 ");//清除
- display_GB2312_string(1,1," 兩次輸入不同 ");//清除該行
- num=0;
- n=0;
- error++;//連續(xù)輸入錯(cuò)誤,則次數(shù)累加
- if(error==3)
- {
- display_GB2312_string(3,1," ");//清除
- display_GB2312_string(1,1,"錯(cuò)誤3次,修改失敗");//密碼錯(cuò)誤,返回界面
- delayms(1500);
- shouquan_flag=1;
- return 1;
- //while(1);//停止該位置,重啟電源后才能輸入,實(shí)際實(shí)用中則需要等到一定時(shí)間后才能再次輸入。
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- /****************************************************
- 函數(shù)名稱:Timer0Init(void)
- 入口參數(shù):無(wú)
- 出口參數(shù):無(wú)
- 功能: 用于定時(shí)關(guān)閉門(mén)
- 調(diào)用函數(shù):無(wú)
- ****************************************************/
- void Timer0Init(void) //50毫秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0xF0; //設(shè)置定時(shí)器模式
- TMOD |= 0x01; //設(shè)置定時(shí)器模式
- TL0 = 0x00; //設(shè)置定時(shí)初值
- TH0 = 0x4C; //設(shè)置定時(shí)初值
- TF0 = 0; //清除TF0標(biāo)志
- ET0 = 1; //允許定時(shí)器0中斷
- TR0 = 0; //定時(shí)器0開(kāi)始計(jì)時(shí)
- }
- void Timer1Init(void) //50毫秒@11.0592MHz
- {
- AUXR &= 0xBF; //定時(shí)器時(shí)鐘12T模式
- TMOD &= 0x0F; //設(shè)置定時(shí)器模式
- TMOD |= 0x10; //設(shè)置定時(shí)器模式
- TL1 = 0x00; //設(shè)置定時(shí)初值
- TH1 = 0x4C; //設(shè)置定時(shí)初值
- TF1 = 0; //清除TF1標(biāo)志
- ET1 = 1; //允許定時(shí)器0中斷
- TR1 = 0; //定時(shí)器1開(kāi)始計(jì)時(shí)
- }
- /****************************************************
- 函數(shù)名稱:主函數(shù)
- ****************************************************/
- main()
- {
- uchar key,j=0,k=0,n,i,sel=0;
- unsigned long int display_data=0;
- BELL=0;//關(guān)閉
- RELAY=1;
- io_init();//初始化引腳
- UART_Init();//初始化UART通訊
- rom_cs=1;
- lcd_init();//初始化液晶屏
- init_spi();//初始化SPI通訊
- Timer0Init();//初始化定時(shí)器0關(guān)門(mén)用
- Timer1Init();//初始化定時(shí)器1時(shí)鐘閃爍用
- Ds1302_Init();
- EA =1; //單片機(jī)中斷允許
- //IapEraseSector(IAP_ADDRESS);//清除數(shù)據(jù) 卡數(shù)據(jù)
- //IapEraseSector(IAP_ADDRESS1);//清除數(shù)據(jù) 用戶密碼
- for(j=0;j<5;j++)//5行
- for(k=0;k<5;k++)//4列
- IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數(shù)據(jù)
- for(j=0;j<5;j++)
- if(IC_EEPROM[j][4]!=0xff) IC_NUM=IC_EEPROM[j][4];//讀出卡刷入順序
- User_len=IapReadByte(IAP_ADDRESS1);//讀取用戶密碼個(gè)數(shù)
- //Sent_Byte(User_len);
- if(User_len==0xff)User_len=6;//初始化用戶密碼長(zhǎng)度6位
- //Sent_Byte(User_len);
- for(k=1;k<=User_len;k++) //讀取用戶密碼
- {
- i=IapReadByte(IAP_ADDRESS1+k); //讀取用戶密碼
- if(i==0xff)Userpassword[k-1]=0;//初始話用戶密碼為000000
- else Userpassword[k-1]=i;
- }
- // for(j=0;j<6;j++)Sent_Byte(Userpassword[j]);
- PcdReset(); //初始化射頻芯片
- PcdAntennaOff();
- PcdAntennaOn();
- delayms(100);
- PcdReset();//復(fù)位芯片,打開(kāi)天線
- PcdAntennaOff();
- PcdAntennaOn();
- //M500PcdConfigISOType( 'A' );//設(shè)置RC632的工作方式
- //Delay_ms(100);
- lcd_clear();
- while(1)
- {
- key=KeyPro();//按鍵檢測(cè)
- if(key!=0xff)
- {
- IC:if(key=='#')shudongshuru(key);//手動(dòng)輸入密碼
- if(key=='C')zhuxiao_one(key);//注銷單張卡 持卡注銷
- if(key=='*')zhuxiao_all(key);//注銷所有卡
- if(key=='B')shouquan(key);//授權(quán)卡
- IC_flag=0;
- lcd_clear();
- }
- Auto_Reader();
- if(IC_flag==1)//刷卡標(biāo)記
- {
- display_GB2312_string(1,1," 歡迎光臨 ! ");
- IC_flag=0;
- //for(n=0;n<4;n++)Sent_Byte(ICCODE[n]);
- for(j=0;j<5;j++)//5行
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
代碼.rar
(197.69 KB, 下載次數(shù): 516)
2018-3-25 14:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
RFID.pdf
(626.12 KB, 下載次數(shù): 325)
2018-3-25 14:44 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|