#pragma code
#include "REG51F.H" //单片机寄存器定义
#include<absacc.h> //绝对地址访问
#include<intrins.h> //内部函数:nop等
sbit RST=P0^0; //定义引脚-IC卡复位信号引脚
sbit CLK=P0^1; //定义引脚-IC卡时钟信号引脚
sbit DAT=P0^2; //定义引脚-IC卡数据信号引脚
sbit LED0=P1^0; //定义引脚-运行指示灯引脚
sbit LED1=P1^1; //定义引脚-运行指示灯引脚
sbit LED2=P1^2; //定义引脚-运行指示灯引脚
sbit LED3=P1^3; //定义引脚-运行指示灯引脚
sbit LED4=P1^4; //定义引脚-运行指示灯引脚
sbit LED5=P1^5; //定义引脚-运行指示灯引脚
sbit LED6=P1^6; //定义引脚-运行指示灯引脚
sbit LED7=P1^7; //定义引脚-运行指示灯引脚
bit Dat_IO,Flag_Read,Flag_Write;
unsigned char n;
unsigned char idata Read_Dat[128];
/*unsigned char code Write_Dat[128]={
1,0,0,0,0,1,1,0,
0,0,0,0,0,1,0,0,
0,0,1,0,0,0,1,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,1,0,1,
1,1,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,
};//*/
void INT_UART(void) interrupt 4
//功能: 串口中断函数
//输入: 无
//返回: 无
{
unsigned char Rx232; //接收数据缓存变量
if(RI)
{//接收中断
Rx232=SBUF; //缓存数据
if(Rx232=='R')
{
Flag_Read=1;
}
else if(Rx232=='W')
{
Flag_Write=1;
}
RI=0; //清除中断标志
}
if(TI)
{//发送中断
if(n<128)
{
/* CLK=1; //地址递增
_nop_();
CLK=0; //地址递增
_nop_();
n=n+1; //地址递增
DAT=1; //准备读数
Dat_IO=DAT; //读取数据
if(Dat_IO)SBUF='1'; //发送数据
else SBUF='0'; //发送数据*/
SBUF=Read_Dat[n]; //发送数据
n=n+1; //地址递增
}
TI=0; //清除标志位
}
}
void delay(unsigned char time)
{
unsigned char i;
unsigned char j;
for (i=0;i<time;i++)
{
for(j=0;j<250;j++)
{
}
}
}
/* -------------------------------- 任务函数 -------------------------------- */
void main(void)
//功能: 主函数
//输入: 无
//返回: 无
{
unsigned char i;
RST=0; //初始化IC卡复位信号引脚
CLK=0; //初始化IC卡时钟信号引脚
DAT=1; //初始化IC卡数据信号引脚
// LED0=0;
// LED1=1;
// LED2=0;
// LED3=1;
// LED4=0;
// LED5=1;
// LED6=0;
// LED7=1;
Flag_Read=0;
Flag_Write=0;
//************************************** 单片机-定时器T1初始化
TMOD=0x22; //设置定时器工作模式:T1-波特率发生器
//T1-波特率发生器
//T0-自动重装定时器
// TH1=0xEC; //置初值
// TL1=0xEC; //X2 18.432M 9600波特率
TH1=0xF6; //置初值
TL1=0xF6; //X1 18.432M 9600波特率
TR1=1; //启动定时器T1
SCON=0x50; //设置串口方式:方式1,10位异步通信,1起始位(0),8数据位,1停止位(1)
PCON=0x80; //SMOD=1 倍速
//************************************** 单片机-中断初始化
ES=1; //开串口中断
EA=1; //使能CPU中断
//************************************** 任务启动
while(1)
{
if(Flag_Read)
{
RST=1; //地址清零
delay(5);
CLK=1; //地址清零
delay(5);
CLK=0; //地址清零
delay(5);
RST=0; //地址清零
delay(5);
i=0; //地址清零
DAT=1; //准备读数
delay(5);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[0]='1'; //记录数据
else Read_Dat[0]='0'; //记录数据*/
for(i=1;i<128;i++)
{
CLK=1; //地址递增
delay(5);
CLK=0; //地址递增
delay(5);
DAT=1; //准备读数
delay(5);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[i]='1';//记录数据
else Read_Dat[i]='0'; //记录数据*/
}
Flag_Read=0;
n=0;
SBUF=Read_Dat[n]; //发送数据
n=n+1; //地址递增
}
else if(Flag_Write)
{
RST=1; //地址清零
delay(5);
CLK=1; //地址清零
delay(5);
CLK=0; //地址清零
delay(5);
RST=0; //地址清零
delay(5);
i=0; //地址清零
DAT=1; //准备读数
delay(5);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[0]='1'; //记录数据
else Read_Dat[0]='0'; //记录数据*/
for(i=1;i<64;i++)
{
CLK=1; //地址递增
delay(5);
CLK=0; //地址递增
delay(5);
DAT=1; //准备读数
delay(5);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[i]='1';//记录数据
else Read_Dat[i]='0'; //记录数据*/
}
for(i=64;i<80;i++)
{
CLK=1; //地址递增
delay(25);
CLK=0; //地址递增
delay(25);
RST=1; //允许写
delay(25);
RST=0; //允许写
delay(25);
RST=1; //允许写
delay(25);
RST=0; //允许写
delay(25);
CLK=1; //写操作
delay(25);
CLK=0; //写操作
delay(25);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[i]='1'; //记录数据
else Read_Dat[i]='0'; //记录数据*/
}
for(i=80;i<128;i++)
{
CLK=1; //地址递增
delay(25);
CLK=0; //地址递增
delay(25);
RST=1; //允许写
delay(25);
RST=0; //允许写
delay(25);
RST=1; //允许写
delay(25);
RST=0; //允许写
delay(25);
CLK=1; //写操作
delay(25);
CLK=0; //写操作
delay(25);
RST=1; //启动擦除
delay(25);
RST=0; //启动擦除
delay(25);
RST=1; //启动擦除
delay(25);
RST=0; //启动擦除
delay(25);
CLK=1; //字节擦除
delay(25);
CLK=0; //字节擦除
delay(25);
Dat_IO=DAT; //读取数据
if(Dat_IO)Read_Dat[i]='1';//记录数据
else Read_Dat[i]='0'; //记录数据*/
}
Flag_Write=0;
n=0;
SBUF=Read_Dat[n]; //发送数据
n=n+1; //地址递增
}
else
{
delay(200);
delay(200);
delay(200);
}
LED0=!LED0;
// LED6=!LED6;
// LED7=!LED7;
}
}
//滅
//2-4