⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 duxiexitongrc500.c

📁 #include <stc12c2052AD.H>// 标准库的头文件 #include <intrins.h> #include <absacc.h> #d
💻 C
📖 第 1 页 / 共 4 页
字号:
/****************************************************************/
/* 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 + -