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

📄 11t6_sc.c

📁 读写Mifare One卡, 说明:此例程为一个块的读写操作
💻 C
📖 第 1 页 / 共 3 页
字号:
//;===============================================================
//;程序名:   11T6_SC.C
//;Hex程序名:11T6_SC.hex
//;程序功能:读写Mifare One卡,11T6模块的c演示程序[使用模拟串口]
//;说明:此例程为一个块的读写操作,若对多个块进行读写操作时,只
//;     需操作“读指定块”、“写指定块”这两个子程序即可。
//;注意:====跳线应在Soft位====
//;晶振:  11.0592M
//;波特率:9600bps
//;日期:  07.07.04
//;===============================================================

#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
sfr    resetpc=0xe7;
sbit	UART_RX_BIT=P3^2;
sbit	UART_TX_BIT=P3^3;
sbit	GREEN_LINE =P3^7;
sbit 	RED_LINE   =P3^5;
sbit	step4      =P1^4;
sbit	keyitongxing      =P1^0;
sbit	chongxinshuaka      =P1^1;
sbit	beep      =P1^2;

#define bofang  0   //
#define tingzhi  1   //

//时钟硬件设置
#define ad  P2   //地址数据总线

sbit cs = P0^0;   //片选
sbit as = P0^1;   //地址选通输入
sbit rw = P0^2;   //读允许输入脚
sbit ds = P0^3;   //写允许输入

#define qidongzhuangtaidizhi  14   //启动状态存储字节地址
//#define kaishididizhi  15   //记录开始指针低位
#define wangdiangaodizhi  16   //网点编号高字节
#define wangdiandidizhi  17   //网点编号低字节


uchar time;
uchar   tmpResult;
uchar	CardStatus;
//const uchar SearMode=0x01;	//全局变量
const uchar SearMode=0x00;	//全局变量
bit benci;
        //卡片连续读取数据不需要拿开
void led_cyc_on(void);
//定时器中断服务程序
void sen(unsigned char dd)
    {
	TI=0;
    SBUF=dd;
	while(!TI)
	   {};
	TI=0;
	}
void int_t0(void) interrupt 1 
   {
   time++;
	//	sen(0x88);
   if (time>4) 
      {
	    resetpc=0x20;
		sen(0x88);
	  };
   }

void	delay10ms(uchar j)
{	unsigned int i;
	uchar k;
	for(k=0;k<j;k++)
		for(i=0;i<3950;i++);
}

//***************************************************8


void writertc(uchar dd1,uchar dd2)
    {    
	 //写的时序
	 //、都给0
	 //1、ds=1
	 //2、rw=1
	 //3、as=1
	 //4、cs=0
	 //5、ad给地址值
	 //6、as=0
	 //7、rw=0;
	 //8、ad给数据
	 //9、rw=1
	 //   cs=1
	 //8、as=1


	 //初值
   
	//
	ds=1;
	rw=1;
	as=1;
	cs=0;
	ad=dd1;

	//
	as=0;
	rw=0;
	ad=dd2;
    rw=1;
	cs=1;
	as=1;


    }
uchar readrtc(uchar dd1)
    {
	uchar d,d1;
	 //读的时序
	 //、都给0
	 //1、ds=1
	 //2、rw=1
	 //3、as=1
	 //4、cs=0
	 //5、ad给地址值
	 //6、as=0
	 //7、ds=0;
	 //7、ds=0;
	 //8、ad输出数据
	 //7、ds=1;

	 //9、rw=1
	 //8、as=1
     // 返回值
  	 //初值
	 rr:
 
	//
 	ds=1;
	rw=1;
	as=1;
	cs=0;
	ad=0x0a;

	//
	as=0;
	ds=0;
	ad=0xff;
	d1=ad;
	ds=1;
    rw=1;
	cs=1;
	as=1;

	 if ((d1 & 0x80)==0 )
	 {
	//
	ds=1;
	rw=1;
	as=1;
	cs=0;
	ad=dd1;
	//
	as=0;
	ds=0;
	ad=0xff;
	d=ad;
	ds=1;
    rw=1;
	cs=1;
	as=1;
    return (d);
	};
    // sen(0xee);
    goto rr;

    }


//******************************************************88



/*--------------------------------------------------------------------
 FUNCTION: Init_UART(),硬串口初始化
 INPUT:
 OUTPUT:
--------------------------------------------------------------------*/
void Init_UART(void) //软串口初始化
{	UART_RX_BIT=1;
	UART_TX_BIT=1;
}
void delay104us(void)
{	uchar i;
	for(i=0;i<19;i++);   //8  和  11
	//for(i=0;i<26;i++); 
}



/*--------------------------------------------------------------------
 FUNCTION: UART_PutByte(),发送一字节数据
 INPUT:    uchar UARTDATA
 OUTPUT:
--------------------------------------------------------------------*/
void UART_PutByte(uchar UARTDATA)
{	uchar i;
	i=0;
	UART_TX_BIT=0;
	delay104us();
	do
	{    if(UARTDATA&0x01)
                UART_TX_BIT=1;
	     else
                UART_TX_BIT=0;
		 delay104us();
		 i++;
		 UARTDATA>>=1;
	}while(i<8);
	UART_TX_BIT=1;
	delay104us();
}


