📄 duxiexitongrc500.c
字号:
/****************************************************************/
/* main程序头文件 */
/* 主要功能:常量定义 */
/* 修改:liguozhen*/
/* 时间:2008年2月
/****************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <string.h>
#include <absacc.h>
//数据类型定义
#define ulong unsigned long
#define uchar unsigned char
#define uint unsigned int
////////page00//////////////////////////////////////////////////////////////////////
#define Page_Sel XBYTE[0x7000]//选择寄存器页
#define Command XBYTE[0x7001] //启动和停止命令的执行
#define FIFO XBYTE[0x7002] //64 字节FIFO 缓冲区输入和输出
#define PrimaryStatus XBYTE[0x7003] //接收器和发送器以及FIFO 缓冲区状态标志
#define FIFO_Length XBYTE[0x7004]//FIFO 中缓冲的字节数
#define SecondaryStatus XBYTE[0x7005]//不同的状态标志
#define InterruptEn XBYTE[0x7006]//使能和禁止中断请求通过的控制位
#define Int_Req XBYTE[0x7007] //中断请求标志
////////page08//////////////////////////////////////////////////////////////////////
#define Control XBYTE[0x7009] //不同的控制标志例如定时器节电
#define ErrorFlag XBYTE[0x700a] //显示上次命令执行错误状态的错误标志
#define CollPos XBYTE[0x700b] //RF 接口检测到的第一个冲突位的位置
#define TimerValue XBYTE[0x700c] //定时器的实际值
#define CRCResultLSB XBYTE[0x700d]// CRC 协处理器寄存器的最低位
#define CRCResultMSB XBYTE[0x700e]//CRC 协处理器寄存器的最高位
#define Bit_Frame XBYTE[0x700f]//位方式帧的调节
////////page10////////////////////////////////////////////////////////////////////////
#define TxControl XBYTE[0x7011] //天线驱动脚TX1 和TX2 的逻辑状态控制
#define CWConductance XBYTE[0x7012]//选择天线驱动脚TX1 和TX2 的电导率
#define PreSet13 XBYTE[0x7013]//ModeConductance 该值不会改变
#define PreSet14 XBYTE[0x7014]// CoderControl该值不会改变
#define ModWidth XBYTE[0x7015]// 选择调整脉冲的宽度
#define PreSet17 XBYTE[0x7017]//该值不会改变TypeBFraming
/////////page18///////////////////////////////////////////////////////////////////////
#define RxControl1 XBYTE[0x7019]//控制接收器状态
#define DecodeControl XBYTE[0x701a]//控制解码器状态
#define BitPhase XBYTE[0x701b]//选择发送器和接收器时钟之间的位相位
#define RxThreshold XBYTE[0x701c]//选择位解码器的阀值
#define PreSet1D XBYTE[0x701d]//该值不会改变
#define Rxcontrol2 XBYTE[0x701e]//控制解码器状态和定义接收器的输入源
#define ClockQControl XBYTE[0x701f]//控制时钟产生用于90o相移的Q 信道时钟
////////page20////////////////////////////////////////////////////////////////////////
#define RxWait XBYTE[0x7021] //选择发送后接收器启动前的时间间隔
#define ChannelRedundancy XBYTE[0x7022]//选择RF 信道上数据完整性检测的类型和模式
#define CRCPresetLSB XBYTE[0x7023]//CRC 寄存器预设值的低字节
#define CRCPresetMSB XBYTE[0x7024]//CRC 寄存器预设值的gao字节
#define PreSet25 XBYTE[0x7025]//该值不会改变
#define MFOUTSelect XBYTE[0x7026]//选择输出到管脚MFOUT 的内部信号//PreSet27
///////prge28////////////////////////////////////////////////////////////////////
#define FIFOLevel XBYTE[0x7029] //定义FIFO 上溢和下溢警告界限
#define TimerClock XBYTE[0x702a] //选择定时器时钟的分频器
#define TimerControl XBYTE[0x702b]//选择定时器的起始和停止条件
#define TimerReload XBYTE[0x702c]//定义定时器的预装值
#define IRQPinConfig XBYTE[0x702d]//配置IRQ 脚的输出状态//PreSet2E//PreSet2f不变
#define TestAnaSelect XBYTE[0x703a] //选择模拟测试模式
#define TestDigiSelect XBYTE[0x703d] //选择数字测试模式
/////////////////////////////////////////////////////////////////////////////////
#define RF_CMD_REQUEST_STD 0x26
#define RF_CMD_REQUEST_ALL 0x52
#define RF_CMD_ANTICOL 0x93
#define RF_CMD_SELECT 0x93
#define RF_CMD_AUTH_LA 0x60
#define RF_CMD_AUTH_LB 0x61
#define RF_CMD_READ 0x30
#define RF_CMD_WRITE 0xa0
#define RF_CMD_INC 0xC1
#define RF_CMD_DEC 0xC0
#define RF_CMD_RESTORE 0xC2
#define RF_CMD_TRANSFER 0xB0
#define RF_CMD_HALT 0x50
#define RF_CMD_REQUEST_ALL 0x52
#define RC500_AUTHERR 4 //验证不成功
#define RC500_FRAMINGERR 20
#define RC500_SELERR 9
#define KEYA 0x00
#define KEYB 0x04
#define ReadE2 0x03 //读FM1715 EEPROM命令
#define WriteE2 0x01 //写FM1715 EEPROM命令
#define Authent1 0x0c //验证命令认证过程第1步
#define Authent2 0x14 //验证命令认证过程第2步
#define LoadKeyE2 0x0b //将密钥从EEPROM复制到KEY缓存
#define LoadKey 0x19 //将密钥从FIFO缓存复制到KEY缓存
#define RF_TimeOut 0xfff //发送命令延时时间
#define RC500_PARITYERR 5 //卡片奇偶校验错误
#define RC500_CRCERR 2 //卡片CRC校验错误
#define RC500_BYTECOUNTERR 12 //从卡片接收到的字节数错误
#define MI_OK 1
#define RF_TimeOUT 0xfff
#define RC500_NOTAUTHERR 10
#define TYPEA_MODE 0 //TypeA模式
#define RC500_NOTAGERR 1
#define RC500_EMPTY 3 //数值溢出错误
#define RC500_WRITEERR 15 //调用write函数出错
#define RC500_OK 0
#define RC500_REQERR 21 //调用req函数出错
#define RC500_ANTICOLLERR 23
#define RC500_SERNRERR 8 //卡片序列号错误(anti-collision 错误)
#define RC500_INCRERR 16 //调用increment函数出错
#define RC500_DECRERR 17 //调用decrement函数出错
#define RC500_RESTERR 13 //调用restore函数出错
#define RC500_TRANSERR 14 //调用transfer函数出错
#define Transceive 0x1E //发送接收命令
#define Transmit 0x1a //发送命令
#define Req 0x01
#define Sel 0x02
#define TRUE 1
#define FALSE 0
#define STD 0x00
#define ALL 0x01
////////////////////////////////////////////////////////////////////////////////
sbit MFRST= P1^5;//33
sbit NCS=P3^5;//27
sbit IRQ=P3^4;
//sbit deng=P3^1;
//sbit LED= P3^5;
//sbit MI=P3^4;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;//mi
sbit UART_RX_BIT=P3^3;
sbit UART_TX_BIT=P3^2;
sbit ss=P1^0;
sbit sclk=P1^1;
sbit mosi=P1^2;
sbit miso=P1^3;
//时钟硬件设置
#define ad P2 //地址数据总线
sbit cs = P1^6; //片选
sbit as = P1^7; //地址选通输入
sbit rw = P3^3; //读允许输入脚
sbit ds = P3^2; //写允许输入
uchar idata readdata[16] _at_ 0x0040;//读写数据缓冲区
uchar idata tagtype[2] _at_ 0x0050;//卡片标识字符
uchar idata sendata[24] _at_ 0x0096; //增减的数值//gai08 4 24
uchar idata buffer[24] _at_ 0x0060; //FM1715命令发送接收缓冲区
uchar idata UID[5] _at_ 0x007a; //序列号
uchar idata Secnr _at_ 0x0090; //扇区号
uchar CardStatus;
//uchar idata Block_Adr[63] _at_ 0x00a0;
uchar code tongxunceshixinxi[]={0x3c,0x01,0x01,0x3c,0x0d}; //5
uchar code gonggongxinxi[] ={0x3c,0x02,0x00,0x00,0x3e,0x0d}; //6
uchar code xunkaxinxi[] ={0x3c,0x05,0x7c,0x7a,0x5d,0x16,0x00,0x74,0x0d}; //9
uchar code dukaxinxi[] ={0x3c,0x12,0x00,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x0d}; //9
uchar code dukaxinxi2[] ={0x3c,0x12,0x00,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x0d}; //9
uchar code cuowufanhui[]= {0x3c,0x01,0xff,0x3e,0x0d};
/////////////////////////////////////////
void sen(unsigned char dd)
{
TI=0;
SBUF=dd;
while(!TI)
{};
TI=0;
}
////////////////////////////////////////////
/*void send(unsigned char i)
{
unsigned char j,k;
ss=0;
sclk=0;
j=i;
for(k=0;k<8;k++)
{ if(j&0x01)
mosi=1;
else
mosi=0;
sclk=1;
j=j>>1;
sclk=0;
}
}
void pu()
{
send(0x01);
send(0x00);
ss=1;
}
void pd()
{
send(0x07);
send(0x00);
ss=1;
}
void playone()
{
unsigned int delay;
pu();
for(delay=0;delay<100;delay++);
send(0x45);
send(0x80);
send(0x04);
ss=1;
delay=100;
while(delay--);
send(0x80);
send(0x00);
send(0x10);
send(0x00);
send(0x25);
send(0x00);
ss=1;
delay=100;
while(delay--);
pd();
}
void playtwo()
{
unsigned int delay;
pu();
for(delay=0;delay<100;delay++);
send(0x45);
send(0x80);
send(0x04);
ss=1;
delay=100;
while(delay--);
send(0x80);
send(0x00);
send(0x26);
send(0x00);
send(0x45);
send(0x00);
ss=1;
delay=100;
while(delay--);
pd();
}
*/
uchar Clear_FIFO(void) //清除FIFO数据
{
uchar temp;
uint i;
temp=Control;
temp=(temp|0x01);
Control=temp;
for(i=0;i<RF_TimeOUT;i++)
{ temp=FIFO_Length;
if(temp==0)
{
return TRUE;
}
}return FALSE;
}
/////////////////////////////////////////////////////////
void Write_FIFO(uchar count,uchar idata*buff) //写数据FIFO
{
uchar i;
for(i=0;i<count;i++)
{
FIFO=*(buff+i);
}
}
//////////////////////////////////////////////////////////////
uchar judge_Req(uchar idata*buff) //卡片复位应答信号的判断
{
uchar temp1,temp2;
temp1=*buff;
temp2=*(buff+1);
if(((temp1==0x03)||(temp1==0x04)||(temp1==0x05))&&(temp2==0x00))
{
//sen(temp1);//04MIFARE标准8K卡
return TRUE;
}
return FALSE;
}
////////////////////////////////////////////////////
/*从FIFO读出数据从串口发送出来显示*/
void READ_data(uchar length)
{
uchar i;
for(i=0;i<length;i++)
{
readdata[i]=buffer[i];
//sen(readdata[i]);
}
}
/////////////////////////////////////////////////////////////////
uchar Read_FIFO(uchar idata*buff) // 读FIFO
{
uchar temp;
uchar i;
////sen(FIFO_Length);
temp=FIFO_Length;
if(temp==0)
{
return 0;
}
if(temp>=24)
{
temp=24;
}
for(i=0;i<temp; i++)
{
*(buff+i)=FIFO;
}
return temp;
}
/////////////////////////////////////////////////////////////////////////
uchar Command_Send(uchar count,uchar idata*buff,uchar Comm_Set) //命令传输
{ uint j;
uchar idata temp,temp1;
//Int_Req=0x7f;
Command=0x00;
Clear_FIFO();
Write_FIFO(count,buff);
//sen(FIFO_Length);
//Rxcontrol2=0x01;
temp=MFOUTSelect;
Command=Comm_Set;
for(j=0;j<RF_TimeOUT;j++)
{
temp=MFOUTSelect;
temp=Command;
temp1=Int_Req&0x80;
if((temp==0x00)||(temp1==0x80))
{
////sen(0x71);
return TRUE;
}
}
////sen(0x70);
return FALSE;
}
////////////////////////////////////////////////////
void DelayMS(uchar j)
{
uchar i,n;
for(i=0;i<j;i++)
{ for(n=0;n<230;n++);
}
}
////////////////////////////////////////////////////
uchar Request(uchar mode) // 请求
{
uchar idata temp;
CRCPresetLSB=0x63; //CRC预置寄存器低八位
// Rxcontrol2=0x41;
CWConductance=0x3f; //选择发射脚TX1和TX2发射天线的阻抗
buffer[0]=mode;
Bit_Frame=0x07; //调整面向bit的帧格式
ChannelRedundancy=0x03; //选择数据校验种类和模式
temp=Control;//各种控制标志寄存器
temp=temp&(0xf7);
Control=temp;
temp=Command_Send(1,buffer,Transceive);
if(temp==FALSE)
{
//P14=0;
return RC500_NOTAGERR; //无卡
}
Read_FIFO(buffer);
temp=judge_Req(buffer);//卡片复位应答信号的判断*/
//sen(FIFO_Length);
if(temp==TRUE)
{
//DelayMS(1000);
//P14=0;
//DelayMS(1000); //控制小喇叭
//P14=1;
//MI=FALSE;
tagtype[0]=buffer[0];
tagtype[1]=buffer[1];
return RC500_OK; //应答正确
}
return RC500_REQERR; //应答错误
}
/****************************************************************/
/*名称: Save_UID */
/*功能: 该函数实现保存卡片收到的序列号 */
/*输入: row: 产生冲突的行 */
/* col: 产生冲突的列 */
/* length: 接収到的UID数据长度 */
/****************************************************************/
void Save_UID(uchar row,uchar col,uchar length)
{ uchar i;
uchar temp;
uchar temp1;
if ((row==0x00)&&(col==0x00))
{
for(i=0;i<length;i++)
{
UID[i]=buffer[i];
//sen(UID[i]); // 6A 8B 2E 0E C1
}//sen(0x02);
}
else{
temp=buffer[0];
temp1=UID[row-1];
switch(col)
{
case 0:
temp1=0x00;
row=row+1;
break;
case 1:
temp=temp&0xfe;
temp1=temp1&0x01;
break;
case 2:
temp=temp&0xfc;
temp1=temp1&0x03;
break;
case 3:
temp=temp&0xf8;
temp1=temp1&0x07;
break;
case 4:
temp=temp&0xf0;
temp1=temp1&0x0f;
break;
case 5:
temp=temp&0xe0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -