毕业论文基于单片机的IC卡读写器设计_第1页
毕业论文基于单片机的IC卡读写器设计_第2页
毕业论文基于单片机的IC卡读写器设计_第3页
毕业论文基于单片机的IC卡读写器设计_第4页
毕业论文基于单片机的IC卡读写器设计_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、石家庄铁道大学四方学院毕业设计 基于单片机的基于单片机的 ic 卡读写器设计卡读写器设计 the design of the ic card read-write device based on single chip microcomputer 20122012 届届 电气工程电气工程 系系 专专 业业 学学 号号 学生姓名学生姓名 指导教师指导教师 陈东阳陈东阳 完成日期完成日期 20122012 年年 5 5 月月 1515 日日 毕业设计成绩单 学生姓名 学号 班级 专业 毕业设计题目基于单片机的 ic 卡读写器设计 指导教师姓名 指导教师职称 评 定 成 绩 指导教师得分 评阅人得分

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

3、fe 四个字节作为卡片识别代码。 3、37 区域放置能消费值 mn(钱包值 mn=99) 4、 38 区域放置 mn 的备份 nn, 5、39 区域放置工作时间 tt(tt=0;i-) checksum+=recivebufferi; if(checksum=recivebufferrecivebuffer1+2) return 1; else return 0; void sendtrue(uchar com) /修改ic成功发送的数据 senddata(0 xaa); senddata(0 x55); senddata(com-0 x80); senddata(0 x01); sendda

4、ta(0 x01); senddata(com-0 x80+1+1); senddata(0 xed); void sendfalse(uchar com) /修改ic失败发送的数据 senddata(0 xaa); senddata(0 x55); senddata(com-0 x80); senddata(0 x01); senddata(0 x02); senddata(com+1+2); senddata(0 xed); void main() uchar rec5; uartinit(); timer0init(); et0=1; es=1; ea=1; iscard=1; bee=

5、1; /蜂鸣器 while(1) iscard=1; if(iscard) /无卡 displaytemp=0 xffff; /显示“-” 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 checksum; ircvdat_4442(mam,33,2,rec)