/*--------------------------------------------------------------------
 FUNCTION: UART_GetByte(),接收1BYTE数据
 INPUT:   无
 OUTPUT:  UARTDATA,1BYTE数据
--------------------------------------------------------------------*/
uchar UART_GetByte(void)
{	uchar UARTDATA=0,i=0;
	while(UART_RX_BIT);
	delay104us();
	while(i<8)
	{	UARTDATA>>=1;
		if(UART_RX_BIT)
		{
		    UARTDATA|=0x80;
		}
		i++;
		delay104us();
	}
	UART_RX_BIT=1;
	return 	UARTDATA;
}

/*--------------------------------------------------------------------
 FUNCTION: Commu_test(),通讯测试
 INPUT:
 OUTPUT:   1byte CardStatus
--------------------------------------------------------------------*/
/************************************************
一、	通讯测试,测试单片机与模块通讯是否正常
master command:3C 04 00 60 00 00  BCC 0D
************************************************/
void Commu_test(void)
{	uchar	i;
	uchar txbuff[8];
	uchar rxbuff[6];
	CardStatus=0;
t111:
    txbuff[0]=0x3C;
	txbuff[1]=0x04;
	txbuff[2]=0x00;
	txbuff[3]=0x60;
	txbuff[4]=0x00;
        txbuff[5]=0x00;
        txbuff[6]=0;
	for(i=0;i<5;i++) txbuff[6]^=txbuff[i];
        txbuff[7]=0x0D;


	for(i=0;i<8;i++)
	{
		UART_PutByte(txbuff[i]);
	}
//;--------------------------------------------------------------------
//; Right: 3C 01 01 BCC 0D
//; Error: 3C 01 00 BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
	for(i=0;i<5;i++)
	{
		rxbuff[i]=UART_GetByte();
                 if(rxbuff[0]!=0x3C)i=0;//纠错
	}
    if(rxbuff[0]!=0x3C)goto t111;
    if(rxbuff[1]!=0x01)goto t111;
    if(rxbuff[2]!=0x01)goto t111;
    if(rxbuff[4]!=0x0d)goto t111;
//t111:
	rxbuff[5]=0;
	for(i=0;i<3;i++)
		rxbuff[5]^=rxbuff[i];//纠错
	if(rxbuff[5]==rxbuff[3])
	  if(rxbuff[2])
	  {
		CardStatus=0x01;
	  }

}


/*--------------------------------------------------------------------
 FUNCTION: Search_Card,寻卡,有卡则读出卡号
 INPUT:    uchar *CardNo,uchar SearMode
 OUTPUT:   4byte CardNo and  1byte CardStatus
--------------------------------------------------------------------*/
/***********************************************************
二、	寻卡
command:3C 04 01 70 00(寻卡模式00(IDLE)或01(ALL)) 00 BCC 0D
***********************************************************/

void Search_Card(uchar *CardNo_,uchar SMode_)
{	uchar i;
	uchar	txbuff[8];
	uchar   rxbuff[10];
//t112:
    CardStatus=0;    //卡状态给初值 0
	txbuff[0]=0x3C;
	txbuff[1]=0x04;
	txbuff[2]=0x01;
	txbuff[3]=0x70;
	txbuff[4]=SMode_;	//search mode
	txbuff[5]=0x00;
        txbuff[6]=0x00;
	for(i=0;i<6;i++) txbuff[6]^=txbuff[i];
        txbuff[7]=0x0D;

    for(i=0;i<8;i++)
	{
		UART_PutByte(txbuff[i]);
	}

//;--------------------------------------------------------------------
//; Right: 3C 05 四字节卡号 00 BCC 0D
//; Error: 3C 01 FF(错误返回代码) BCC 0D
//;--------------------------------------------------------------------
//;;;;;;
	for(i=0;i<9;i++)
	{
                rxbuff[i]=UART_GetByte();
                if(rxbuff[0]!=0x3C)i=0;//纠错
                if(rxbuff[i]==0x0D)break;
        }
    if(rxbuff[0]!=0x3C)goto t112;
    if(rxbuff[1]!=0x05)goto t112;
    if(rxbuff[6]!=0x00)goto t112;
    if(rxbuff[8]!=0x0d)goto t112;
t112:        rxbuff[9]=0;
        for(i=0;i<7;i++)rxbuff[9]^=rxbuff[i];
        if(rxbuff[9]==rxbuff[7])
	if(rxbuff[1]==0x05)
        {
		CardStatus=0x01;
                for(i=0;i<4;i++)*CardNo_++=rxbuff[2+i];

        }

}



/*--------------------------------------------------------------------
 FUNCTION: Psd_Verify,密码校验
 INPUT:    uchar *BlockKey,uchar BlockKeyAorB,uchar BlockNo,uchar *CardNo
 OUTPUT:   1byte CardStatus
--------------------------------------------------------------------*/
/**************************************************
三、	密码校验
command:3C 0E 01 6C 6字节密码 00(A密码或B密码01) 00(块号) 四字节卡号 BCC 0D
***************************************************/
void	Psd_Verify(uchar *BlockKey_,uchar BlockKeyAorB_,uchar BlockNo_,uchar *CardNo_)
{	uchar i;
	uchar	txbuff[18];
	uchar   rxbuff[7];
//t113:
    CardStatus=0;
	txbuff[0]=0x3C;
	txbuff[1]=0x0E;
	txbuff[2]=0x01;
	txbuff[3]=0x6C;
        for(i=0;i<6;i++)txbuff[4+i]=*BlockKey_++;
	txbuff[10]=BlockKeyAorB_;
        txbuff[11]=BlockNo_;
        for(i=0;i<4;i++)txbuff[12+i]=*CardNo_++;
        txbuff[16]=0;
        for(i=0;i<16;i++)txbuff[16]^=txbuff[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -