当前位置:首页 > 智能门禁系统设计毕业论文 - 图文
tochar(UID[1]); tochar(UID[2]);
tochar(UID[3]); //输出卡片序列号 }
第三步:选卡。
status2= PcdSelect(UID); //选择卡片,输入卡片序列号,4字节
第四步:在读写卡之前需要先进行认证。
status2= PcdAuthState(PICC_AUTHENT1A, 1, Password_Buffer, UID);
其中四个参数分别代表:验证A密钥+块地址+扇区密码+卡序列号。然后进行写操作:
status2=PcdWrite(1,writeData);//写数据,将数组writeData中的数写入到卡
中,其中第一个参数1代表写入的地址为块1,或者进行读卡操作:
status2 = PcdRead(1, str);//读卡
其中第一个参数1代表读的地址为块1,读卡后得到的数据存放于数组str中。
4.3 子程序分析
4.3.1 RC522读卡程序
定义端口:
sbit MF522_RST = P1^7; //复位信号 sbit MF522_SO = P1^6;//SPI 接口主入从出 sbit MF522_SI = P1^5;//SPI 接口主出从入 sbit MF522_SCK = P1^4; //时钟接口 sbit MF522_NSS = P1^3; //应该是SDA接口
寻卡函数:
参数说明: req_code[IN]:寻卡方式
0x52 = 寻感应区内所有符合14443A标准的卡 0x26 = 寻未进入休眠状态的卡 pTagType[OUT]:卡片类型代码
0x4400 = Mifare_UltraLight
19
0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire
返 回: 成功返回MI_OK
防冲撞函数:
参数说明: pSnr[OUT]:卡片序列号,4字节 返 回: 成功返回
char PcdAnticoll(unsigned char *pSnr) {
char status;
unsigned char i,snr_check=0; unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80);
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20;
status = MI_OK }
4.3.2 24C02存储程序
用页写 CAT24WC01可一次写入8个字节数据,CAT24WC02/04/08/16可以一次写入16个字节的数据;页写操作的启动和字节写一样,不同在于传送了一字节数据后并不产生停止信号,主器件被允许发送 P(CAT24WC02/04/08/16 P=15)个额外的字节,每发送一个字节数据后CAT24WC01/02/04/08/16产生一个应答位并将字节地址低位加1,高位保持不变如果在发送停止信号之前主器件发送超过P+1个字节,地址计数器将自动翻转,先前写入的数据被覆盖。
20
在24C02的add地址中连续写入一串数据*p,返回1设备正常;24C02的首地址:0x00--0xFF,共256个寻址地址;存储容量2Kb,内部分成32页,每页8个Byte。
2^5 * 2^3 * 2^3=2^11=2Kb.
bit Write_more_byte(uchar add,uchar number,uchar *p)number表示要写入字节的个数. {
bit val; uchar i=0; IIc_init(); IIc_start();
val = IIc_write_byte(Address_24C02); 写器件地址 while(val==0) {
if(i++==10) 等待超时(10ms) return(0);
delay(1); 等待一会 IIc_start(); 重新发送 val = IIc_write_byte(Address_24C02);写器件地址 }
IIc_write_byte(add); 写存储的地址 for(i=0;number>0;number--) {
IIc_write_byte(*p++); 写存储的数据 }
IIc_stop(); 如果在发送停止信号之前主器件发送超过P+1个字节,地址计数器将自动翻转,先前写入的数据被覆盖. return(1); }
void read_more_byte(uchar add,uchar number,uchar *p)//number表示要读取的字节个
21
数,读取的数据保存在*p中。 {
bit val=0; IIc_init(); IIc_start();
val = IIc_write_byte(Address_24C02); 写器件地址
while(val==0) 器件没有应答 可能是内部编程/擦除周期 {
delay(1); 等待一会 IIc_start(); 重新发送 val=IIc_write_byte(Address_24C02);写器件地址 }
IIc_write_byte(add); 写存储的地址 IIc_start();
IIc_write_byte(Address_24C02+1); 写器件地址(读) for(;number>1;number--) {
*p++=IIc_read_byte(1); }
*p = IIc_read_byte(0); 读最后一个数据主机不应答 IIc_stop(); }
4.3.3 显示程序
定义端口: sbit RW = P1^1;
R/W为读写信号线,与P1.1端口连接,高电平(1)时进行读操作,低电平(0)时进行写操作,
sbit RS = P1^0;
RS为寄存器选择,与P1.0端口连接,高电平(1)时选择数据寄存器、低电平(0)时选择指令寄存器。
22
共分享92篇相关文档