|
最近做了個(gè)基于51單片機(jī)的模擬門(mén)禁的DIY小作品。工作原理大致是:當(dāng)IC卡放在讀卡器可以識(shí)別的范圍內(nèi)時(shí),讀卡器讀取信息傳給單片機(jī)進(jìn)行處理,如果識(shí)別為有效卡則繼電器閉合(模擬門(mén)鎖打開(kāi)),開(kāi)門(mén)指示燈亮,12864液晶上會(huì)進(jìn)行簡(jiǎn)單的提示表示刷卡成功等。如果該卡為無(wú)效卡則報(bào)警指示燈亮,蜂鳴器報(bào)警,同時(shí)可以通過(guò)按鍵進(jìn)行時(shí)間的設(shè)置以及對(duì)IC卡進(jìn)行注冊(cè)和注銷(xiāo)。。。總之自己也是一個(gè)小菜雞,這個(gè)小作品也是一個(gè)很簡(jiǎn)單的設(shè)計(jì),也沒(méi)有什么創(chuàng)新的地方,主要是自己獨(dú)立的找資料,動(dòng)手DIY的。板子上一個(gè)485模塊電路,本來(lái)打算是想通過(guò)MODBUS協(xié)議和MCGS進(jìn)行通信的,最后數(shù)據(jù)也沒(méi)有傳上去(可以在組態(tài)上發(fā)命令,但無(wú)法把下位機(jī)數(shù)據(jù)傳上去),所以這一部分功能擱淺了,希望有大神可以試一下單片機(jī)與MCGS的通訊,比如把實(shí)時(shí)溫度顯示在MCGS組態(tài)界面上。附上完整的PCB和程序
制作出來(lái)的實(shí)物圖如下:
HP~8IZ_XQ`SEAV}5`18Z[L3.png (246.91 KB, 下載次數(shù): 108)
下載附件
功能演示
2018-6-5 12:04 上傳
BGQC1}4EYLGLJN)D9CS$_BK.png (477.84 KB, 下載次數(shù): 118)
下載附件
實(shí)物
2018-6-5 12:03 上傳
Altium Designer畫(huà)的單片機(jī)RFID模擬門(mén)禁系統(tǒng)電路原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (66.96 KB, 下載次數(shù): 124)
下載附件
2018-6-5 18:39 上傳
0.png (83.55 KB, 下載次數(shù): 132)
下載附件
2018-6-5 18:39 上傳
0.png (5.06 KB, 下載次數(shù): 126)
下載附件
2018-6-5 18:39 上傳
單片機(jī)源程序如下:
- #include "led.h"
- #include "beep.h"
- #include "12864.h"
- #include "rc522.h"
- #include "key.h"
- #include "STCEEPROM.h"
- #include "DS1302.h"
- unsigned char idata RevBuffer[30];
- unsigned char Card_Num;
- unsigned char idata UID[4],Temp[4];
- unsigned char Table[3];
- unsigned char Num;
- uchar DS1302_Table[7]={0}; //讀取時(shí)間值
- unsigned char Count,Countf,Count1,Count2,Count3,Count4,Count5,C_flag;
- unsigned char T0RH = 0; //T0重載值的高字節(jié)
- unsigned char T0RL = 0; //T0重載值的低字節(jié)
- //unsigned char table1[20]= "刷卡成功!\r\n";
- void ConfigTimer0(unsigned int ms);
- extern void UartDriver();
- extern void ConfigUART(unsigned int baud);
- extern void UartRxMonitor(unsigned char ms);
- extern void UartWrite(unsigned char *buf, unsigned char len);
- //void delay_ms(unsigned int t)
- //{
- // unsigned char a,b;
- // while(t--)
- // {
- // for(b=102;b>0;b--)
- // for(a=3;a>0;a--);
- // }
- //}
- void iccardcode();
- void InitializeSystem();
- void Auto_Reader(void);
- void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec);
- void Run_DS1302(void);
- void main()
- {
-
- EA = 1; //開(kāi)總中斷
- ConfigTimer0(1); //配置T0定時(shí)1ms
- ConfigUART(9600); //配置波特率為9600
- led_init();
- beep_init();
- InitializeSystem();
- InitLcd12864();
- LcdShowString(8,8,"智能門(mén)禁考勤系統(tǒng)");
-
- while(1)
- {
- //UartDriver();
- iccardcode();
- Auto_Reader();
- Run_DS1302();
- if(!KEY1)
- {
- delay_10ms(50);
- if(!KEY1)
- {
- DS1302_Table[4]++;
- Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
- }
-
-
-
- }
-
-
- if(!KEY2)
- {
- delay_10ms(50);
- if(!KEY2)
- {
- DS1302_Table[4]--;
- Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
- }
- }
-
-
- if(!KEY3)
- {
- delay_10ms(50);
- if(!KEY3)
- {
- DS1302_Table[5]++;
- Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
- }
- }
- if(!KEY5)
- {
- delay_10ms(50);
-
- if(!KEY5)
- {
- delay_10ms(50);
- if(!KEY5)
- {
- if(C_flag==2)
- {
- //0123456789abcdef
- LcdShowString(8,32," Register Card! ");
- }
- if(C_flag==1)
- {
- //0123456789abcdef
- LcdShowString(8,32," Clean Card! ");
- }
- BEEP=0;delay_10ms(200);BEEP=1;
- LcdShowString(8,32,"Please Swipecard");
- C_flag =0;
- while(!KEY5);
- }
-
-
- }
-
- }
- }
-
- }
- //系統(tǒng)初始化
- void InitializeSystem()
- {
- PcdReset();
- PcdAntennaOff();
- PcdAntennaOn();
- M500PcdConfigISOType( 'A' );
-
- }
- void Auto_Reader(void)
- {
- if(PcdRequest(0x52,Temp)==0)
- {
- if(PcdAnticoll(UID)==0)
- {
- BEEP=0;delay_10ms(20);BEEP=1;
- Table[0]=UID[0]/100+0x30;
- Table[1]=UID[0]/10%10+0x30;
- Table[2]=UID[0]%10+0x30;
- //LcdShowString(8,32,"Num: ");
- //LcdShowString(8,32,Table);
- Count = UID[0];
- if((Count==Count1)||(Count==Count2)||(Count==Count3)||(Count==Count4)||(Count==Count5))
- {
-
- LcdShowString(8,48," 刷卡成功!");
- Green_LED = 0;
- JQZ=0;
- UartWrite("刷卡成功,請(qǐng)進(jìn)入!\r\n\r\n\r\n",20);
- delay_10ms(200);
- JQZ=1;
- Green_LED = 1;
- LcdShowString(8,48," ");
- C_flag=1;
-
-
-
- }
- else
- {
- LcdShowString(8,48," 刷卡失敗!");
- UartWrite("刷卡失敗,請(qǐng)重刷!\r\n\r\n\r\n",20);
- RED_LED = 0;
- delay_10ms(200);
- RED_LED = 1;
- LcdShowString(8,48," ");
- C_flag=2;
- }
- delay_10ms(200);
- LcdShowString(8,32,"Please Swipecard");
- }
- }
- }
-
- void iccardcode()
- {
- unsigned char cmd;
- unsigned char status;
-
- cmd = RevBuffer[0];
- switch(cmd)
- {
- case 1: // Halt the card //終止卡的操作
- status= PcdHalt();;
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 2: // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
- // 尋卡,防沖突,選擇卡 返回卡類(lèi)型(2 bytes)+ 卡系列號(hào)(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 3: // 防沖突 讀卡的系列號(hào) MLastSelectedSnr
- 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;
- case 4: // 選擇卡 Select Card
- //status=PcdSelect(MLastSelectedSnr);
- if(status!=MI_OK)
- {
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- }
- RevBuffer[0]=3;
- RevBuffer[1]=status;
- break;
- case 5: // Key loading into the MF RC500's EEPROM
- //status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校驗(yàn)卡密碼
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 6:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 7:
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 8: // Read the mifare card
- // 讀卡
- status=PcdRead(RevBuffer[1],&RevBuffer[2]);
- if(status==0)
- {RevBuffer[0]=17;}
- else
- {RevBuffer[0]=1;}
- RevBuffer[1]=status;
- break;
- case 9: // Write the mifare card
- // 寫(xiě)卡 下載密碼
- status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 10:
- PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
- RevBuffer[0]=1;
- RevBuffer[1]=status;
- break;
- case 12: // 參數(shù)設(shè)置
- PcdBakValue(RevBuffer[1], RevBuffer[2]);
- RevBuffer[0]=1; //contact
- RevBuffer[1]=0;
- break;
- }
- }
- void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec)
- {
- uchar Dis_Table[8]="18:40:33";
- Dis_Table[0] =' ';
- Dis_Table[1] =' ';
- Dis_Table[2] =' ';
- Dis_Table[3] =' ';
- Dis_Table[4] = Dis_Hour/10+0x30;
- Dis_Table[5] = Dis_Hour%10+0x30;
- Dis_Table[6] =':';
- Dis_Table[7] = Dis_Min/10+0x30;
- Dis_Table[8] = Dis_Min%10+0x30;
- Dis_Table[9] =':';
- Dis_Table[10] = Dis_Sec/10+0x30;
- Dis_Table[11] = Dis_Sec%10+0x30;
-
- LcdShowString(8,16,Dis_Table);
- }
- /********************************************************************
- * 名稱(chēng) : Run_DS1302(void)
- * 功能 : 讀出DS1302中的數(shù)據(jù),并進(jìn)行顯示
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void Run_DS1302(void)
- {
- uchar sec, min, hour, day, month, week, year;
- v_W1302(0x8f, 0);
- sec = bcdtodec(uc_R1302(0x81)); //讀出DS1302中的秒
- v_W1302(0x8f, 0);
- min = bcdtodec(uc_R1302(0x83)); //讀出DS1302中的分
- v_W1302(0x8f, 0);
- hour = bcdtodec(uc_R1302(0x85)); //讀出DS1302中的小時(shí)
- v_W1302(0x8f, 0);
- day = bcdtodec(uc_R1302(0x87)); //讀出DS1302中的日
- v_W1302(0x8f, 0);
- month = bcdtodec(uc_R1302(0x89)); //讀出DS1302中的月
- v_W1302(0x8f, 0);
- week = bcdtodec(uc_R1302(0x8b)); //讀出DS1302中的星期
- v_W1302(0x8f, 0);
- year = bcdtodec(uc_R1302(0x8d)); //讀出DS1302中的年
- DS1302_Table[0]=year;
- DS1302_Table[1]=month;
- DS1302_Table[2]=day;
- DS1302_Table[3]=week;
- DS1302_Table[4]=hour;
- DS1302_Table[5]=min;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 所有資料51hei提供下載:
程序V0.2.rar
(203.75 KB, 下載次數(shù): 386)
2018-6-5 11:56 上傳
點(diǎn)擊文件名下載附件
程序 下載積分: 黑幣 -5
newPCBV0.1.rar
(3.36 MB, 下載次數(shù): 163)
2018-6-5 11:58 上傳
點(diǎn)擊文件名下載附件
PCB圖 下載積分: 黑幣 -5
MyDesigner.rar
(38.17 KB, 下載次數(shù): 198)
2018-6-5 11:57 上傳
點(diǎn)擊文件名下載附件
原理圖 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|