毕业论文_基于单片机的IC卡读写器设计.doc

上传人:yyf 文档编号:3941719 上传时间:2019-10-10 格式:DOC 页数:69 大小:1.18MB
返回 下载 相关 举报
毕业论文_基于单片机的IC卡读写器设计.doc_第1页
第1页 / 共69页
毕业论文_基于单片机的IC卡读写器设计.doc_第2页
第2页 / 共69页
毕业论文_基于单片机的IC卡读写器设计.doc_第3页
第3页 / 共69页
毕业论文_基于单片机的IC卡读写器设计.doc_第4页
第4页 / 共69页
毕业论文_基于单片机的IC卡读写器设计.doc_第5页
第5页 / 共69页
点击查看更多>>
资源描述

《毕业论文_基于单片机的IC卡读写器设计.doc》由会员分享,可在线阅读,更多相关《毕业论文_基于单片机的IC卡读写器设计.doc(69页珍藏版)》请在三一文库上搜索。

1、石家庄铁道大学四方学院毕业设计 0 石家庄铁道大学四方学院毕业设计 基于单片机的基于单片机的 IC 卡读写器设计卡读写器设计 The Design of the IC Card Read-Write Device Based on single chip microcomputer 20122012 届届 电气工程电气工程 系系 专专 业业 学学 号号 学生姓名学生姓名 指导教师指导教师 陈东阳陈东阳 完成日期完成日期 20122012 年年 5 5 月月 1515 日日 石家庄铁道大学四方学院毕业设计 1 毕业设计成绩单 学生姓名 学号 班级 专业 毕业设计题目基于单片机的 IC 卡读写器设

2、计 指导教师姓名 指导教师职称 评 定 成 绩 指导教师得分 评阅人得分 答辩小 组组长 得分 成绩: 院长(主任) 签字: 年 月 日 石家庄铁道大学四方学院毕业设计 2 毕业设计任务书 题 目基于单片机的 IC 卡读写器设计 学生姓名 学号 班级 专业自动化 承担指导任务单位石家庄铁道大学 导师 姓名 陈东阳 导师 职称 副教授 一、主要内容 设计一款读写器,能通过与计算机通信,由计算机发送新数据到单片机,完成对卡的 读/写。 IC 卡应用于消费电子产品对 IC 卡的管理,如电卡,饭卡,购物卡,娱乐消费卡等其 他消费费系统充值与管理。这里设计的读写器能实现简单的读写与显示功能。 二、技术参

3、数和要求 1、使用 SLE4442 卡,密码用 123456。 2、33-36 区域放置 AA 55 80 FE 四个字节作为卡片识别代码。 3、37 区域放置能消费值 MN(钱包值 MN=0;i-) 石家庄铁道大学四方学院毕业设计 52 CheckSum+=ReciveBufferi; if(CheckSum=ReciveBufferReciveBuffer1+2) return 1; else return 0; void SendTrue(uchar COM) /修改IC成功发送的数据 SendData(0xaa); SendData(0x55); SendData(COM-0x80);

4、 SendData(0x01); SendData(0x01); SendData(COM-0x80+1+1); SendData(0xed); void SendFalse(uchar COM) /修改IC失败发送的数据 SendData(0xaa); SendData(0x55); SendData(COM-0x80); SendData(0x01); SendData(0x02); SendData(COM+1+2); SendData(0xed); 石家庄铁道大学四方学院毕业设计 53 void main() uchar rec5; UartInit(); Timer0Init();

