非接触式智能IC卡读写模块 程序 51单片机.docx
《非接触式智能IC卡读写模块 程序 51单片机.docx》由会员分享,可在线阅读,更多相关《非接触式智能IC卡读写模块 程序 51单片机.docx(46页珍藏版)》请在冰点文库上搜索。
非接触式智能IC卡读写模块程序51单片机
附:
函数
Main.c
#define_SRC
#include"main.h"
#undef_SRC
#include"zlg500.h"
sbitzlg500_RST=P1^2;
sbitSS=P0^7;
sbitSCLK=P0^6;
sbitMOSI=P0^5;
sbitMISO=P0^4;
ucharcodeNkey_a[6]={0xA0,0xA1,0xA2,0xA3,0xA4,0xA5};
ucharcodeNkey_b[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
ucharcodeNkey_c[4]={0x9E,0x33,0x51,0xA2};
voiddelay_us(ucharu)
{uchari;for(i=u;i>0;i--);}
voiddelay_5ms(void)
{uintj;for(j=2000;j>0;j--);}
voiddelay_50ms()
{uintj;for(j=20000;j>0;j--);}
ucharrw_byte(ucharcom)
{uchari;ucharrevdat=0,senddat=0;
for(i=0;i<8;i++)
{SCLK=0;
delay_us(8);
senddat=com&0x01;
com>>=1;
if(senddat==0x01)
MOSI=1;}
else
{MOSI=0;}
if(MISO)
{revdat=revdat|(0x01<
SCLK=1;
delay_us(8);
}
MOSI=1;
return(revdat);
}
voidtwo_byte_com(ucharcom)
{uchartemp;
do{
SS=0;
rw_byte(com);
rw_byte(0x00);
SS=1;
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(temp&0x01);
}
voidzy1730_pu(void)
{two_byte_com(0x01);}
voidzy1730_pd(void)
{two_byte_com(0x07);}
voidzy1730_clr_int(void)
{two_byte_com(0x04);}
voidwait_rdy(void)
{uchartemp;
do{SS=0;
rw_byte(0x15);
rw_byte(0x00);
temp=rw_byte(0x00);
SS=1;
}while(!
(temp&0x01));}
voidwait_finish(void)
{uchartemp;
do{
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(!
(temp&0x10));
zy1730_clr_int();
wait_rdy();}
voidzy1730_set_play(uchars_addr,uchare_addr)
{uchartemp;
do{
SS=0;
rw_byte(0x90);
rw_byte(0x00);
rw_byte(s_addr);
rw_byte(0x00);
rw_byte(e_addr);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(temp&0x01);}
voidzy1730_set_rec(uchars_addr,uchare_addr)
{uchartemp;
do{
SS=0;
rw_byte(0x91);
rw_byte(0x00);
rw_byte(s_addr);
rw_byte(0x00);
rw_byte(e_addr);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(temp&0x01);}
voidzy1730_set_EASER(uchars_addr,uchare_addr)
{uchartemp;
do{
SS=0;
rw_byte(0x92);
rw_byte(0x00);
rw_byte(s_addr);
rw_byte(0x00);
rw_byte(e_addr);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(temp&0x01);}
voidzy1730_wr_apc(void)
{uchartemp;
do{
SS=0;
rw_byte(0x65);
rw_byte(0x40);
rw_byte(0x04);
SS=1;
SS=0;
temp=rw_byte(0x15);
rw_byte(0x00);
rw_byte(0x00);
SS=1;
}while(temp&0x01);}
voidfyqcz(void)
{zy1730_pu();
delay_50ms();
zy1730_clr_int();
wait_rdy();
zy1730_set_play(0x10,0x1f);
wait_finish();
zy1730_pd();}
voidfyqsk(void)
{zy1730_pu();
delay_50ms();
zy1730_clr_int();
wait_rdy();
zy1730_set_play(0x20,0x2f);
wait_finish();
zy1730_pd();}
main()
{
ucharidatatt[2];
ucharidatacard_snr[4];
ucharidatasize;
ucharidatabankdata[16];
longidatavalue=1;
uchari,j;
zlg500_RST=1;
for(i=255;i>0;i--)
for(j=255;j>0;j--);
zlg500_RST=0;
for(i=255;i>0;i--)
for(j=255;j>0;j--);
spi_init();
EA=1;
i=mifs_config();
i=mifs_get_info(bankdata);
i=mifs_clr_control_bit();
i=mifs_set_control_bit();
bankdata[0]=0x05;
bankdata[4]=~0x05;
bankdata[8]=0x05;
while
(1)
{while(mifs_request(IDLE,tt)!
=0);
if(mifs_anticoll(0,card_snr)!
=0)continue;
delay_50ms();
if(mifs_select(card_snr,&size)!
=0)
{fyqsk();continue;}
if(card_snr[0]==Nkey_c[0])
{if(card_snr[1]==Nkey_c[1])
{
if(card_snr[2]==Nkey_c[2])
{
if(card_snr[3]==Nkey_c[3])
{
if(mifs_authKey(KEYA,5,Nkey_b)!
=0)continue;
for(i=1;i<4;i++)
{
bankdata[i]=0x00;
bankdata[4+i]=0xff;
bankdata[8+i]=0x00;
}
bankdata[12]=0x14;
bankdata[13]=~0x14;
bankdata[14]=0x14;
bankdata[15]=~0x14;
if(mifs_write(20,bankdata)!
=0)continue;
if(mifs_check_write(card_snr,KEYA,20,bankdata)!
=0)continue;
if(mifs_read(20,bankdata)!
=0)continue;
if(mifs_restore(20)!
=0)continue;
if(mifs_transfer(21)!
=0)
{i=0;continue;}
if(bankdata[0]==0)
{fyqcz();}
if(bankdata[0]!
=0)
{if(mifs_value(0xc0,20,&value,21)!
=0)
{i=0;continue;}
if(mifs_read(21,bankdata)!
=0)continue;
mifs_halt();
if(mifs_write_E2(0x30,16,bankdata)!
=0)continue;
mifs_clr_control_bit();
mifs_set_control_bit();
for(i=255;i>0;i--);
for(j=255;j>0;j--);
mifs_buzzer(198,20);
}}}}}
else
{fyqsk();}}
}
main.h
#ifdef_SRC
#defineEXTERN
#else
#defineEXTERNextern
#endif
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#undefEXTERN
mface_3.h
//definespi
#defineSPI_REN()IE0=0;EX0=1
#defineSPI_RDIS()EX0=0
//spiError
#defineSPI_OK0
#defineSPI_ERR255
externucharspi_send(ucharidata*dp,ucharlenght);
externucharspi_rcv(ucharidata*dp);
externucharspi_init(void);
zlg500.h
#ifdef__SRC
#defineEXTERN
#else
#defineEXTERNextern
#endif
#ifdef__SRC
#definemifs_request_en1
#definemifs_anticoll_en1
#definemifs_anticoll2_en0
#definemifs_cascanticoll_en1
#definemifs_select_en1
#definemifs_cascselect_en1
#definemifs_authentication_en1
#definemifs_authentication2_en1
#definemifs_authKey_en1
#definemifs_halt_en1
#definemifs_read_en1
#definemifs_write_en1
#definemifs_ULwrite_en1
#definemifs_increment_en0
#definemifs_decrement_en0
#definemifs_restore_en1
#definemifs_transfer_en1
#definemifs_value_en1
#definemifs_valuedebit_en1
#definemifs_load_key_en1
#definemifs_reset_en0
#definemifs_close_en0
#definemifs_config_en1
#definemifs_get_info_en1
#definemifs_check_write_en1
#definemifs_set_control_bit_en1
#definemifs_clr_control_bit_en1
#definemifs_buzzer_en1
#definemifs_read_E2_en1
#definemifs_write_E2_en1
#definemifs_write_reg_en1
#definemifs_read_reg_en1
#endif
#defineIDLE0x00
#defineALL0x01
#defineANTICOLL10x93
//anticollisionlevel1
#defineANTICOLL20x95
//anticollisionlevel2
#defineANTICOLL30x97
/anticollisionlevel3
#defineKEYA0x00
#defineKEYB0x04
#definePICC_DECREMENT0xC0
#definePICC_INCREMENT0xC1
#definePICC_RESTORE0xC2
EXTERNucharidataspi_buffer[26];
//definespi_buffer
#defineSEQNR0
#defineCOMMAND1
#defineSTATUS1
#defineLENGTH2
#defineMODE3
#defineBCNT3
#defineADR3
#defineSERNR3
#defineSIZE3
#defineTIME3
#defineTAGTYPE3
#defineINFO3
#defineDATA3
#defineSECNR4
#defineDATABYTES4
#defineVALUE4
#defineNKEY5
#defineAUTHMODE7
#defineADRCHKWR8
#defineDATACHKWR9
EXTERNucharspi_init(void);
EXTERNucharmifs_request(uchar_Mode,ucharidata*_TagType);
EXTERNucharmifs_anticoll(uchar_Bcnt,ucharidata*_SNR);
EXTERNucharmifs_anticoll2(uchar_Encoll,uchar_Bcnt,ucharidata*_SNR);
EXTERNucharmifs_cascanticoll(uchar_Select_code,uchar_Bcnt,uchar*_SNR);
EXTERNucharmifs_select(ucharidata*_SNR,ucharidata*_Size);
EXTERNucharmifs_cascselect(uchar_Select_code,uchar*_SNR,uchar*_Sak);
EXTERNucharmifs_authentication(uchar_Mode,uchar_SecNr);
EXTERNucharmifs_authentication2(uchar_Mode,uchar_SecNr,uchar_KeyNr);
EXTERNucharmifs_authKey(uchar_Mode,uchar_SecNr,uchar*_Key);
EXTERNucharmifs_halt(void);
EXTERNucharmifs_read(uchar_Adr,ucharidata*_Data);
EXTERNucharmifs_write(uchar_Adr,ucharidata*_Data);
EXTERNucharmifs_ULwrite(uchar_Adr,uchar*_Data);
EXTERNucharmifs_increment(uchar_Adr,longidata*_Value);
EXTERNucharmifs_decrement(uchar_Adr,longidata*_Value);
EXTERNucharmifs_restore(uchar_Adr);
EXTERNucharmifs_transfer(uchar_Adr);
EXTERNucharmifs_value(uchar_Mode,uchar_Adr,longidata*_Value,uchar_Trans_Adr);
EXTERNucharmifs_valuedebit(uchar_Mode,uchar_Adr,longidata*_Value);
EXTERNucharmifs_load_key(uchar_Mode,uchar_SecNr,uchar*_Nkey);
EXTERNucharmifs_reset(uchar_Msec);
EXTERNucharmifs_close(void);
EXTERNucharmifs_config(void);
EXTERNucharmifs_get_info(ucharidata*_Info);
EXTERNucharmifs_check_write(ucharidata*_SNR,uchar_Authmode,uchar_Adr,ucharidata*_Data);
EXTERNucharmifs_set_control_bit();
EXTERNucharmifs_clr_control_bit();
EXTERNucharmifs_buzzer(uchar_Frquence,uchar_10ms);
EXTERNucharmifs_read_E2(uchar_Adr,uchar_Length,ucharidata*_Data);
EXTERNucharmifs_write_E2(uchar_Adr,uchar_Length,ucharidata*_Data);
EXTERNucharmifs_write_reg(uchar_Reg,uchar_Value);
EXTERNucharmifs_read_reg(uchar_Reg,uchar*_Value);
//mifareerror
#defineMI_OK0
#defineMI_NOTAGERR1
#defineMI_CRCERR2
#defineMI_EMPTY3
#defineMI_AUTHERR4
#defineMI_PARITYERR5
#defineMI_CODEERR6
#defineMI_SERNRERR8
#defineMI_NOTAUTHERR10
#defineMI_BITCOUNTERR11
#defineMI_BYTECOUNTERR12
#defineMI_TRANSERR14
#defineMI_WRITEERR15
#defineMI_INCRERR16
#defineMI_DECRERR17
#defineMI_READERR18
#defineMI_QUIT30
//spiError
#defineSPI_OK0
#defineSPI_ERR255
//checkwriteError
#defineMIS_CHK_OK0
#defineMIS_CHK_FAILED1
#defineMIS_CHK_COMPERR2
#undefEXTERN
Zlg500.c
#include"main.h"
#include
#include"mface_3.h"
#define__SRC
#include"zlg500.h"
#undef__SRC
bitbdatanewdata=0;
voidspi_int(void)interrupt0using1
{spi_rcv(spi_buffer);
newdata=1;}
ucharzlg500cmd(ucharlength)
{ucharspi_wdg=10;
uchari,BCC_sum;
spi_buffer[length]=spi_buffer[0];
for(i=1;i{spi_buffer[length]^=spi_buffer[i];}
spi_buffer[length]=~spi_buffer[length;
TH0=0x2c;//Fosc=11059200,50mstimerinterrupt
TL0=0xb0;
if(spi_send(spi_buffer,length+1)!
=SPI_OK)
returnSPI_ERR;
ET0=0;
TF0=0;
TR0=1;
SPI_REN();
while(newdata==0&&spi_wdg!
=0)
{
if(TF0==1)
{
TH0=0x2c;
TL0=0xb0;
TF0=0;
spi_wdg--;
}
}
TR0=0;
SPI_RDIS();
if(newdata==0)returnSPI_ERR;
newdata=0;
BCC_sum=spi_buffer[0];
for(i=1;i<(spi_buffer[LENGTH]+3);i+)
{BCC_sum^=spi_buffer[i];}
if(BCC_s