8.3.4 SLE4442读写系统的软硬件设计
SLE4442为加密存储卡
1.SLE4432/4442SLE4442为加密存储卡,容量为256 byte。
总密码核对正确之后,才可以对卡读写操作。
该卡前32字节可进行写保护位操作。
总密码错误计数器值为3,核对错误一次,减1操作,若计数值为0,整卡数据锁死。
若3次内有一次核对正确,则计数器恢复初值。
SLE4432特性与4442相似,但无密码操作功能。
功能:●256字节EEPROM;●32位保护存储器;●3字节用户密码,密码错误计数:3次;●温度范围:0℃~70℃;●至少10万次擦写;●至少10年数据保存期。
2.SLE4418/4428卡SLE4428为加密存储卡,容量为1K byte。
总密码核对正确之后,才可以对卡读写操作。
该卡所有数据均可以写保护(固化数据)。
总密码错误计数器值为8。
SLE4418特性与4428相似,但无密码操作功能。
功能:●1024字节的EEPROM ;●1024字节的写保护区(固化数据);●2字节的密码,错误计数8次;●温度范围:-35℃~80℃;●至少100,000次擦写循环;●至少10年数据保存期。
3.SLE4404卡SLE4404是加密存储卡,容量为52 byte。
该卡有一个数据区,容量为26 byte,其读写和擦除操作受总密码,读写属性控制位及擦除密码的控制。
注意:核对正确擦除密码后,数据区的内容全部擦除(为0Xff),然后才可以写入新的数据。
功能:●416位容量;●208位的应用区;●2字节用户密码,密码错误计数器:4次;●温度范围:-35℃~80℃;●至少10,000次循环擦写;●至少10年的数据保存期。
4.SLE4406卡SLE4406是加密存储卡,容量为13 byte。
个人化前,总密码和密码计数器起作用,每核对一次密码,计数器值减1。
个人化后,密码无效,密码区和计数器区成为数据区的一部分:对数据区只能做减值操作。
功能:●104位容量;●最大可提供20 480计数单位;●3字节密码;●温度范围:-35℃~80℃;●至少10,000次循环擦写次数;●至少10年数据保存期;●SLE4406E是为应用电话卡而设置的,是与4406兼容的卡片。
SLE4442通信协议
SLE4442通信协议:数据传输协议是指连接IFD器件和IC之间接口的协议。
它与“S=A”类型的协议是相同的。
在I/O的所有数据的变化是由CLK的下降沿上确定的。
数据传递协议由四个模式组成:-复位并应答复位-命令模式-数据输出模式-处理模式以上模式为操作模式注意:I/O引脚是漏极开路引脚,因此需要外接上拉电阻以获得高电平。
一、数据传输协议:1、应答和复位应答应答复位是根据ISO7816-3标准产生的。
复位信号可以在操作过程中的任何时候给出。
起始时,地址计数器被设成零,当RST状态从“H”变到“L”时,伴随着一个始终脉冲第一个数据比特被输出到I/O口。
随后再输入另外的31个连续时钟脉冲,第一个4个编址EEPROM单元内容被读出来了。
第33个时钟脉冲将I/O口转换成高阻态并且结束了ATR 程序。
应答复位:(Hex):字节1字节2字节3字节4DO7…DO0DO15…DO8DO23…DO16DO31…DO242、命令模式在应答复位之后,芯片接着就等待命令。
每一个命令都是伴随一个起始位开始的,三个字节的长命令后紧跟着一个额外的始终脉冲并且以一个停止位结束。
-起始位:时钟为H状态时,I/O的下降沿作为起始态;-结束位:时钟为H状态时,I/O的上升沿作为结束条件。
当接收一个命令后,芯片有两种可能的状态:-数据输出模式,以便读取数据;-处理模式,用以檫除和写数据。
3、数据输出模式:在这个模式下,IC卡将数据输出到IFD.当第一个时钟脉冲下降沿过后,第一个数据比特位在I/O口有效。
当数据的最后一个比特位输送完成后,将有一个额外的时钟脉冲使得I/O口变成高阻态并且为IC卡接收下以命令做准备。
在这种模式下,任何的开始和结束标志信号都将被丢弃。
4、处理模式:工作在这种模式中IC卡执行内部处理。
IC的时钟脉冲要持续不断直到因第一个时钟下降沿而变成L态的I/O口状态变回高阻态。
在此状态下任何形式的开始和结束标志均视为无效。
SLE4442 ch
此协议为两线连接,与其他设备构成完整的 IC 电路,所有 I/O 口的数据变化都 是在时钟的下降沿开始的。
此协议包括四种模式:
- 复位与复位应答 - 命令模式 - 输出数据模式 - 内部处理模式
注意:由于 I/O 脚是开漏型的所以需要外接上拉电阻以提供高电平
第 5 页 共 23 页
2003-11-20
hSttIpE:M//EwwNw.SeSleLcEfa4n4s4.2co技m 术电子手发册烧友
电子技术论坛
Ver 1.0
2.2.1 复位与复位应答(ATR)
应答复位的发生是依照 ISO7816-3 标准,可以在操作的任何时候产生复位。开始 时给 I/O 脚低电平并在 RST 信号由高到低其间提供一个时钟脉冲,此时 I/O 脚输 出了有效数据的第一位(LSB),此后连续的 31 个时钟脉冲读出了 EEPROM 中的 4 字节标头数据,第 33 个时钟脉冲使 I/O 脚变为高阻状态完成了 ATR 过程。
模式
输出 处理 输出 处理 输出 处理 处理
第 8 页 共 23 页
2003-11-20
hSttIpE:M//EwwNw.SeSleLcEfa4n4s4.2co技m 术电子手发册烧友
电子技术论坛
Ver 1.0
2.3.1 读主存储器
电子技术论坛
Ver 1.0
2.3.4 写保护存储器
此操作包含了输入数据与原数据的比较。假设输入的数据与要保护的数据一致, 则该地址的数据将不能在改写了;如果比较的结果不同,那么此次操作无效。
例如:
主存储器 10H 单元的数据为 3DH,现在要保护此单元的数据不被改写。
《RFID技术及应用》课程标准
《RFID技术及应用》课程标准课程代码: 0231603课程类别:专业方向课课程属性:限选课学分/学时: 4.5学分/ 72学时制订人:审订人:适用专业:物联网应用技术电子工程系一、制订课程标准的依据本课程标准以《中华人民共和国高等教育法》和《中华人民共和国职业教育法》专科教育应当使学生掌握本专业必备的基础理论、专门知识,具有从事本专业实际工作的基本技能和初步能力、教高〔2000〕2号《关于加强高职高专教育人才培养工作的意见》精神为指导,依据物联网应用技术专业人才培养方案对课程的教学要求而制订。
二、课程的性质《RFID技术及应用》课程是物联网应用技术专业人才培养方案中专业方向课下的职业综合能力模块课程之一,是该专业的一门限选课。
三、本课程与其它课程的关系四、课程的教育目标五、课程的教学内容与建议学时(72学时)六、课程教学设计指导框架七、教学基本条件1.对教师的基本要求(1)团队规模:基于每届2个教学班的规模,专兼职教师4人左右,其中,专职教师2人,兼职教师2人,职称和年龄结构合理,互补性强。
(2)教师专业背景与能力要求:主讲教师应为电子信息大类专业本科以上学历,熟悉RFID技术及物联网前沿知识,具备一定的一卡通系统开发与维护经验,具有较强的语言表达能力及职业教学方法的能力,掌握一定的教学方法与教学艺术。
(3)课程负责人:熟悉物联网应用技术专业相关技术和高职教育规律、实践经验丰富、教学效果好、在行业有一定影响、具有中级及以上职称的“双师”教师。
2.教学硬件环境基本要求为保证教学效果,理论与实训应一体化教学,课程教学要求在智能电子实训室进行,每位学生单独使用智能卡与RFID实验设备,每组学生(3-4人/组轮流使用一套智能一卡通系统。
另外,还应有相应的学生参观实习基地。
3.教学资源基本要求(1)《RFID技术及应用》多媒体网络课程资源。
(2)参考书目《RFID技术及应用》,曾宝国、程远东编著,重庆大学出版社,2014年出版,版本:1。
推荐-基于SLE4442卡的食堂管理系统设计 精品
1 绪论IC卡,又称集成电路卡(Integrated Circuit Card)或者智能卡(Smart Card),是继磁卡,光电卡之后的新一代标识卡。
此类卡具有智能又方便携带的优点,为现代信息处理和传输提供了一种全新的方法。
随着社会的不断进步,科学技术的进步,超大规模集成电路、大容量存储芯片以及信息安全技术的发展,IC技术也在不断进步,应用领域不断地扩大,以IC卡为媒介的单片机售饭系统就是一个例子。
IC卡的应用提高了人们的生活水平和工作的效率,为人们带来了方便实惠,加快了现代化进度,已经成为一个国家科技水平现代化程度的标志之一。
食堂IC卡是适应于就餐人数密集的食堂收费系统,该系统从根本上解决了餐券流通过程中的伪造、丢失,细菌交叉感染等一系列的问题,促进饮食服务管理向规范化、系统化和科学化的方向发展。
本次设计采用单片机,外加液晶显示电路、按键控制电路、IC卡接口电路、蜂鸣器报警电路,可以实现充值、扣费、报警等多项功能。
本系统具有设计低功耗,可靠性,智能化及低成本等特点。
系统采用5V 的直流电源供电。
整个系统程序编写所用的软件:Keil。
本此设计的食堂IC卡系统利用单片机AT89S51控制整个系统。
显示部分采用LCD1602液晶显示器,能够支持字符和数字输出,简单明了。
键盘采用4*4矩阵键盘模块,输入方便。
IC卡采用了西门子公司的SLE4442逻辑加密卡。
最终实现了预期的充值、扣费、复位、报警等功能。
设计结果表明,此系统设计容易,结构简单,造价低廉,维修方便,能够广泛应用于各种单位的食堂中。
1.1选题背景以前,各种企事业单位的食堂,人员就餐所用的都是纸质或塑胶质的饭票、菜票、饭卡,或是直接使用现金交易,学校也不例外。
但是,这种食堂运作方式存在着方方面面的不足:操作繁琐:传统的食堂收费方式从饭票的印制、售卖、回收、点数、结算每个环节都采用人工进行,且每天、每月都需进行着重复的统计工作,令人繁不胜烦。
逻辑加密卡4442资料
第2章 接触式IC卡技术
(4) AT88SC1604卡的操作界面如图2.4所示。
通过操作我们发现,AT88SC1604卡的存储容量为16 384 b(2048 B)。它采用单存储器多逻辑分区结构,主存储器除划分 了特定的标志数据区和控制数据区之外,还将应用数据区分成 四个完全隔离的子区,并在每个子区中配备了各自的读、写控 制标志和写入/擦除密码以及密码输入错误计数器等逻辑控制。 AT88SC1604卡是一种按字节操作的大容量逻辑加密卡。
第2章 接触式IC卡技术 图2.4 AT88SC1604卡的操作界面
第2章 接触式IC卡技术
2.2 接触式IC卡的基本物理特性
所谓接触式IC卡,就是在使用时,通过有形的金属电极 触点将卡的集成电路与外部接口设备直接接触连接,提供集成 电路工作的电源并进行数据交换的IC卡。其特点是在卡的表面 有符合ISO/IEC 7816标准的多个金属触点。
录卡型。
(2) 进入卡操作界面对电话卡进行读/写/擦除操作,在表2.1 中记录操作结果及操作条件。
表2.1 电话卡存储结构记录表
区域名 字段内容
字节地址
字节数
读/写/擦除条件
第2章 接触式IC卡技术 4) 使用DEMO软件访问SLE4442卡
(1) 将SLE4442卡插入读写器卡座,选择卡型,进入卡操作 界面。
第2章 接触式IC卡技术
第2章 接触式IC卡技术
2.1 实训1:接触式存储器卡与逻辑加密卡的存储结构 2.2 接触式IC卡的基本物理特性 2.3 接触式IC卡的芯片技术 2.4 典型存储器卡 2.5 实训2:接触式存储器卡的操作控制 2.6 典型逻辑加密卡 2.7 实训3:接触式逻辑加密卡的操作控制 2.8 接触式IC卡接口技术 思考题
逻辑加密卡4442分析
第2章 接触式IC卡技术 4) 使用DEMO软件访问SLE4442卡 (1) 将SLE4442卡插入读写器卡座,选择卡型,进入卡操作 界面。 (2) 对SLE4442卡进行读/写/擦除操作,在表2.2中记录操作 结果及操作条件。 表2.2 SLE4442卡存储结构记录表
触式IC卡读写器DEMO软件(使用方法参见厂商提供的使用手册)。
(2) 实训器件:AT24C01卡、SLE4442卡、AT88SC1604卡
(白卡,实验室准备),IC卡电话卡(已发行,自备)。
第2章 接触式IC卡技术
3.实训步骤与要求
1) 通用接触式IC卡读写器及DEMO软件的安装 (1) 按系统提示安装通用接触式IC卡读写器DEMO软件。 (2) 按标志连接通用接触式IC卡读写器的电源线及串口线, 注意电源 +5 V与地不可接反。 2) 使用DEMO软件访问AT24C01卡 (1) 按使用手册的说明操作演示软件,对通用接触式IC卡读 写器进行建立连接操作。
制标志和写入/擦除密码以及密码输入错误计数器等逻辑控制。 AT88SC1604卡是一种按字节操作的大容量逻辑加密卡。
第2章 接触式IC卡技术 5.思考 (1) 若要构成一个接触式IC卡门禁系统,应采用哪一种卡, 为什么?与传统的锁加钥匙的方式相比较,由接触式IC卡及其 读写器构成的接触式IC卡门禁系统有何优胜之处?
第2章 接触式IC卡技术 (4) AT88SC1604卡的操作界面如图2.4所示。 通过操作我们发现,AT88SC1604卡的存储容量为16 384 b(2048 B)。它采用单存储器多逻辑分区结构,主存储器除划分 了特定的标志数据区和控制数据区之外,还将应用数据区分成
项目二
(5)声光提示、显示等功能
(6)工作供电,能支持USB取电。
任务二 读写器硬件设计与制作
2.硬件设计与制作 1)硬件方案设计
(1)硬件组成分析
硬件组成框图
PC机 (应用软件系统)
SLE44 42卡
串行通信接口电路
声光提示电路
单片机最小系统 STC89C52RC
SLE4442接口电路
5V直流电源电路
任务二 读写器硬件设计与制作
2.硬件设计与制作
引脚功能:
1电源: ①VCC - 芯片电源,接+5V; ②VSS - 接地端; 2.时钟: XTAL1、XTAL2 - 晶体振荡电路反相输入端和输出端。 3.控制线: 控制线共有4根: ALE/PROG:地址锁存允许/片内EPROM编程脉冲 ① ALE功能:用来锁存P0口送出的低8位地址 ② PROG功能:片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。 PSEN:外ROM读选通
任务二 读写器硬件设计与制作
1.硬件需求分析
接触式逻辑加密卡是读写器与应用系统之间信息交互的桥梁, 在国标中也称为接口设备,其功能需求因应用环境不同而不同。 在硬件方面应满足如下要求。 (1)插卡、拔卡自大 动检测功能
(2)上电、下电控制功能
(3)与卡的数据交互功能 (4)与PC等其他设备的数据交互功能
(2)SLE4442/SLE5542卡存储结
采用多存储器结构,主要包括3个存储器: ● 256X8位EEPROM(可擦写可编程)型主存储器
● 32X1位的PROM(可编程)型保护存储器
● 4X8位的EEPROM型加密存储器
任务一 认知应用领域、存储结构及安全特性
3.安全特性
接触式逻辑加密卡的特战法是采用了硬件加密逻 辑,使其在底层具有密码校验和防伪能力,如 SLE4442 卡,由于采用了多存储器结构,对于主 存储器可以任意谳取,但对主存器应用数据区的 写入(或擦除),则需经加密逻辑单元校验码成 功方可执行,而对主存器保护数据区的写入(或 擦除),不仅需要进行密码校验,还需保护存储 器允许写入(或擦除)才可执行。
智能卡技术__深圳职业技术学院(24)--智能卡与RFID技术期末考试试卷(样卷)
5.请将下列专业词汇译成中文。
RFID ICC COS SN Anticollision
五、综合题(选做二题,每题 20 分,共 40 分)
【得
分: 】
1. 请在下表的卡中为智能小区管理系统选择最为合适的一种智能卡,实现小区的门禁、
Hale Waihona Puke (20 分)电子信息工程技术专业 《智能卡与 RFID 技术》试题 A 第 4 页 (共 7 页)
2.试设计一台非接触式 IC 卡饭堂收费机。 (1) 画出非接触式 IC 卡饭堂收费机硬件框图。 (2) 若系统采用 Mifare 1 卡,试编程读出卡中余额,并按键扣款,画出主程序流程图, 说明所调用的功能函数的作用及卡对该函数的应答。 (20 分)
天线的( )
A. 天线的工作频率
B. 天线的增益
C. 天线的极化方向
D. 天线的波瓣宽度
三、判断题(每题 1 分,共 10 分)
【得分:
】
( )1.大多数非接触式 IC 卡的工作电压由卡内的电池提供。 ( )2.MIFARE 1非接触式IC卡读写器的读写距离可达1m。 ( )3.高频卡工作频率为13.56MHz,其读写距离远大于工作频率为125KHz 的低频卡。 ( )4.目前银行卡普遍采用磁卡的原因是磁卡的安全性高于IC卡。 ( )5.逻辑加密卡多采用限制连续输入的错误密码的次数的方式来防止“用户密码”被 非授权持卡人恶意跟踪猜测。 ( )6.IC卡上不能再贴磁条,以免卡芯片与磁条相互干扰。 ( )7.SLE4442卡读写器校验用户密码只需编程执行比较校验数据命令即可。 ( )8.为实现不带电插拔IC卡,在对IC卡进行读写操作的过程中应使卡座的VCC端一直保 持低电平。 ( )9.常用于CPU卡的DES算法是私钥加密算法。 ( )10.EPCglobal所规定的RFID系统工作频率为125KHz
SLE4442卡程序
//读主存储器 //写主存储器 //读保护存储器 //写保护存储器 //读安全存储器 //写安全存储器
ic 卡模 ic 卡模 ic 卡模 ic 卡模 ic 卡模 ic 卡模
//比较安全存储器 ic 卡模 //存放复位响应数据
/**********************************************/ /* control line state settings */ /**********************************************/ /*******************************************************/ /* interface routines */ /*******************************************************/ /*1. ISSUE a xstart condition */ void ic_start() { sclk=0; sdio=1; Delay(3); sclk=1; Delay(3);
SLE4442 卡简介及驱动程序
一、主要指标 1、256 字节 EEPROM 组织方式 2、32 位保护存储器组成方式 3、3 字节用户密码,密码错误计数:3 次 4、温度范围:0℃~70℃ 5、至少 100,000 次擦写循环 6、至少 10 年数据保存期 二、存储区分配 见下图示:
三、功能描述 1、写保护区(前 32 个字节)的每一字节可单独进行写保护,进行写保护 后,内容不可再更改(即固化数据)。 2、密码核对正确前,全部数据均可读,如果有需要,可对数据进行适当
//存放复位响应数据
_nop_(); _nop_(); rst=0; return (*ret_data); } //读命令 //uchar comm_type; 30h,34h,31h; //uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff; uchar rd_main_ram(uchar *data_save_addr,uchar read_start_addr,uint read_bytes) { uint data i; ic_start(); out_byte(RD_MAIN_RAM); out_byte(read_start_addr); out_byte(read_start_addr); ic_stop(); // read_data_temp[0]=read_bytes; for(i=0;i<read_bytes;i++) {*data_save_addr++=read_data();} ic_break(); return (1); } //ic_card 在处理模式时进行监测是否处理完毕,最大延时 255 个时钟 void proc_mode_chek() { uint data i; for(i=0;i<512;i++) { if (sdio!=0){ i=511;} else{clock();} } } //写命令子程序 //uchar comm_type; 38h,3ch,39h,33h; //uchar read_start_addr; comm_type=30h:00-0xff;comm_type=34h:00-0xff; void write_eepram(uchar comm_type,uchar write_start_addr,uchar write_data) { ic_start(); out_byte(comm_type); out_byte(write_start_addr); out_byte(write_data); ic_stop();
SLE4442智能卡的读写程序
for(i=0;i<4;i++);_NOP();_NOP();_NOP();
P1OUT&=~BIT0; //DATA--L ,START
for(i=0;i<4;i++);_NOP();_NOP();_NOP();
=_READ_C;
//P1.2 --- CLK
//P1.0 --- DAT
//P1.3 --- RST
//主频2M
//供电电压3.3V
/******************************************************************************
IC卡复位
****************************************************************************/
P1OUT&=~BIT2;
for(i=0;i<1;i++); //CLK--L
P1OUT|=BIT0; //DATA--H
}
/************************************************/
void IC_READ_MAIN(void) //设置地址,控制命令
void IC_WRITE(void) //写数据
{
int i,j,k;
k=_WRITE_A;
k=(256-k);
k*=8;
k++;
P1DIR|=BIT2+BIT0; //输出
P1OUT|=BIT0; //DATA--H
基于SLE4442校园一卡通模拟系统
7科技资讯 S CI EN CE & T EC HNO LO GY I NF OR MA TI ON 信 息 技 术由于多种证卡(热水卡、上机卡、借书证等)共存,师生携带和使用很不方便。
为了解决师生使用多种证卡的不便,缓解后勤管理和保障服务的压力,提高学校的管理服务水平,建设“校园一卡通系统”成为学校信息化建设的首要任务。
“校园一卡通系统”的建设,将有效促进后勤管理工作效率,更好地为师生员工提供服务。
从根本上实现“一卡在手,走遍校园”的设想。
实现全校各类数据的统一性和规范性;提高学校的现代化管理水平。
本文就校园一卡通系统用单片机作为控制模拟了系统的实现,具有一定的教学和现实意义。
1 设计方案单片机S TC 89C 52RC 为控制核心的校园一卡通,要求:插卡可显示该卡主人的姓名、学号及金额,可用模拟向卡里充钱,购物后可以显示余额。
本系统中选用的IC卡是SLE4442,是德国西门子(SIMENS)公司设计的逻辑加密存储卡。
它具有2K 位的存储容量和完全独立的可编程代码存储器(PSC)。
内部电压提升电路保证了芯片能够以单+5V 电压供电,较大的存储容量能够满足通常应用领域的各种需要。
因此是目前国内应用较多的一种IC 卡芯片芯片采用多存储器结构2线连基于S L E 4442校园一卡通模拟系统程俊红(石家庄职业技术学院 河北石家庄 050081)摘 要:本文给出了一种关于SLE4442的IC卡读写器的实际设计方法。
根据IC卡的基本工作原理,用STC89C52来控制IC卡读写器。
模拟了校园一卡通系统。
可实现身份识别、模拟了如何向卡里充钱、消费后显示余额。
关键词:SLE4442 IC卡 身份识别中图分类号:TP393.09文献标识码:A 文章编号:1672-3791(2012)09(c)-0007-01接协议(串行接口满足ISO7816同步传送协议),NMO S工艺技术,每字节的擦除/写入编程时间为2.5ms,存储器具有至少10000次的擦写周期数据保持时间至少10年。
IC 4442 资料
逻辑加密存储SLE4442卡及其应用1SIMENS它具有2K 位的存储容量和完全独立的可编程代码存储器较大的存储容量能够满足通常应用领域的各种需要芯片采用多存储器结构串行接口满足ISO7816同步传送协议NMOS工艺技术存储器具有至少10000次的擦写周期 芯片引脚SLE4442的触点安排见下图起引脚的定义和功能说明如下表芯片功能SLE4442 IC卡主要包括三个存储器1µØÖ·0~31为保护数据区写入受保护存储内部数据状态的限制N=0~31¶ÔÓ¦Ö÷´æ´¢Æ÷ÖеÚN个字节允许进行擦除和写入操作数据读出不受限制这种加密校验的控制是对整个主存储器实施的2一次性编程以保护主存储器保护数据区保护存储器同样受加密存储器数据校验结果的影响3第0字节为密码输入错误计数器芯片初始化时设置成EC的13字节为参照字存储区PSC其读出比较芯片内部逻辑结构传送协议复位和复位响应在操作期间的任意时候都可以复位地址计数器随一个时钟脉冲而被设置为零H LÈôÁ¬ÐøÊäÈë32个时钟脉冲在第33个始终脉冲的下降沿命令模式芯片等待着命令启动状态整个命令包括3个字节停止状态启动状态H状态I/O显得下降沿为启动状态在CLK为高状态期间在接受一个命令之后输出数据模式和处理数据模式3输出数据模式的时序关系在第一个CLK脉冲的下降沿之后随后每增加一个时钟脉冲骑术除数叙事从每个字节的最低位开始需要在附加一个时钟脉冲来把I/O置成高状态在输出数据期间启动状态停止状态处理数据模式处理模式的时序关系芯片在第一个始终脉冲的下降沿此后芯片在内部连续计时计数完成芯片的处理过程芯片的复位方式 外部复位芯片的副位时序如前述2在把操作电压连接到Vcc段之后I/O线被置为高状态对任意地址进行读操作或做一个复位响应操作之后才可以进行数据交换3在CLK为低状态期间则任何操作均无效需要一个最小维持时间tres=5Us之后中止状态的时序关系如下图芯片又准备下一个操作1每条命令包含三个字节MSB 控制字 LSB MSB 地址字 LSB MSB 数据字 LSBB7 B6 B5 B4 B3 B2 B1 B0 A7 A6 A5 A4 A3 A2 A1 A0 D7 D6 D5 D4 D3 D2 D1 D0 SLE4442芯片具有七种命令字节1字节2字节3功能命令模式B7~B0 A7~A0 D7~D030H 地址数无效读主储存器输出数据模式38H 地址数输入数据修改主储存器处理模式34H 无效无效读保护储存器输出数据模式3CH 地址数输入数据写保护储存器处理模式31H 无效无效读加密储存器输出数据模式39H 地址数输入数据修改加密储存器处理模式33H 地址数输入数据比较校验数据处理模式注意写入时首先传送的也是字节的最低为输入数据必须与原有数据相等比较校验数据流程如下具体操作参照程序;*****************************************************************************SLE4442 通用读写模块使用说明ReadCard 读出从StartAdr开始的ByteNum字节,结果存放于ReadBuf中,读出正确, ACC中返回#0,返回#01表示无效卡或者卡损坏写卡之前一定要调用CheckPassword核对密码,密码存放于PSW开始的三个单元,ACC中返回#0表示核对正确,#01表示无效卡或者卡损坏,#02表示密码错#04H表示该卡还有一次试验机会若要对保护存储区进行写保护参数及返回值与WriteCard相同参数及返回值同ReadCard PSWD EQU 54H ;3字节密码单元 ByteNum EQU 57H StartAdr EQU 58H ;Bit Variabal RST BIT P0.7 IO BIT P1.7 CLK BIT P1.6 PWR BIT P0.6 ;IC卡上电位,子程序中未用 ;Constant Idetify1 EQU 0A2H ;此处为保护区00 ̄03单元的值,用于识别卡 Idetify2 EQU 13H Idetify3 EQU 10H Idetify4 EQU 91H ;******************************************** ;从主存储器中读出数据块 ReadCard: LCALL ANRST JNZ ReadExit MOV R0,#ReadBuf MOV R2,ByteNum MOV R5,StartAdr LCALL Remm MOV A,#00H ReadExit: RET ;********************************************* ;修改主存储器中的数据块 WriteCard: LCALL ANRST JNZ WriteExit MOV R0,#WriteBuf MOV R2,ByteNum MOV R5,StartAdr WriteLoop: MOV A,@R0 MOV R6,A LCALL Wrmm INC R0 INC R5 DJNZ R2,WriteLoop MOV A,#00H WriteExit: RET ;******************************************** ;从保护存储器中读出数据块ReadProtect: LCALL ANRST JNZ RpExit MOV R0,#ReadBuf MOV R2,ByteNum MOV R5,StartAdr LCALL Repm MOV A,#00H RpExit: RET ;********************************************* ;保护保护数据区中的数据块以避免卡损坏获取错误计数器值 MOV A,EC ANL A,#07h JZ IsBadCard ;EC=00 SJMP ChkPsw2 ChkPsw1: RRC A JNC HaveOneChance ;该卡还有一次试验机会 MOV A,EC ANL A,#05H JZ HaveOneChance ;该卡还有一次试验机会 ChkPsw2: MOV R5,#00H MOV R6,A LCALL Wrscm ;将EC写回卡 MOV R2,#3 MOV R5,#01H ;卡内密码首址 MOV R0,#PSWD ;参考数据首址 ChkPswLoop: MOV A,@R0 MOV R6,A LCALL Verda ;开始核对密码 INC R0 INC R5 DJNZ R2, ChkPswLoop MOV R5,#00H MOV R6,#0FFH LCALL Wrscm ;擦除错误计数器 LCALL Rescm ;读错误计数器以检查核对是否成功 MOV A,EC ANL A,#07H CJNE A,#07H,IS_FAIL ;错误计数器不能擦除核对密码成功 CheckExit: RET IS_FAIL: ;核对密码失败 MOV A,#02H RET IsBadCard: MOV A,#03H RET HaveOneChance地址SendComm: SETB IO ;产生开始状态 LCALL Delay10uS SETB CLK LCALL Delay5uS CLR IO LCALL Delay5uS CLR CLK ;发送命令 MOV A,R4 LCALL SendByte MOV A,R5 LCALL SendByte MOV A,R6 LCALL SendByte ;产生停止状态 CLR IO LCALL Delay5uS SETB CLK LCALL Delay5uS SETB IO LCALL Delay5uS RET ;***************************************** SendByte: ;发送一个字节数据 MOV R3,#8 SendLoop: RRC A MOV IO,C LCALL Delay10uS ; SETB CLK LCALL Delay10uS CLR CLK DJNZ R3,SendLoop RET ;************************************************** ;R2--Byte number, R5--Start adress,@r0--return data ;************************************************** Repm: ;设置读保护存储器命令 MOV R4,#34H SJMP RmStart Remm: ;设置读主存储器命令 MOV R4,#30H RmStart: LCALL SendComm RmLoop: CLR A MOV R3,#8 RmByte: CLR CLK NOP NOP NOP NOP SETB IO NOP MOV C,IO RRC A NOP NOP SETB CLK LCALL Delay10uS DJNZ R3, RmByte MOV @R0,A INC R0 DJNZ R2, RmLoop LCALL Break ;中止操作 RET ;******************************************************************** Break: CLR CLK LCALL Delay5uS SETB RST LCALL Delay5uS CLR RST RET ;*********************************************************************** Verda: MOV R4,#33H ;设置比较校验数据命令 SJMP WrStart Wrscm: MOV R4,#39H ;设置修改加密存储器命令 SJMP WrStart Wrpm: MOV R4,#3CH ;设置修改保护存储器命令 SJMP WrStart Wrmm: MOV R4,#38H ;设置修改主存储器命令 WrStart: LCALL SendComm WrmOption: CLR CLK NOP NOP NOP NOP SETB IO NOP MOV C,IO JC WrmOK ;如果 I/O 返回高状态 DJNZ R2,rescm2 CLR CLK LCALL Delay5uS RET ;************************************************************************** Anrst: MOV R0,#EC SETB RST ;产生复位响应时序 LCALL Delay5uS ; SETB CLK LCALL Delay10uS ; CLR CLK LCALL Delay5uS ; CLR RST ;接受复位响应值 MOV R2,#4 anrst1: MOV R3,#8 anrst2: LCALL Delay10uS ; SETB CLK SETB IO NOP NOP MOV C,IO RRC A LCALL Delay5uS CLR CLK DJNZ R3,anrst2 MOV @R0,A INC R0 DJNZ R2,anrst1 ;以下代码根据复位响应返回值判断卡的合法性及有效性 MOV R0,#EC MOV A,@R0 CJNE A,#Idetify1,CardErr INC R0 MOV A,@R0 CJNE A,#Idetify2,CardErr INC R0 MOV A,@R0 CJNE A,#Idetify3,CardErr INC R0 MOV A,@R0 CJNE A,#Idetify4,CardErr MOV A,#00H RET CardErr: MOV A,#01H RET ;******************************************* Delay10uS: ;延时10Us MOV R7,#06H DJNZ R7,¥ RET ;******************************************* Delay5uS: ;延时5Us MOV R7,#02H ; DJNZ R7,¥ RET ;******************************************** 2读主存储器读保护存储器读保护数据区校验密码子程序1机器周期1uSNOPNOPNOPNOPENDM;卡的复位和复位响应程序;出口数据是卡号CLR CLKDELAY5uSCLR RSTMOV R2,#04H ;读出四个字节ANRST_L1: MOV R3,#08HANRST_L2: DELAY5uS ;复位响应SETB IONOPNOPMOV C,IO ;数据在上升沿有效返回在ACCRCVBYTE:CLR AMOV R3,#08HRCVB_L1: CLR CLKDELAY5uSSETB IONOPNOPMOV C,IORRC ANOPNOPSETB CLKDELAY5uSDJNZ R3,RCVB_L1RET;中止操作子程序;因为读出是连续的R4地址数 R6MOV A,R5ACALL SENDBYTEMOV A,R6ACALL SENDBYTECLR IO ;产生结束信号DELAY5uSSETB CLKDELAY5uSSETB IODELAY5uSRET;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;软件包接口命令;读主存储器子程序;入口参数为STARTADRBYTENUM读取字节数;要写入的数据依次保存在WRBUF处IWRMM_4442:ACALL ANRSTMOV R5,STARTADRMOV R0,#WRBUFMOV R2,BYTENUMWRMM_L1: MOV R4,#38H ;命令字MOV A,@R0MOV R6,AINC R5INC R0ACALL WRMOPTIONDJNZ R2,WRMM_L1RET;读加密存储器;读出数据放在RDBUFIRDSCM_4442:ACALL ANRSTMOV R4,#31HACALL SENDCOM ;发送读加密存储器指令 MOV R2,#04HMOV R0,#RDBUFRDSCM_L1: ACALL RCVBYTE ;读出加密字节MOV @R0,AINC R0DJNZ R2,RDSCM_L1CLR CLKDELAY5uSRET;写加密存储器;将WRBUF缓冲区的数据IWRSCM_4442:ACALL ANRSTMOV R5,STARTADR ;要写入的地址MOV R0,#WRBUF ;要写入数据区指针MOV R2,BYTENUM ;写入字节数WRSCM_L1: MOV R4,#39HMOV 06H,@R0ACALL SENDCOMINC R5INC R0ACALL WRMOPTIONDJNZ R2,WRSCM_L1RET;读保护存储器;将保护存储器32位数据读入RDBUFIRDPRM_4442:ACALL ANRSTMOV R4,#34HMOV R0,#RDBUFMOV R2,BYTENUMMOV R5,STARTADRRDPRM_L1: ACALL RCVBYTE ;接收保护存储器数据字节MOV @R0,AINC R0DJNZ R2,RDPRM_L1ACALL BREAKRET;写保护存储器;将WRBUF的X位数据写入保护存储器3字节方可校对密码JZ HAVEONECHANCE ;若只有一次机会退出操作ANL A,#05H ;将第二位置为0JZ HAVEONECHANCECHKPSW2: MOV STARTADR,#00H ;进行校验操作MOV WRBUF,AMOV BYTENUM,#01HACALL IWRSCM_4442 ;回写ECMOV A,WRBUF+4MOV WRBUF,AMOV R2,#03HMOV R5,#01HMOV R0,#WRBUFCHKPSWL1: MOV A,@R0MOV R4,#33HMOV R6,AACALL SENDCOMACALL WRMOPTIONINC R0INC R5DJNZ R2,CHKPSWL1 ;三字节密码校验完毕 MOV WRBUF,#0FFHMOV BYTENUM,#01HMOV STARTADR,#00HACALL IWRSCM_4442 ;擦除错误计数器ACALL IRDSCM_4442MOV A,RDBUFANL A,#07HCJNE A,#07H,IS_FAILMOV A,#00HRETIS_FAIL: MOV A,#02HRETISBADCARD: MOV A,#03HRETHAVEONECHANCE: MOV A,#04HRET;占用了ACC R2R4R6及CY位CLKIRQ3把对卡的操作如读主存储器校验密码使用了枚举变量的方法把操作存储器区分开串行接口满足ISO7816同步传送协议注意:函数是采用软件延时的方法产生CLK脉冲,固对高晶振频率要作一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)********************************************************************/ #include <reg764.h> /*头文件的包含*/#include <intrins.h>#define uchar unsigned char /*宏定义*/#define MAM 0 /*定义主存储器代号*/#define SCM 1 /*定义加密存储器代号*/#define PRM 2 /*定义保护存储器代号*/#define _Nop() _nop_() /*定义空指令*/#define DELAY5us() _Nop();_Nop();_Nop();_Nop();_Nop()/*端口位定义*/sbit RST=P1^0;sbit IO=P1^6;sbit CLK=P1^1;/*******************************************************************起动总线函数函数原型: void Start_COM();功能: 启动发送命令起始条件.********************************************************************/ void Start_COM(){IO=1; /*发送起始条件的数据信号*/_Nop();CLK=1;DELAY5us(); /*起始条件建立时间大于4.7us,延时*/IO=0; /*发送起始信号*/DELAY5us(); /*起始条件锁定时间大于4×¼±¸·¢ËÍ»ò½ÓÊÕÊý¾Ý */_Nop();_Nop();}/*******************************************************************结束总线函数函数原型: void Stop_COM();功能: 命令发送结束信号s*/ DELAY5us(); 发送总线结束信号*/ IO=1; /*_Nop();_Nop();}/*******************************************************************字节数据传送函数函数原型: void SendByte(uchar c);功能: 将数据c发送出去,可以是命令,也可以是数据通知被控器开始接收数据位*/ DELAY5us(); /*保证时钟高电平周期大于4********************************************************************/uchar RcvByte(){uchar retc;uchar BitCnt;retc=0;for(BitCnt=0;BitCnt<8;BitCnt++){CLK=0; /*置时钟线为低s*/ 置时钟线为高使数据线上数据有效*/ CLK=1; /*_Nop();_Nop();retc=retc>>1;if(IO==1)retc=retc+0x80; /*读数据位,接收的数据位放入retc中 */_Nop(); _Nop();}CLK=0;_Nop();_Nop();return(retc);}/*******************************************************************复位和复位响应函数函数原型复位IC卡并接收响应字节*******************************************************************/ void AnRst(){RST=1; /*产生复位时序*/DELAY5us();CLK=1;DELAY5us();CLK=0;DELAY5us();RST=0;_Nop();RcvByte(); /*读出32字节响应数据*/RcvByte();RcvByte();RcvByte();}/*******************************************************************发送4442处理脉冲函数函数原型发送处理模式指令后要调用此程序发送脉冲if(IO==1)break; /*没有处理完则继续发送脉冲*/CLK=1;DELAY5us();}}/*******************************************************************中止操作函数函数原型中止当前操作void SendCOM(ucahr com1,ucahr com2,uchar com3);功能发送3字节命令字结束命令area为存储器类型num为读取数据字节数说明参数area错误返回0bit IRcvdat_4442(uchar area,uchar addr,uchar num,uchar buf[]) {uchar i;switch(area){case MAM: AnRst(); /*复位SLM4442卡area为存储器类型num为读取数据字节数说明参数area错误返回0bit ISenddat_4442(uchar area,uchar addr,uchar num,uchar buf[]){uchar i;switch(area){case MAM: AnRst();for(i=0;i<num;i++){SendCOM(0X38,addr+i,*buf); /*写主存储器*/buf++;WrmOption(); /*发送操作脉冲*/}break;case SCM: AnRst();for(i=0;i<num;i++){SendCOM(0x39,addr+i,*buf)buf++;WrmOption();}break;case PRM: AnRst();for(i=0;i<num;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卡进行密码核对说明卡无效或卡损坏返回0x01,密码错误返回0x02uchar ec[1];IRcvdat_4442(SCM,0X00,1,ec);if((ec[0]&0x07)==0)return(0x01); /*卡损坏*/if((ec[0]&0x06)==0){if((ec[0]&0x05)==0)return(0x03);else ec[0]=0x05; /*EC的D0位为0时*/ } else ec[0]=0x06; /*EC的D0位为1*/AnRst();SendCOM(0x39,0x00,ec[0]); /*回写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,ec[0]);if((ec[0]&0x07)!=0x07)return(0x02);return(0x00);}/* END */。
功能SLE4442IC卡读写程序
功能SLE4442IC卡读写程序;//************************************************************;文件名: Icard FOR MCU51;功能: SLE4442 IC卡读、写程序; 对IC卡地址单元区块进行读写操作,并比较读写结果是否一致。
;接线: P10、P11、P12对应接IC卡的SDA、SCL、RESET。
;//***********************************************************;---------------------------------------------------------------------;命令字SLE4442READMAINMEMORY EQU 30H ;读主存储区SLE4442READPROTECTIONMEMORY EQU 34H ;读保护存储区SLE4442UPDATEMAINMEMORY EQU 38H ;写主存储区SLE4442WRITEPROTECTIONMEMORY EQU 3CH ;写保护存储区SLE4442READSECURITYMEMORY EQU 31H ;读保密存储区SLE4442COMPAREVERIFYCATIONDATA EQU 33H ;比较验证资料SLE4442UPDATESECURITYMEMORY EQU 39H ;更新保密存储区;---------------------------------------------------------------------;缓冲区ATRDATA EQU 30H ; 4字节复位应答ICCOMMAND EQU 34H ; 3字节命令ICADDRESS EQU 35H ; 1字节地址ICDATAIN EQU 36H ; 1字节数据ICLENGTH EQU 37H ; 1字节读写长度ICCODE EQU 38H ; 3字节密码ICDATA EQU 3BH ; 32字节读写数据;---------------------------------------------------------------------SDA EQU P1.0SCL EQU P1.1RST EQU P1.2;---------------------------------------------------------------------ORG 000HLJMP MAIN1ORG 00100HMAIN1: MOV SP,#60HMOV R0,#ICCODE ;送密码:3个0FFHMOV @R0,#0FFHINC R0MOV @R0,#0FFHINC R0MOV @R0,#0FFHLCALL SLE4442_RDSM_EC ;读错误计数器LCALL SLE4442_VERIFY ;校验密码LCALL SLE4442_RDSM_EC ;读错误计数器MAIN:MOV ICADDRESS,#20H ;送起始地址MOV ICLENGTH,#20H ;送长度LCALL SLE4442_RDMM ;读主存储区NOP ;此处设置断点,察看3BH-5AH的值(IC卡为空时全0FFH)MOV R4,#20HMOV R0,#ICDATACLR AMOV A,#00HLOOP1: MOV @R0,A ;待写数据INC AINC R0DJNZ R4,LOOP1NOP ;此处设置断点,察看3BH-5AH的值(00H-1FH)MOV ICADDRESS,#20HMOV ICLENGTH,#20HLCALL SLE4442_WRMM ;写主存储区MOV R4,#20HMOV R0,#ICDATACLR ALOOP2: MOV @R0,A ;数据区清零,更改3BH-5AH的值便于比较INC R0DJNZ R4,LOOP2NOP ;此处设置断点,察看3BH-5AH的值(全零)LCALL SLE4442_RST_ATR ;MOV ICADDRESS,#20HMOV ICLENGTH,#20HLCALL SLE4442_RDMM ;读主存储区NOP ;此处设置断点,察看3BH-5AH的值(00H-1FH)SJMP $;====================================== ===============================;SubName : ICDelay 延时程序;Function: make a delay period (about 10us);Input :;OutPut :;---------------------------------------------------------------------ICDelay:NOPNOPNOPNOPRET;====================================== ===============================;SubName : CardPulse 时钟脉冲;Function: make a pulse on SCL pin;Input :;OutPut :;---------------------------------------------------------------------CardPulse:SETB SCLLCALL ICDelay ; 延时程序CLR SCLLCALL ICDelay ; 延时程序RET;====================================== ===============================;SubName : CardRdByte 读字节;Function: read one byte from the card on SDA pin;Input :;OutPut : A;---------------------------------------------------------------------CardRdByte:MOV R3,#8SETB SDACLR ARdbyte:MOV C,SDARRC ALCALL CardPulse ;时钟脉冲DJNZ R3,RdByteRET;====================================== ===============================;SubName : CardWrByte 写字节;Function: write one byte to the card on SDA pin;Input : A;OutPut :;---------------------------------------------------------------------CardWrByte:MOV R3,#8WrByte:RRC AMOV SDA,CLCALL CardPulseDJNZ R3,WrByteRET;====================================== ===============================;SubName : SLE4442_RST_ATR 复位与应答;Function: reset the card and the answer to reset;Input :;OutPut : (ATRDATA),(ATRDATA+1),(ATRDATA+2),(ATRDATA+3) ; : 0xA2,0x13,0x10,0x91;---------------------------------------------------------------------SLE4442_RST_ATR:CLR RSTCLR SCLLCALL ICDelaySETB RSTLCALL ICDelaySETB SCLLCALL ICDelayCLR SCLLCALL ICDelayCLR RSTLCALL ICDelayMOV R0,#ATRDATA ;#30HMOV R4,#4ATR:LCALL CardRdByteMOV @R0,AINC R0DJNZ R4,ATRRET;====================================== ===============================;SubName : SLE4442_SendCommand 发送命令 3字节;Function: send a 3-byte command to the card;Input : ICCOMMAND,ICADDRESS,ICDATAIN; : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2);OutPut :;---------------------------------------------------------------------SLE4442_SendCommand:;Start conditionSETB SCLLCALL ICDelayCLR SDALCALL ICDelayCLR SCL;3-byte commandMOV R0,#ICCOMMANDMOV R4,#3SendCommand:MOV A,@R0LCALL CardWrByteINC R0DJNZ R4,SendCommand;Stop conditionCLR SCLCLR SDALCALL ICDelaySETB SCLLCALL ICDelaySETB SDALCALL ICDelayCLR SCLLCALL ICDelayRET;====================================== ===============================;SubName : SLE4442_RDMM 读主存储区;Function: read main memory from the card;Input : ICADDRESS,ICLENGTH; : (ICCOMMAND),(ICCOMMAND+1),(ICCOMMAND+2);OutPut : (ICDATA),(ICDATA+1) ...;---------------------------------------------------------------------SLE4442_RDMM:LCALL SLE4442_RST_ATRMOV ICCOMMAND,#SLE4442READMAINMEMORYLCALL SLE4442_SendCommandMOV R0,#ICDATAMOV R4,ICLENGTHRDMM:LCALL CardRdByteMOV @R0,AINC R0DJNZ R4,RDMMRET;====================================== ===============================;SubName : SLE4442_RDPM 读保护存储区;Function: read protect memory from the card;Input :;OutPut : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3);---------------------------------------------------------------------SLE4442_RDPM:LCALL SLE4442_RST_ATRMOV ICCOMMAND,#SLE4442READPROTECTIONMEMORY LCALL SLE4442_SendCommandMOV R0,#ICDATAMOV R4,#4RDPM:LCALL CardRdByteMOV @R0,AINC R0DJNZ R4,RDPMRET;====================================== ===============================;SubName : SLE4442_WRMM 写主存储区;Function: write main memory to the card;Input : ICADDRESS,ICLENGTH; : (ICDATA),(ICDATA+1) ...;OutPut :;---------------------------------------------------------------------SLE4442_WRMM:LCALL SLE4442_RST_ATRMOV R5,ICLENGTHMOV ICCOMMAND,#SLE4442UPDATEMAINMEMORYMOV R1,#ICDATAWRMM1:MOV ICDATAIN,@R1LCALL SLE4442_SendCommandMOV R4,#0FFHWRMM2:LCALL CardPulseDJNZ R4,WRMM2INC ICADDRESSINC R1DJNZ R5,WRMM1RET;====================================== ===============================;SubName : SLE4442_WRPM 写保护存储区;Function: write protect memory to the card;Input : ICADDRESS,ICLENGTH; : (ICDATA),(ICDATA+1) ...;OutPut :;---------------------------------------------------------------------SLE4442_WRPM:LCALL SLE4442_RST_ATRMOV R5,ICLENGTHMOV ICCOMMAND,#SLE4442WRITEPROTECTIONMEMORY MOV R1,#ICDATAWRPM1:MOV ICDATAIN,@R1LCALL SLE4442_SendCommandMOV R4,#0FFHWRPM2:LCALL CardPulseDJNZ R4,WRPM2INC ICADDRESSINC R1DJNZ R5,WRPM1RET;====================================== ===============================;SubName : SLE4442_RDSM 读保密存储区;Function: read secret memory from the card;Input :;OutPut : (ICDATA),(ICDATA+1),(ICDATA+2),(ICDATA+3);---------------------------------------------------------------------SLE4442_RDSM:LCALL SLE4442_RST_ATRMOV ICCOMMAND,#SLE4442READSECURITYMEMORYLCALL SLE4442_SendCommandMOV R0,#ICDATAMOV R4,#4RDSM:LCALL CardRdByteMOV @R0,AINC R0DJNZ R4,RDSMRET;====================================== ===============================;SubName : SLE4442_RDSM_EC 读错误计数器;Function: read error counter from the card;Input :;OutPut : A;---------------------------------------------------------------------SLE4442_RDSM_EC:LCALL SLE4442_RST_ATRMOV ICCOMMAND,#SLE4442READSECURITYMEMORYLCALL SLE4442_SendCommandLCALL CardRdByteRET;====================================== ===============================;SubName : SLE4442_WRSM 更新保密存储区;Function: write secret memory to the card;Input : ICADDRESS; : (ICDATA);OutPut :;---------------------------------------------------------------------SLE4442_WRSM:LCALL SLE4442_RST_ATRMOV R5,#1MOV ICCOMMAND,#SLE4442UPDATESECURITYMEMORY MOV R1,#ICDATAWRSM1:MOV ICDATAIN,@R1LCALL SLE4442_SendCommandMOV R4,#0FFHWRSM2:LCALL CardPulseDJNZ R4,WRSM2INC ICADDRESSINC R1DJNZ R5,WRSM1RET;====================================== ===============================;SubName : SLE4442_UPDATEPSC 更新密码;Function: update PSC to the card;Input : (ICDATA),(ICDATA+1),(ICDATA+2);OutPut :;---------------------------------------------------------------------SLE4442_UPDATEPSC:LCALL SLE4442_RST_ATRMOV R5,#3MOV ICCOMMAND,#SLE4442UPDATESECURITYMEMORYMOV ICADDRESS,#01HMOV R1,#ICCODEPSC1:MOV ICDATAIN,@R1LCALL SLE4442_SendCommandMOV R4,#0FFHPSC2:LCALL CardPulseDJNZ R4,PSC2INC ICADDRESSINC R1DJNZ R5,PSC1RET;====================================== ===============================;SubName : SLE4442_SENDPSC 比较验证资料;Function: compare PSC to the card;Input : (ICDATA),(ICDATA+1),(ICDATA+2);OutPut :;---------------------------------------------------------------------SLE4442_SENDPSC:MOV R5,#3MOV ICCOMMAND,#SLE4442COMPAREVERIFYCATIONDATAMOV ICADDRESS,#01HMOV R1,#ICCODEPSC21:MOV ICDATAIN,@R1LCALL SLE4442_SendCommandMOV R4,#123PSC22:LCALL CardPulseDJNZ R4,PSC22INC ICADDRESSINC R1DJNZ R5,PSC21RET;====================================== ===============================;SubName : SLE4442_VERIFY 校验密码;Function: verify the card;Input : (ICDATA),(ICDATA+1),(ICDATA+2);OutPut : A (error counter);---------------------------------------------------------------------SLE4442_VERIFY:LCALL SLE4442_RDSM_ECANL A,#07HCJNE A,#00H,VERI1RETVERI1:CJNE A,#07H,VERI21MOV A,#03HSJMP VERI2VERI21:CJNE A,#06H,VERI22MOV A,#02HSJMP VERI2VERI22:CJNE A,#05H,VERI23MOV A,#01HSJMP VERI2VERI23:CJNE A,#04H,VERI24MOV A,#00HSJMP VERI2VERI24:CJNE A,#03H,VERI25MOV A,#01HSJMP VERI2VERI25:MOV A,#00HVERI2:MOV ICDATA,AMOV ICADDRESS,#00HLCALL SLE4442_WRSMLCALL SLE4442_SENDPSCMOV ICDATA,#07HMOV ICADDRESS,#00HLCALL SLE4442_WRSMLCALL SLE4442_RDSM_ECANL A,#07HRET;-------------------------------------------------------------------END。
4244dm技术手册
4244dm技术手册一、引言4244DM技术手册是为了方便用户了解和使用4244DM技术而编写的一份详细指南。
本手册涵盖了4244DM技术的概述、基本原理、使用方法以及常见问题解答等内容,旨在帮助用户熟悉并正确使用4244DM技术,提高工作效率。
二、技术概述4244DM技术是一种先进的数字管理系统,具有高效、稳定和可扩展性等优点。
它采用先进的算法和数据处理技术,能够有效地处理大量数据,并提供实时可靠的管理服务。
三、基本原理4244DM技术基于先进的数据处理原理,通过采集、处理和分析大量数据,以实现对目标系统的全面管理。
其核心原理包括数据采集、数据处理、数据存储和数据分析等关键环节。
1. 数据采集4244DM技术通过与目标系统的接口连接,实时地采集系统产生的各种数据,包括温度、湿度、压力等参数数据,同时还可以采集系统的状态信息、报警事件等。
2. 数据处理采集到的数据经过处理和筛选,去除异常值和噪音数据,以确保数据的准确性和可靠性。
通过运用先进的算法和模型,对数据进行分析和预测,提取出有价值的信息。
3. 数据存储处理后的数据将被存储在数据库中,以便后续的查询和分析。
数据存储设计合理,能够满足对大量数据的高效存储和快速检索要求。
4. 数据分析通过对存储的数据进行分析,可以获得对目标系统的全面了解,发现问题和隐患,并及时采取相应的措施进行优化和改进,以提高系统的性能和可靠性。
四、使用方法4244DM技术的使用方法简单明了,用户只需按照以下步骤进行操作即可。
1. 系统安装将4244DM技术软件安装到目标系统中,并与系统接口进行连接。
在安装过程中,用户需要按照提示进行相应的设置和配置。
2. 数据采集启动4244DM技术软件,配置好数据采集参数,选择需要采集的数据类型和频率。
根据实际需求,可以灵活地进行配置。
3. 数据分析通过软件界面,用户可以查看实时数据和历史数据,进行数据分析和统计。
软件提供了丰富的数据处理和分析功能,用户可以根据需要进行选择和使用。
接触式ic卡sle4442卡读写实验
接触式ic卡sle4442卡读写实验接触式IC卡(SLE4442卡)读写实验一. 实验目的了解接触式IC 卡的知识,学会如何根据时序逻辑图编写实用程序。
二. 实验设备及器件IBM PC 机一台DP-51PROC 单片机综合仿真实验仪一台三. 实验内容根据IC 卡的读写时序图编写程序,实现IC 卡(SLE4442)的读写。
四. 实验要求根据IC 卡的时序图编写51 单片机程序读写逻辑加密IC 卡(SLE4442)读写程序。
五、实验线路与实验原理接触式IC 卡的触点定义遵循ISO7816规定, IC 卡8 个触点分布位置如图3.23 所示,对应着DP-51PROC 单片机综合仿真实验仪“D8IC 卡” 区IC 卡座上方的引线。
本实验使用的是SLE4442卡, SLE4442 的触点安排见图3.24。
图3.24 IC 卡触点分布图图3.25 SLE4442 的触点安排本实验SLE4442 卡与单片机的引脚连线关系见表3.4。
表3.4 SLE4442 与单片机引脚连线单片机实验仪板上对应引线 SLE4442 引脚P1.0 TP1 I/OP1.1 TP4 CLKP1.2 TP3 RST下面介绍SLE4442 的有关知识5.1 概述SLE4442 是德国西门子(SIMENS)公司设计的逻辑加密存储卡。
它具有2K 位的存储容量和完全独立的可编程代码存储器(PSC)。
内部电压提升电路保证了芯片能够以单+5V 电压供电,较大的存储容量能够满足通常应用领域的各种需要。
因此是目前国内应用较多的一种IC 卡芯片。
芯片采用多存储器结构,2 线连接协议(串行接口满足ISO7816 同步传送协议),NMOS 工艺技术,每字节的擦除/写入编程时间为2.5ms。
存储器具有至少10000 次的擦写周期,数据保持时间至少10 年。
SLE4442 IC 卡主要包括三个存储器 :(1)256x8 位EEPROM 型主存储器。
地址0~31 为保护数据区,该区数据读出不受限制,写入受保护存储内部数据状态的限制。
SLE4442卡硬件设计及制作报告
SLE4442卡硬件设计与制作报告摘要:本文详细介绍了一种基于单片机直接读写的IC卡读卡器设计的思路和方法,并给出了相应的程序流程和程序实例。
关键词:SLE4442卡;读卡器引言随着现代生活的开展,IC卡的应用越来越广泛,对IC卡读卡器的需求也趋于多样化。
本文以SIEMENS SLE4442卡为例介绍了一种基于单片机〔89C51〕直接读写接触式IC卡的简易读卡器,它可以嵌入到电业管理或燃气收费等系统中,也可以作为一个独立读卡器对IC卡进展操作,配合不同的软件可以应用的不同的行业。
读卡器硬件电路设计SLE4442卡简介平安SLE4442卡部有一个256 8bit EEPROM,不可逆的4个写保护字节,具备密码保护功能,可以随时读取主存储器容;在校验成功后,可读保护存储器、读写存储器和写主存储器。
SLE4442有一个密码逻辑,用以控制对存储器的读写。
为此,SLE4442包含一个4字节加密存储区,该存储区有一个错误计数器EC〔0-2位〕和三个字节的参考数据,这三个字节作为一个整体,称为可编程密码〔PSV〕。
整个数据区除了参考数据,其它的数据都能被读取,在校验数据与部参考数据比较正确后才能进展读写操作,连续三次比较错误后,错位计数器将阻止任何比较尝试,从而也消除了任何擦写操作。
系统总体框图及设计思路利用AT89C51的P1端口直接对IC卡的时钟、复位、数据端口进展操作,AT89C51的串口和主控机通信。
系统采用智能式工作方式,通过主控机交互的人机界面命令单片机对IC卡进展不同的读写操作。
由于接触式IC卡采用的是两线连接协议,硬件连接简单。
如果要设计一个可同时读写不同IC卡的读卡器,可通过单片机的P1口串接两路4053,经过译码,配合不同的单片机软件就可适用于各种各样的接触式IC卡。
系统总框图读卡器单片机软件设计为使汇编语言程序易读易维护,采用模块化设计、屡次调用子程序方式。
图1 硬件连接示意图U1_LedVSLE5.0V图1硬件需求分析本设计硬件需求分析着眼于插卡/拔卡自动检测功能、上电/下点控制功能、与卡的数据交换功能、与PC等其它设备的数据交互功能和其它特定功能五局部组成。
sle4428
sle4442程序(ic卡程序,C语言源代码)//*********************FileName:Main.c*********************////*********************Author:*****************************////********************V ersion:1.2*************************////******************LastUpdate:2004-11-03*****************//#include <io8535v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned int//**********定义全局变量*******************////查表0 1 2 3 4 5 6 7 8 9 E F P OFF uchar table[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x71,0x73,0x00}; uchar ICcode[4];//定义IC卡复位时读出的4字节代码;uchar ICcontent[14];//定义IC卡有效信息;uchar Money[5];//定义IC卡内金额;uchar EEEEE[5]={0x79,0x79,0x79,0x79};uchar FFFFF[5]={0x71,0x71,0x71,0x71};uchar IC_Flag;//定义IC卡上电标志;uchar Num_Flag;//数标志;uchar Add_Flag;//加标志uchar Sub_Flag;//减标志uchar Init_Flag;//初始化标志uchar Repair_Flag;//修卡标志;uchar Enter_Flag;//确认标志uchar Point_Flag;//.标志uchar Key_Flag; //按键标志;//***********IC卡引脚信号处理***************//void V oice(uchar PD) //V oice=PD^7{if(PD==1) PORTD|=0x80;//V oice置1else PORTD&=~80; //V oice置0}void RST(uchar PD) //RST=PD^6{if(PD==1) PORTD|=0x40;//RST置1else PORTD&=~0x40;//RST置0}void CLK(uchar PD) //CLK=PD^5{if(PD==1) PORTD|=0x20;//CLK置1else PORTD&=~0x20;//CLK置0}void IO(uchar PD) //IO=PD^4{if(PD==1) PORTD|=0x10;//IO置1else PORTD&=~0x10;//IO置0}void SetIO(uchar i)//设置IO口属性{if(i==1) DDRD=0xf0; //IO口输出:1111 0000else DDRD=0xe0; //IO口输如:1110 0000PORTD=0x00;//不带上拉电阻;}//**********延时函数(Us数量级)*********////单周期指令执行时间,执行时间1/8us*分频系数(取8分频则刚好1us);void DelayUs(uchar i){for(;i!=0;i--)NOP();}//****************延时函数(Ms数量级)*********//void DelayMs(uint i){uchar j,k;for(;i!=0;i--){for(k=0;k<4;k++){for(j=250;j!=0;j--) NOP();}}}//****************接收数据**************//uchar ReceiveData(void){uchar count;uchar value;uchar io_value;value=0;SetIO(0);//设置IO脚为输入;CLK(0);//IO=1;for(count=0;count<8;count++){value=value>>1;CLK(1);DelayUs(2);io_value=PIND;CLK(0);DelayUs(2);if(io_value&0x10==0x10) value|=0x80;//判断IO脚是否为1 else value&=0x7f;}return (value);}//********************发送数据************//void SendData(uchar Xdata){uchar count;uchar value;SetIO(1);////设置IO脚为输出;value=Xdata;for(count=8;count!=0;count--){CLK(0);if((Xdata<<(count-1))&0x80) IO(1);else IO(0);CLK(1);DelayUs(2);CLK(0);}}//****************IC卡复位************************// void ResetIC(uchar *Xdata){uchar count;SetIO(1); //设置IC卡引脚的属性RST(0);CLK(0);IO(1);DelayUs(5);RST(1);DelayUs(5);CLK(1);DelayUs(5);CLK(0);DelayUs(5);RST(0);for(count=4;count!=0;count--){*Xdata=ReceiveData();Xdata+=2;}}//*******************Start条件****************//void Start(void){SetIO(1);CLK(0);IO(0);DelayUs(2);CLK(1);IO(1);DelayUs(2);IO(0);CLK(0);}//*******************Stop条件****************//void Stop(void){CLK(0);IO(0);DelayUs(2);CLK(1);IO(0);DelayUs(2);IO(1);DelayUs(2);IO(0);}//******************处理过程**************//void Process(void){uint j;SetIO(1);//设置IO脚为输出脚CLK(0);DelayUs(5);IO(0);for(j=255;j>0;j--){CLK(1);DelayUs(5);CLK(0);DelayUs(5);}IO(1);}//****************说明*********************////*********输出模式接口命令,包括读主存储器30H,读保护存储器34H,读安全代码的接口命令31H***********////******处理模式数据接口命令,包括写主存储器38H,写保护存储器3CH,写安全代码39H,校验安全代码33H*******//void Command(uchar Byte1,uchar Byte2,uchar Byte3){Start();SendData(Byte1);SendData(Byte2);SendData(Byte3);Stop();}/**********读主存储器**************/void ReadMainMemory(uchar addr,uchar *p,uchar N){Command(0x30,addr,0xff);do{*p=ReceiveData();p++;}while(--N);}/**********读保护存储器***********/void ReadProtectMemory(uchar *p){uchar i=4;Command(0x34,0xff,0xff);do{*p=ReceiveData();p++;}while(i--);}/************写主存储器************/void WriteMainMemory(uchar Address,uchar Data){Command(0x38,Address,Data);Process();}/**************写保护存储器**********/void WriteProtectMemory(uchar Address,uchar Data){Command(0x3c,Address,Data);Process();}/**************读安全存储器************/void ReadSafeMemory(uchar *p){uchar i;Command(0x31,0xff,0xff);for(i=0;i<4;i++){*p=ReceiveData();p++;}}/*************写安全存储器***************/void WriteSafeMemory(uchar Address,uchar Data) {Command(0x39,Address,Data);//Address=0,1,2,3 Process();}/**************校验密码*******************/ uchar V erifyPassword(uchar *p){uchar temp[4];//暂存4字节保护密码;uchar i;ReadSafeMemory(temp);//读安全代码以取得错误计数器if((temp[0]&0x07)!=0){if((temp[0]&0x07)==0x07) i=0x06;if((temp[0]&0x07)==0x06) i=0x04;if((temp[0]&0x07)==0x04) i=0x00; WriteSafeMemory(0,i);for(i=1;i<4;i++,p++){Command(0x33,i,*p);Process();}WriteSafeMemory(0,0xff);ReadSafeMemory(temp);if((temp[0]&0x07)==0x07) return(0x1);}return(0);}//*************SLE4442函数结束*****************////*************数据变换**********//void Change(uchar *Source,uchar *Destination,uchar N) {uchar i,temp;for(i=0;i<N;i++){temp=Source[i];Destination[i]=temp>>4;Destination[2*i+1]=temp&0x0f;}}//***********密码错误报警***********************// void Buzzle_Password(void){uchar i;for(i=0;i<2;i++){V oice(0);DelayMs(1000);V oice(1);DelayMs(1000);}}//**********非法卡错误报警*************************//void Buzzle_Card(void){uchar i;for(i=0;i<2;i++){V oice(0);DelayMs(3000);}}//*************余额不足报警**********************//void Buzzle_Money(void){uchar i;for(i=0;i<1;i++){Buzzle_Password();Buzzle_Card();}}//*********************读卡函数********************////说明://函数使用的数组参数用来存放读出的余额值;//返回值信息://0:卡坏!//1:非法卡(特征值不正确)//2:非法卡(特征值正确,帐号不正确)//3:读卡成功!uchar Read_Card(uchar *p){uchar i,tag=0,temp[4];ReadSafeMemory(temp);if(temp[0]==0x07){ReadMainMemory(32,p,14);//读主存储器14字节:32-35特征码;36-3A帐号;3B-3F余额if(p[0]==0x00&&p[1]==0x0f&&p[2]==0xf0&&p[3]==0xff)//特征码:0x00,0x0f,0xf0,0xff {for(i=0;i<10;i++)if((p[i+4]>=0&&p[i+4]<=9)) tag=tag+1;if(tag!=10) return(2);else return(3);}elsereturn(1);}else return(0);}//*********************卡初始化函数********************////说明://函数使用的数组参数用来存放写入的的ID值;//返回值信息://2:初始化失败!//3:初始化成功!uchar Initial_Card(uchar *p){uchar Psw[3]={0xff,0xff,0xff};uchar i,j,temp=0;uchar tp[20];// ResetIC(ICcode);//IC卡复位,读出复位后的厂家信息代码A2131091;j=V erifyPassword(Psw);WriteMainMemory(32,0x00);//写特征码:WriteMainMemory(33,0x0f);WriteMainMemory(34,0xf0);WriteMainMemory(35,0xff);for(i=0;i<5;i++)//写帐号WriteMainMemory(36+i,p[i]);//从32+i地址开始写5字节帐号;for(i=0;i<5;i++)WriteMainMemory(41+i,0);//从32+i地址开始写5字节初始化金额0000.0 j=Read_Card(tp);if(j==3){for(i=0;i<10;i++)if(p[i]==tp[i+4]) temp=temp+1;}if(temp==10) return(3);else return(2);}//***************卡修复函数********************////说明://返回值信息://0:修复失败!//1:修复成功!uchar Repair_Card(void){uchar Psw[3]={0xff,0xff,0xff};uchar i,j,temp;i=V erifyPassword(Psw);return(i);}//********************加卡函数***********//void Add_Card(uchar *p){uchar i;uchar temp[14];i=Read_Card(temp);if(i==3){temp[13]=temp[13]+p[4];if(temp[13]>9) {temp[13]=temp[13]-10;temp[12]=temp[12]+1;} temp[12]=temp[12]+p[3];if(temp[12]>9) {temp[12]=temp[12]-10;temp[11]=temp[11]+1;} temp[11]=temp[11]+p[2];if(temp[11]>9) {temp[11]=temp[11]-10;temp[10]=temp[10]+1;} temp[10]=temp[10]+p[1];if(temp[10]>9) {temp[10]=temp[10]-10;temp[9]=temp[9]+1;}WriteMainMemory(41,temp[9]);WriteMainMemory(42,temp[10]);WriteMainMemory(43,temp[11]);WriteMainMemory(44,temp[12]);WriteMainMemory(45,temp[13]);}}//********************减卡函数***********//void Sub_Card(uchar *p){uchar i,B_Flag;uchar temp[14];i=Read_Card(temp);if((i==3)&&(!(temp[9]<p[0]))){if(temp[13]<p[4]) {temp[13]=temp[13]+10-p[4];B_Flag=1;} else temp[13]=temp[13]-p[4];//以上处理小数点右边的数字;if(B_Flag==1){if(temp[12]==0) {temp[12]=9;B_Flag=0;}else temp[12]=temp[12]-1;}//以上对存在借位情况时对小数点左边第一位进行预处理;if(temp[12]<p[3]) {temp[12]=temp[12]+10-p[3];B_Flag=1;} else temp[12]=temp[12]-p[3];//以上处理小数点小数点左边第一位数字;if(B_Flag==1){if(temp[11]==0) {temp[11]=9;B_Flag=0;}else temp[11]=temp[11]-1;}//以上对存在借位情况时对小数点左边第二位进行预处理;if(temp[11]<p[2]) {temp[11]=temp[11]+10-p[2];B_Flag=1;} else temp[11]=temp[11]-p[2];//以上处理小数点小数点左边第二位数字;if(B_Flag==1){if(temp[10]==0) {temp[10]=9;B_Flag=0;}else temp[10]=temp[10]-1;}//以上对存在借位情况时对小数点左边第三位进行预处理;if(temp[10]<p[1]) {temp[10]=temp[10]+10-p[1];B_Flag=1;} else temp[10]=temp[10]-p[1];//以上处理小数点小数点左边第三位数字;if(B_Flag==1){if(temp[9]==0) {temp[9]=0;B_Flag=0;}else temp[9]=temp[9]-1;}//以上对存在借位情况时对小数点左边第二位进行预处理;temp[9]=temp[9]-p[0];//以上处理小数点小数点左边第二位数字;WriteMainMemory(41,temp[9]);WriteMainMemory(42,temp[10]);WriteMainMemory(43,temp[11]);WriteMainMemory(44,temp[12]);WriteMainMemory(45,temp[13]);}}//*****************数码管显示函数********************// void Display(uchar *p){uchar sel,i;sel=0x01;for(i=0;i<6;i++){PORTA=table[p[i]];PORTB=sel;DelayMs(2);sel=sel<<1;}}//****************键盘扫描函数***********************// uchar Key_Scan(void){uchar sccode,recode;PORTC=0xf0;if((PINC&0xf0)!=0xf0){DelayMs(10);if((PINC&0xf0)!=0xf0){sccode=0xfe;while(sccode&0x10!=0x00){PORTC=sccode; //对第一行键盘测试if((PINC&0xf0)!=0xf0){recode=(PINC&0xf0)|0x0f;return((~sccode)+(~recode));}elsesccode=(sccode<<1)|0x01;}}}return(0x00);}//******************按键处理函数*******************//void Key_Process(uchar *p){uchar temp,value;temp=Key_Scan();switch(temp){case 0x11:value=9;Num_Flag=1;break;case 0x21:value=8;Num_Flag=1;break;case 0x41:value=7;Num_Flag=1;break;case 0x12:value=6;Num_Flag=1;break;case 0x22:value=5;Num_Flag=1;break;case 0x42:value=4;Num_Flag=1;break;case 0x14:value=3;Num_Flag=1;break;case 0x24:value=2;Num_Flag=1;break;case 0x44:value=1;Num_Flag=1;break;case 0x18:value=0;Num_Flag=1;break;case 0x28:Point_Flag=1;break;case 0x82:Add_Flag=1;Sub_Flag=0;Key_Flag=1;break;case 0x84:Sub_Flag=1;Add_Flag=0;Key_Flag=1;break;case 0x48:Repair_Flag=1;Key_Flag=1;break;case 0x81:Init_Flag=1;Key_Flag=1;break;case 0x88:Enter_Flag=1;Key_Flag=0;break;default: NOP();}if(Num_Flag==1){p[4]=p[3];p[3]=p[2];p[2]=p[1];p[1]=value;Num_Flag=0;} if(Point_Flag==1){p[0]=value;Point_Flag=0;}if(Add_Flag==1) {Add_Flag=1;Sub_Flag=0;}if(Sub_Flag==1) {Sub_Flag=1;Add_Flag=0;}if(Init_Flag==1) {Init_Flag=1;}if(Repair_Flag==1) {Repair_Card();Repair_Flag=0;}if(Enter_Flag==1){if(Add_Flag==1) {Add_Card(p);Enter_Flag=0;Add_Flag=0;}if(Sub_Flag==1) {Sub_Card(p);Enter_Flag=0;Sub_Flag=0;}if(Init_Flag==1) {Initial_Card(p);Init_Flag=0;}}}//***************中断处理********************////**********定时器2:16ms中断显示一次*******//#pragma interrupt_handler TIMER1_INT:9void TIMER1_INT(void){uchar temp[5],i;for(i=0;i<5;i++)temp[i]=ICcontent[9+i];if(IC_Flag==0) Display(EEEEE);if(IC_Flag==1) Display(FFFFF);if(IC_Flag==3){if(Key_Flag==1)//显示此次操作金额;{Money[1]|=0x80;//显示时加上小数点;Display(Money);}else //显示卡内余额;{temp[4]|=0x80;Display(temp);}}}//*************系统初始化*************//void Initial_System(void){//系统初始化//SPL=0x5f;//A T90S8535的堆栈指针指向最高RAM地址;//SPH=0x02;//IO口初始化;DDRA=0xff; //A口输出高电平PORTA=0xff;DDRB=0xff; //B口输出低电平PORTB=0x00;DDRC=0x0f; //C口高四位输入(不带上拉电阻)低四位输出0 PORTC=0xf0;DDRD=0xff; //D口输出低电平PORTD=0x00;//中断系统初始化(定时器1中断)SREG=SREG|0x80; //I(SREG^7)全局中断使能置位TIMSK=TIMSK|0x40;//TOIE1(TIMSK^2)T/C1溢出中断使能置位TIFR=TIFR|0x40;//TOV1(TIFR^2)T/C1溢出中断标志位写"1"清0 //定时器初始化TCCR1B=TCCR1B|0x20;//定时器时钟分频=CLK/8 (1uS计数)TCNT1H=0xc1;//需要计数16000=0x3E80次,TCNT1L=0x7f;//计数初值0xff-0x3e80=0xc17f;//显示系统初始化IC_Flag=0;//如果IC卡没有上电,则显示的是8.8.8.8.,否则显示IC卡的内容}void main(void){uchar i,j;Initial_System();while(IC_Flag==1){DelayMs(5);ResetIC(ICcode);i=Read_Card(ICcontent);if(i==0) {IC_Flag=0; Buzzle_Password();} //显示EEEE,提示卡坏if((i==1)|(i==2)) {IC_Flag=1;Buzzle_Card();} //显示FFFF,提示非法卡if(i==3){if(ICcontent[12]<5){IC_Flag=3;Buzzle_Money();}else{do Key_Process(Money);while(Enter_Flag!=0);Enter_Flag=0;}}}}SLE4442/SLE4432 pdf datasheet。
基于SLE4442卡的食堂管理系统设计
1 绪论 (2)1.1选题背景 (2)1.2 IC卡发展与应用 (3)1.3 设计意义 (4)2 系统总体方案及硬件选择 (6)2.1系统功能说明 (6)2.2 系统总体方案设计 (6)2.3 IC卡选择 (7)2.4 键盘选择 (7)2.5显示器选择 (8)3 硬件电路设计 (9)3.1单片机最小系统电路 (9)3.2 SLE4442部分 (10)3.2.1 SLE4442主要指标 (11)3.2.2 SLE4442引脚的配置 (11)3.2.3 IC卡接口电路 (12)3.3 LCD1602液晶显示部分 (12)3.3.1 LCD1602简介 (12)3.3.2 液晶显示器技术参数 (13)3.3.3显示原理 (13)3.3.4 LCD1602操作指令 (14)3.3.5液晶显示电路 (16)3.4 4*4矩阵键盘 (16)3.5 蜂鸣报警电路 (17)4 软件设计 (18)4.1流程框图 (19)4.2 子程序流程图 (19)4.2 .1扣费子程序流程图 (19)4.2.2充值子程序流程图 (20)5 软硬件调试 (22)5.1在PROTEUS上仿真结果 (22)5.2调试中出现的问题以及解决方法 (24)6 结束语 (25)6.1 结论 (25)6.2 展望 (25)参考文献 (26)附录A:总电路图 (28)附录B:实物图 (29)附录C:主要程序 (30)致谢 (32)1 绪论IC卡,又称集成电路卡(Integrated Circuit Card)或者智能卡(Smart Card),是继磁卡,光电卡之后的新一代标识卡。
此类卡具有智能又方便携带的优点,为现代信息处理和传输提供了一种全新的方法。
随着社会的不断进步,科学技术的进步,超大规模集成电路、大容量存储芯片以及信息安全技术的发展,IC技术也在不断进步,应用领域不断地扩大,以IC卡为媒介的单片机售饭系统就是一个例子。
IC卡的应用提高了人们的生活水平和工作的效率,为人们带来了方便实惠,加快了现代化进度,已经成为一个国家科技水平现代化程度的标志之一。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BreakOperate();
}
函数ReadProtectMen(),实现读保护存储器。入口参数:指向直接寻址数据区的指针。
void ReadProtectMen (uchar idata*pt)
{
ResetCard();
SendComm(RPM_COMM,0xff,0xff); //读保护存储器的命令字
void ReadMainMen (uchar addr,uchar idata*pt,uchar count)
{
ResetCard();
SendComm(RMM_COMM,addr,0cff); //发送读主存命令
ReadMode(pt,count);
BreakOperate();
bit Vreify(uchar idata *pt)
{
uchar idata temp[4]; //暂时存4字节的保密区内容
uchar i;
SendComm(RSM_COMM,0xff,0xff); //读密码存储区的命令字
ReadMode(temp,4);
{
ResetCard();
SendComm(WPM_COMM,addr,*pt); //写保护存储器的命令字
ReadMode();
BreakOperate();
}
函数Vreify(),实现校验密码。入口参数:指向存放密码的内部直接寻址RAM地址,密码:BCD码,从低往高放。返回值:成功返回1,失败或者卡片被锁返回0。
{
uchar I;
for(i=8;i>0;i--)
{
IC_CLK=0;
I/O=(bit)(ch&0x01); //位与后位类型转化进行判断决定I/O的电平
Delay5?s();
IC_CLK=1;
Delay10us();
StopComm(); //结束发送命令
}
void StartComm(void)
{
IC_CLK=0;
I/O=1;
Delay5?s();
IC_CLK=1;
Delay5?s();
I/O=0;
Delay5?s(); //IC_CLK为高时的I/O的一个下降沿
ReadMode(pt,4);
BreakOperate();
}
函数void ProtectByte(),实现:保护一字节,主义保护的字节是已经写入过的,地址只能在保护存储区内。入口参数:IC卡地址,指向直接寻址数据区的指针。
void ProtectByte(uchar CardAdd,uchar idata,*pt)
#define RSM_COMM Ox31 //读密码存储区
#define WSM_COMM Ox39 //写密码存储区
#define RPM_COMM Ox34 //读保护存储区
#define WPM_COMM Ox3c //写保护存储区
}
函数ProcessMode(),实现处理模式,开始处理模式后,卡片将输入口拉低,处理完后输入口变成高电平。
void ProcessMode(void)
{
unit i;
IC_CLK=0;
Delay5?s();
I/O=0;
for(i=255;i>0;i--)
{
i=0x04;
else if((temp[0]&0x07)==0x04 //00000100
i=0x00; //将其中一位为1的改为0
SendComm(WSM_COMM,0,i); //修改错误计数器
void ReadMainMen (uchar addr,uchar idata*pt,uchar count); //读主存
void WriteMainMen (uchar addr,uchar idata*pt,); //写主存
void ReadProtectMen (uchar idata*pt); //读保护存储器
}
函数WriteMainMen(),实现写IC卡主存,1次1字节。入口参数:addr(IC卡地址32~255),pt(指向数据区的指针),i(字节数)。
void WriteMainMen (uchar addr,uchar idata*pt,)
{
ResetCard();
SendComm(WMM_COMM,addr,0cff); //发送写主存命令
void ReadMode(uchar idata *pt,uchar count); //读模式
void ProcessMode(void); //处理模式
void ResetCard(void); //复位
void BreakOperate(void); //中断操作
void StartComm(void); //启动命令
void StopComm(void); //停止命令
if((temp[0]&0x07)!=0) //第一个字节是错误记数,则直接退出
{
if((temp[0]&0x07)==0x07) //00000111
i=0x06;
else if((temp[0]&0x07)==0x06) //00000110
I/O=0;
Delay5?s();
IC_RST=1; //复位启动
Delay5?s();
IC_CLK=1; //启动时钟
Delay10?s();
Delay10?s();
Delay10?s();
Delay10?s();
ch=ch>>1;
}
}
void SendComm(uchar a,uchar b,uchar c)
{
StartComm(); //开始发送命令
WriteByte(a); //发命令字
WriteByte(b); //发地址
WriteByte(c); //发数据
void Delay5?s (void); //延时5?s
函数RestCard(),实现控制卡的复位和复位应答。
void ResetCard(void)
{
uchar temp;
Delay5?s()ห้องสมุดไป่ตู้
IC_RST=0;
IC_CLK=0;
uchar ReadByte(void); //读一个字节
void WriteByte(void); //写入一个字节
void Delay10?s(void); //延时10?s
IC_CLK=0;
Delay5?s();
IC_RST=0;
Delay10?s(); //复位和复位应答时序
temp=ReadByte();
temp=ReadByte();
temp=ReadByte();
temp=ReadByte(); //共读32位,为前4个字节数据
IC_CLK=0;
Delay5?s();
I/O=1;
_nop;
IC_CLK=0;
Delay5?s(); //最后1个位操作
}
uchar ReadByte()
{
uchar i,ch;
ch=0;
for(i=8;i>0;i++)
{
IC_CLK=1;
}
void StopComm(void)
{
IC_CLK=0;
I/O=0;
Delay5?s();
IC_CLK=1;
Delay5?s();
I/O=1;
Delay5?s(); //IC_CLK为高时的I/O的一个上升沿
}
函数ReadMode(),实现连续输入字节(少于255个),存放在pt开头的内部单元中,必须在某一读数据命令模式之后使用。入口参数:pt(起始地址),count(数据个数)。
void ReadMode(uchar idata *pt,uchar count)
{
IC_CLK=0;
Delay5?s();
do
{
*pt=ReadByte(); //读入一个字节
pt++; //指针加1
}while(--count);
ProcessMode();
for(i=1;i<4;i++,pt++) //校对3字节的密码
IC_RST=0;
I/O=0;
Delay5?s();
IC_RST=1;
I/O=1;
Delay5?s();
IC_RST=0; //利用复位中止操作
Delay5?s();
}
函数ReadMianMen(),实现读IC卡主存。入口参数:addr(IC卡地址32~255),指向内部RAM的指针,字节数。出口参数:指向内部RAM的指针 *pt。
ch=ch>>1; //从低位读起
if((uchar)I/O) //根据I/O上的电平判断ch是否加1
ch|-0x80;
Delay5?s();
IC_CLK=1;
}
return ch;
}
void WriteByte(uchar ch)
#define uchar unsigned char
#define uint unsigned int