6、; senddata(0 xaa); senddata(0 x55); senddata(0 x01); checksum=0 x01; senddata(0 x02); checksum+=0 x02; senddata(rec0); checksum+=rec0; senddata(rec1); checksum+=rec1; senddata(checksum); senddata(0 xed); else if(recivebuffer0=com_write)/写命令 if(ichkpsw_4442(0 xff,0 xff,0 xff)=0)/密码校验 if(isenddat_4442

7、(mam,33,2, else sendfalse(com_write); else sendfalse(com_write); 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(0 xff,0 xff,0 xff)=0) if(isenddat_4442(mam,33,2,x) sendtrue(com_add); else sendfalse(com_add);

8、 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; x0=y/10; x1=y%10; if(ichkpsw_4442(0 xff,0 xff,0 xff)=0) if(isenddat_4442(mam,33,2,x) sendtrue(com_dec); else sendfalse(com_dec); else

9、sendfalse(com_dec); updisplay(); uchar zhentou2; bit recflag=0; uchar length=0; void uart_isr() interrupt 4 /串口中断 if (ri) ri = 0; /clear receive interrupt flag if(recflag=0) zhentou0=zhentou1; zhentou1=sbuf; if(zhentou0=0 xaa) else recivebufferlength=sbuf; if(recivebufferlength=0 xed) length=0; reci

10、veover=1; recflag=0; else length+; void time0int() interrupt 1/数码中断 if(timecount+=50)/定时50次 timecount=0; disport=displaycodedisplaydatadisplaydig;/输出段选 digport=(digdisplaydig/输出位选 if(displaydig+=3) displaydig=0; (2)sle4442卡函数声名程序 #includestc89c51.h #include #define uchar unsigned char #define uint u

11、nsigned 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 ircvdat_4442(uchar area,uchar addr,uchar num,uchar buf); bit isenddat_4442(uchar area,uchar addr,uchar num,ucha

12、r buf); uchar ichkpsw_4442(uchar psw1,uchar psw2,uchar psw3); (3)sle4442卡操作程序 #includesle4442.h #define uchar unsigned char /*宏定义*/ #define mam 0 /*定义主存储器代号*/ #define scm 1 /*定义加密存储器代号*/ #define prm 2 /*定义保护存储器代号*/ #define _nop() _nop_() /*定义空指令*/ #define delay5us() _nop();_nop();_nop();_nop();_nop(

13、) /*端口位定义*/ sbit rst=p36; sbit io=p34; sbit clk=p35; /* 起动总线函数 函数原型: void start_com(); 功能: 启动发送命令起始条件. */ void start_com() io=1; /*发送起始条件的数据信号*/ _nop(); clk=1; delay5us(); /*起始条件建立时间大于 4.7us,延时*/ io=0; /*发送起始信号*/ delay5us(); /*起始条件锁定时间大于 4 s*/ clk=0; /*钳住总线准备发送或接收数据 */ _nop(); _nop(); /* 结束总线函数 函数原型

14、: void stop_com(); 功能: 命令发送结束信号 */ void stop_com() io=0; /*发送结束条件的数据信号*/ _nop(); /*发送结束条件的时钟信号*/ clk=1; /*结束条件建立时间大于 4 s*/ delay5us(); io=1; /*发送总线结束信号*/ _nop(); _nop(); /* 字节数据传送函数 函数原型: void sendbyte(uchar c); 功能: 将数据c发送出去,可以是命令,也可以是数据 */ void sendbyte(uchar c) uchar bitcnt; for(bitcnt=0;bitcntbit

15、cnt) /*判断发送位 */ else io=0; _nop();_nop(); clk=1; /*置时钟线为高通知被控器开始接收数据位*/ delay5us(); /*保证时钟高电平周期大于 4 s*/ clk=0; /* 字节数据接收函数 函数原型: uchar rcvbyte(); 功能: 用来接收从卡传来的数据 */ uchar rcvbyte() uchar retc; uchar bitcnt; retc=0; for(bitcnt=0;bitcnt1; if(io=1) retc=retc+0 x80; /*读数据位,接收的数据位放入 retc中 */ _nop(); _nop

16、(); clk=0; _nop();_nop(); return(retc); /* 复位和复位响应函数 函数原型 void anrst(); 功能:复位ic卡并接收响应字节 */ void anrst() rst=1; /*产生复位时序*/ delay5us(); clk=1; delay5us(); clk=0; delay5us(); rst=0; _nop(); rcvbyte(); /*读出 32字节响应数据*/ rcvbyte(); rcvbyte(); rcvbyte(); /* 发送4442处理脉冲函数 函数原型 void wrmoption(); 功能:发送处理模式指令后要调

17、用此程序发送脉冲 */ void wrmoption() while(1) clk=0; delay5us(); io=1; _nop();_nop(); if(io=1)break; /*没有处理完则继续发送脉冲*/ clk=1; delay5us(); /* 中止操作函数 函数原型 void breakn(); 功能中止当前操作 */ void breakn() clk=0; delay5us(); rst=1; /*发出中止操作的时序*/ delay5us(); rst=0; /* 命令发送函数 函数原型 void sendcom(ucahr com1,ucahr com2,uchar

18、com3); 功能负责起动命令发送3字节命令 */ void sendcom(uchar com1,uchar com2,uchar com3) start_com(); sendbyte(com1); /*连续发送 3字节指令*/ sendbyte(com2); sendbyte(com3); stop_com(); /* sle4442卡读数据函数 函数原型: bit ircvdat_4442(uchar area,ucahr addr,uchar num,uchar buf); 功能: 对 sle4442卡进行读操作 area为存储器类型 addr为起始地址 num为读取数据字节数 bu

19、f为数据缓冲区指针 说明操作成功返回 1参数 area错误返回 0使用前用判断卡插好没有 */ bit ircvdat_4442(uchar area,uchar addr,uchar num,uchar buf) uchar i; switch(area) case mam: anrst(); /*复位 slm4442卡接收复位响应*/ sendcom(0x30,addr,0 x00); /*读主存储器*/ for(i=0;inum;i+) *buf=rcvbyte(); buf+; breakn(); break; case scm: anrst(); sendcom(0 x31,0 x0

20、0,0 x00); for(i=0;inum;i+) *buf=rcvbyte(); buf+; breakn(); break; case prm: anrst(); sendcom(0 x34,0 x00,0 x00); for(i=0;inum;i+) *buf=rcvbyte(); buf+; breakn(); break; default: return(0); return(1); /* sle4442卡写数据函数 函数原型: bit isenddat_4442(uchar area,ucahr addr,uchar num,uchar buf); 功能: 对 sle4442卡进

21、行写操作 area为存储器类型 addr为起始地址 num为读取数据字节数 buf为数据缓冲区指针 说明:操作成功返回1错误返回0使用前用判断卡插好没有 */ bit 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(0 x39,addr+i,*buf); buf+; wrmoption(); break; case prm: anrst(); for(i=0;inum;i+) sendcom(0 x3c,addr+i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论