淮阴师范学院毕业设计
{
tochar(Temp[0]); tochar(Temp[1]); }
比如,当Temp[0]=04,Temp[1]=00时,卡类型为S50。
第二步:防冲撞处理 status2= PcdAnticoll(UID); if(status2==MI_OK) {
PutString0(\ tochar(UID[0]); 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字节
输出卡类型
15
淮阴师范学院毕业设计
4.3 子程序分析 4.3.1 RC522读卡程序
定义端口:
sbit MF522_RST = P1^7; sbit MF522_SO = P1^6; sbit MF522_SI = P1^5; sbit MF522_SCK = P1^4; sbit MF522_NSS = P1^3; 参数说明: req_code[IN]: 寻卡方式
0x52 = 寻感应区内所有符合14443A标准的卡 0x26 = 寻未进入休眠状态的卡 pTagType[OUT]:卡片类型代码 0x4400 = Mifare_UltraLight 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);
16
复位信号 SPI 接口主入从出 SPI 接口主出从入 时钟接口
应该是SDA接口 寻卡函数:
淮阴师范学院毕业设计
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20; status = MI_OK }
4.3.2 24C02存储程序
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)
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();
return(1);
17
表示要写入字节的个数.
写器件地址
等待超时(10ms) 等待一会 重新发送 写器件地址
写存储的地址
写存储的数据 如果在发送停止信号之前主器件发送超过P+1个字节,地址计数器将自动翻转,先前写入的数据被覆盖.
淮阴师范学院毕业设计
}
void read_more_byte(uchar add,uchar number,uchar *p)//number
表示要读取的字节个数,读取的数据保存在*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)时
18
淮阴师范学院毕业设计
选择数据寄存器、低电平(0)时选择指令寄存器。
sbit EN = P1^2;
EN为使能端,与P1.2连接,写操作时,下降沿使能。读操作时,E高电平有效。
初始化函数: void LCD_Init(void) {
LCD_Write_Com(0x38); DelayMs(5);
不检测忙信号 延时5毫秒 不检测忙信号 延时5毫秒 不检测忙信号 延时5毫秒
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38); DelayMs(5);
LCD_Write_Com(0x38); 显示模式设置 LCD_Write_Com(0x08); 显示关闭 LCD_Write_Com(0x01); 显示清屏 LCD_Write_Com(0x06); DelayMs(5);
LCD_Write_Com(0x0C); }
显示开及光标设置
显示光标移动设置
5 结束语
经过这段时期系统的开发,我对基于单片机AT89C52的开发研究有了更深的了解和认识,掌握了单片机使用的一些技巧和引脚的使用方法。本次毕业设计给了我一个独立思考和解决问题的机会,在系统的电路设计、功能模块和各方面的设计开发中,都需要进行细致全面的思考,从中让我学会了以前不曾接触过的知识,并且学会了怎样将书本知识转化到实际应用开发工作中去。毕业设计能够很好地提高我们的综合能力。除了学习到了相关的技术之外,还培养了自学、独立的解决问题的能力。
19
淮阴师范学院毕业设计
致 谢
在此论文撰写过程中我遇到了很多的困难和障碍,都在同学和老师的帮助下一一解决了,我要感谢我的论文指导老师——葛恒清。在整个论文写作过程中,他对我进行了耐心的指导和帮助,提出严格要求,引导我不断开阔思路,为我答疑解惑,鼓励我大胆创新,这使我在大学最后生活的时光中,既增长了知识、开阔了视野、锻炼了心态,又培养了良好的钻研精神。他那严谨的治学作风,一丝不苟的工作态度将会指导我以后的工作学习,在此,我向俞阿龙教授表示最诚挚的谢意!
同时还要感谢我的同学和朋友,他们在我论文的写作过程中提出了很多有用的意见与建议,还在论文排版过程中提供热情的帮助。
最后还要感谢这篇论文引用所有文献的学者们,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。
20