本設計主要采用AT89C52單片機和mcm200模塊實現Mifare 1射頻卡的識別和卡上信息的采集,RS485通訊接口和單片機控制系統連接來對Mifare非接觸式智能射頻卡進行相應的讀寫操作。讀卡距離約為25毫米。當卡進入射頻天線頻帶時,卡上的數據將被讀取并顯示在頂部PC上。讀卡器可以在平時獨立工作。mcm200讀卡模塊采用AT89C52單片機和8K字節閃存作為控制器。
對于軟件部分,需要讀寫IC卡的內部信息,并與最高管理計算機進行通信。也就是說,主要通過串行通信程序的設計和調試,無卡時顯示時鐘,有卡時讀取卡上的數據并顯示在計算機屏幕上,由讀卡程序和編程DS1302執行。
程序如下:
lcd_init() //LCD初始化設定
{
lcd_wcmd(0x38);
Delay(1);
lcd_wcmd(0x0c);
Delay(1);
lcd_wcmd(0x06);
Delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內容
Delay(1);
}
LCD1602()
{
lcd_pos(0x03); // 顯示ID:
lcd_wdat(dis2[0]);
lcd_wdat(dis2[1]);
lcd_wdat(dis2[2]);
lcd_pos(0x06); // 顯示ID號
lcd_wdat(dis5[ID_DATA[0]/16]);
lcd_wdat(dis5[ID_DATA[0]%16]);
lcd_wdat(dis5[ID_DATA[1]/16]);
lcd_wdat(dis5[ID_DATA[1]%16]);
lcd_wdat(dis5[ID_DATA[2]/16]);
lcd_wdat(dis5[ID_DATA[2]%16]);
lcd_wdat(dis5[ID_DATA[3]/16]);
lcd_wdat(dis5[ID_DATA[3]%16]);
lcd_pos(0x40); // 讀到卡,請進,WALK UP!
if(falg==1)
{
lcd_wdat(dis3[0]);
lcd_wdat(dis3[1]);
lcd_wdat(dis3[2]);
lcd_wdat(dis3[3]);
lcd_wdat(dis3[4]);
lcd_wdat(dis3[5]);
lcd_wdat(dis3[6]);
lcd_wdat(dis3[7]);
lcd_wdat(dis3[8]);
lcd_wdat(dis3[9]);
lcd_wdat(dis3[10]);
lcd_wdat(dis3[11]);
lcd_wdat(dis3[12]);
lcd_wdat(dis3[13]);
lcd_wdat(dis3[14]);
lcd_wdat(dis3[15]);
}
lcd_pos(0x40); // 沒讀到卡或者卡沒有權限顯示,welcome you!!
if(falg==0)
{
lcd_wdat(dis4[0]);
lcd_wdat(dis4[1]);
lcd_wdat(dis4[2]);
lcd_wdat(dis4[3]);
lcd_wdat(dis4[4]);
lcd_wdat(dis4[5]);
lcd_wdat(dis4[6]);
lcd_wdat(dis4[7]);
lcd_wdat(dis4[8]);
lcd_wdat(dis4[9]);
lcd_wdat(dis4[10]);
lcd_wdat(dis4[11]);
lcd_wdat(dis4[12]);
lcd_wdat(dis4[13]);
lcd_wdat(dis4[14]);
lcd_wdat(dis4[15]);
}
}
當系統開始供電時進入工作狀態,初始化接著開啟天線,當初始化結束后便開始尋找天線范圍內的卡片,當有卡刷入時開始選定卡片,輸入卡片ID號,接著可以進行對卡片的添加或刪除權限的操作。當選擇卡片有權限時門打開,當無權限時門不打開。
status = PcdRequest(PICC_REQALL, g_ucTempbuf);
//返回卡片類型#define PICC_REQALL 0x26 尋天線區內所有卡
if(status!= MI_OK) //讀不到卡,顯示清0;
{
LED=1;
TYPE_DATA[0]=0;
TYPE_DATA[1]=0;
ID_DATA[0]=0;
ID_DATA[1]=0;
ID_DATA[2]=0;
ID_DATA[3]=0;
falg_pro=0;
}
if (status == MI_OK) //讀到卡
{
LED=0;
TYPE_DATA[0]=g_ucTempbuf[0];
TYPE_DATA[1]=g_ucTempbuf[1];
status = PcdAnticoll(g_ucTempbuf); //防沖撞 ,返回卡片ID號 4字節
if (status == MI_OK)
{
status = PcdSelect(g_ucTempbuf); //選定卡片 ,輸入卡片ID號
if (status == MI_OK)
{
if(falg_pro==0)//聲音提示標志
{
falg_pro=1;
pro();
}
ID_DATA[0]=g_ucTempbuf[0];
ID_DATA[1]=g_ucTempbuf[1];
ID_DATA[2]=g_ucTempbuf[2];
ID_DATA[3]=g_ucTempbuf[3];
init_k();//將卡寫成門卡,或者清門卡
readk(); //讀卡,讀字節3的數據判斷是否是AA
if(value_DATA[3]==0xaa)//權限正確,標志寫1
{
falg=1;//
}
}
}
}
|