5、ET0=1; ES=1; EA=1; IsCard=1; BEE=1; /蜂鸣器 while(1) IsCard=1; if(IsCard) /无卡 DisplayTemp=0xffff; /显示“-” Power=1; /关闭电源 else Power=0; /若有卡打卡卡电源 IRcvdat_4442(MAM,33,2,rec);/从主存储器0X33地址读2个字节放到rec数组 DisplayTemp=rec0*10+rec1; if(ReciveOver) ReciveOver=0; if(Check() if(ReciveBuffer0=COM_Read)/读命令 uchar chec

6、ksum; 石家庄铁道大学四方学院毕业设计 54 IRcvdat_4442(MAM,33,2,rec); SendData(0xaa); SendData(0x55); SendData(0x01); checksum=0x01; SendData(0x02); checksum+=0x02; SendData(rec0); checksum+=rec0; SendData(rec1); checksum+=rec1; SendData(checksum); SendData(0xed); else if(ReciveBuffer0=COM_Write)/写命令 if(IChkpsw_4442

7、(0xff,0xff,0xff)=0)/密码校验 if(ISenddat_4442(MAM,33,2, else SendFalse(COM_Write); else SendFalse(COM_Write); 石家庄铁道大学四方学院毕业设计 55 else if(ReciveBuffer0=COM_ADD)/加命令 uchar x2,y; y=DisplayTemp+ReciveBuffer2*10+ReciveBuffer3; if(y99) y=99; x0=y/10; x1=y%10; if(IChkpsw_4442(0xff,0xff,0xff)=0) if(ISenddat_444

8、2(MAM,33,2,x) SendTrue(COM_ADD); else SendFalse(COM_ADD); else SendFalse(COM_ADD); else if(ReciveBuffer0=COM_DEC)/减命令 uchar x2,y; if(y(ReciveBuffer2*10-ReciveBuffer3) y=DisplayTemp-ReciveBuffer2*10-ReciveBuffer3; else y=0; 石家庄铁道大学四方学院毕业设计 56 x0=y/10; x1=y%10; if(IChkpsw_4442(0xff,0xff,0xff)=0) if(IS

9、enddat_4442(MAM,33,2,x) SendTrue(COM_DEC); else SendFalse(COM_DEC); else SendFalse(COM_DEC); UpDisplay(); uchar ZhenTou2; bit RecFlag=0; uchar length=0; void Uart_Isr() interrupt 4 /串口中断 if (RI) 石家庄铁道大学四方学院毕业设计 57 RI = 0; /Clear receive interrupt flag if(RecFlag=0) ZhenTou0=ZhenTou1; ZhenTou1=SBUF;

10、if(ZhenTou0=0xaa) else ReciveBufferlength=SBUF; if(ReciveBufferlength=0xed) length=0; ReciveOver=1; RecFlag=0; else length+; void Time0Int() interrupt 1/数码中断 if(TimeCount+=50)/定时50次 TimeCount=0; DisPort=DisplayCodeDisplayDataDisplayDig;/输出段选 石家庄铁道大学四方学院毕业设计 58 DigPort=(DigDisplayDig/输出位选 if(DisplayD

11、ig+=3) DisplayDig=0; (2)SLE4442卡函数声名程序 #include“stc89C51.h“ #include #define uchar unsigned char #define uint unsigned int void Start_COM(); void Stop_COM(); void SendByte(uchar c); uchar RcvByte(); void AnRst(); void WrmOption() ; void BreakN() ; void SendCOM(uchar com1,uchar com2,uchar com3); bit

12、IRcvdat_4442(uchar area,uchar addr,uchar num,uchar buf); bit ISenddat_4442(uchar area,uchar addr,uchar num,uchar buf); uchar IChkpsw_4442(uchar psw1,uchar psw2,uchar psw3); (3)SLE4442卡操作程序 #include“sle4442.h“ #define uchar unsigned char /*宏定义*/ #define MAM 0 /*定义主存储器代号*/ #define SCM 1 /*定义加密存储器代号*/

13、#define PRM 2 /*定义保护存储器代号*/ #define _Nop() _nop_() /*定义空指令*/ #define DELAY5us() _Nop();_Nop();_Nop();_Nop();_Nop() /*端口位定义*/ sbit RST=P36; 石家庄铁道大学四方学院毕业设计 59 sbit IO=P34; sbit CLK=P35; /* 起动总线函数 函数原型: void Start_COM(); 功能: 启动发送命令起始条件. */ void Start_COM() IO=1; /*发送起始条件的数据信号*/ _Nop(); CLK=1; DELAY5us

14、(); /*起始条件建立时间大于 4.7us,延时*/ IO=0; /*发送起始信号*/ DELAY5us(); /*起始条件锁定时间大于 4 s*/ CLK=0; /*钳住总线准备发送或接收数据 */ _Nop(); _Nop(); /* 结束总线函数 函数原型: void Stop_COM(); 功能: 命令发送结束信号 */ void Stop_COM() IO=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ CLK=1; /*结束条件建立时间大于 4 s*/ DELAY5us(); IO=1; /*发送总线结束信号*/ _Nop(); 石家庄铁道大

15、学四方学院毕业设计 60 _Nop(); /* 字节数据传送函数 函数原型: void SendByte(uchar c); 功能: 将数据c发送出去,可以是命令,也可以是数据 */ void SendByte(uchar c) uchar BitCnt; for(BitCnt=0;BitCntBitCnt) /*判断发送位 */ else IO=0; _Nop();_Nop(); CLK=1; /*置时钟线为高通知被控器开始接收数据位*/ DELAY5us(); /*保证时钟高电平周期大于 4 s*/ CLK=0; /* 字节数据接收函数 函数原型: uchar RcvByte(); 功能:

16、 用来接收从卡传来的数据 */ uchar RcvByte() uchar retc; uchar BitCnt; retc=0; for(BitCnt=0;BitCnt1; if(IO=1) retc=retc+0x80; /*读数据位,接收的数据位放入 retc中 */ _Nop(); _Nop(); CLK=0; _Nop();_Nop(); return(retc); /* 复位和复位响应函数 函数原型 void AnRst(); 功能:复位IC卡并接收响应字节 */ void AnRst() RST=1; /*产生复位时序*/ DELAY5us(); CLK=1; DELAY5us(

17、); CLK=0; DELAY5us(); RST=0; _Nop(); RcvByte(); /*读出 32字节响应数据*/ RcvByte(); 石家庄铁道大学四方学院毕业设计 62 RcvByte(); RcvByte(); /* 发送4442处理脉冲函数 函数原型 void WrmOption(); 功能:发送处理模式指令后要调用此程序发送脉冲 */ void WrmOption() while(1) CLK=0; DELAY5us(); IO=1; _Nop();_Nop(); if(IO=1)break; /*没有处理完则继续发送脉冲*/ CLK=1; DELAY5us(); /*

18、 中止操作函数 函数原型 void BreakN(); 功能中止当前操作 */ void BreakN() CLK=0; DELAY5us(); RST=1; /*发出中止操作的时序*/ DELAY5us(); RST=0; 石家庄铁道大学四方学院毕业设计 63 /* 命令发送函数 函数原型 void SendCOM(ucahr com1,ucahr com2,uchar com3); 功能负责起动命令发送3字节命令 */ void SendCOM(uchar com1,uchar com2,uchar com3) Start_COM(); SendByte(com1); /*连续发送 3字节

19、指令*/ SendByte(com2); SendByte(com3); Stop_COM(); /* SLE4442卡读数据函数 函数原型: bit IRcvdat_4442(uchar area,ucahr addr,uchar num,uchar buf); 功能: 对 SLE4442卡进行读操作 area为存储器类型 addr为起始地址 num为读取数据字节数 buf为数据缓冲区指针 说明操作成功返回 1参数 area错误返回 0使用前用判断卡插好没有 */ bit IRcvdat_4442(uchar area,uchar addr,uchar num,uchar buf) ucha

20、r i; switch(area) case MAM: 石家庄铁道大学四方学院毕业设计 64 AnRst(); /*复位 SLM4442卡接收复位响应*/ SendCOM(0X30,addr,0x00); /*读主存储器*/ for(i=0;inum;i+) *buf=RcvByte(); buf+; BreakN(); break; case SCM: AnRst(); SendCOM(0x31,0x00,0x00); for(i=0;inum;i+) *buf=RcvByte(); buf+; BreakN(); break; case PRM: AnRst(); SendCOM(0x34

21、,0x00,0x00); for(i=0;inum;i+) *buf=RcvByte(); buf+; BreakN(); break; default: return(0); return(1); 石家庄铁道大学四方学院毕业设计 65 /* SLE4442卡写数据函数 函数原型: bit ISenddat_4442(uchar area,ucahr addr,uchar num,uchar buf); 功能: 对 SLE4442卡进行写操作 area为存储器类型 addr为起始地址 num为读取数据字节数 buf为数据缓冲区指针 说明:操作成功返回1错误返回0使用前用判断卡插好没有 */ b

22、it ISenddat_4442(uchar area,uchar addr,uchar num,uchar buf) uchar i; switch(area) case MAM: AnRst(); for(i=0;inum;i+) SendCOM(0X38,addr+i,*buf); /*写主存储器*/ buf+; WrmOption(); /*发送操作脉冲*/ break; case SCM: AnRst(); for(i=0;inum;i+) SendCOM(0x39,addr+i,*buf); buf+; WrmOption(); break; 石家庄铁道大学四方学院毕业设计 66

23、case PRM: AnRst(); for(i=0;inum;i+) SendCOM(0x3c,addr+i,*buf); buf+; WrmOption(); break; default: return(0); return(1); /* SLE4442卡校验密码函数 函数原型: uchar IChkpsw_4442(uchar psw1,uchar psw2,uchar psw3); 功能: 进行 SLE4442卡进行密码核对核对后方能进行写操作 说明:操作成功返回0x00,卡无效或卡损坏返回0x01,密码错误返回0x02卡只剩 1次机会返回 0x03. */ uchar IChkps

24、w_4442(uchar psw1,uchar psw2,uchar psw3) uchar ec1; IRcvdat_4442(SCM,0X00,1,ec); if(ec0 /*卡损坏*/ if(ec0 else 石家庄铁道大学四方学院毕业设计 67 ec0=0x05; /*EC的 D0位为 0时判 D1位为 1 */ else ec0=0x06; /*EC的 D0位为 1*/ AnRst(); SendCOM(0x39,0x00,ec0); /*回写 EC字节*/ WrmOption(); SendCOM(0x33,0x01,psw1); WrmOption(); SendCOM(0x33,0x02,psw2); WrmOption(); SendCOM(0X33,0X03,psw3); WrmOption(); SendCOM(0X39,0X00,0Xff); /*修改 EC值*/ WrmOption(); IRcvdat_4442(SCM,0X00,1, if(ec0 return(0x00); 石家庄铁道大学四方学院毕业设计 68 附录D 硬件照片

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1