谁有单片机射频IC卡读写器(低频高频RFID)代码的,有的发个给我啊,急用了,谢谢了 554705143@qq.com

谁有单片机射频IC卡读写器(低频高频RFID)代码的,有的发个给我啊,急用了,谢谢了 554705143@qq.com,第1张

/****************************************************************************

* File : main.c*

* COPYRIGHT BY HUOYAN LTD.COMPANY *

* Version: V1.3 *

* *

* Created: 18.10.2005 *

* Last Change: 21.10.2005 *

* *

* Author: NIL *

* *

* Compiler: KEIL C51 V7.10 *

* *

* Description: AT89S52-Firmware for FM1702 Demo Serial Reader *

* *

****************************************************************************/

#include <reg52.h>亮念

#define __SRC

#include "main.h"

#undef __SRC

#include <intrins.h>

//#include <string.h>

//#include <stdio.h>

//#include <宴键高absacc.h>

#include "FM1702.h"

#define uchar unsigned char

#define uint unsigned int

//pin define mcu控制管脚定义

sbit RF_MISO = P2^3

sbit RF_MOSI = P2^1

sbit RF_SCK = P2^0

sbit RF_NSS = P2^2

sbit RF_RST = P2^4//由高变低时启动内部复位程序

sbit CARD_LED = P1^1

sbit SPEAKER= P1^0

sbit LED = P2^5

//晌尺sbit RF_MISO = P1^0

//sbit RF_MOSI = P1^1

//sbit RF_SCK = P1^2

//sbit RF_NSS = P1^3

//sbit RF_RST = P1^4 //由高变低时启动内部复位程序

//sbit LED = P2^4

//sbit SPEAKER= P2^0

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: spi_byte_transceive//

//功能: 该函数实现SPI通讯的数据收发//

// //

//输入://

// 发送数据 //

// //

//输出://

// 接收数据 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

char spi_byte_transceive(char sendbyte)

{

char i,temp

for(i=0i<8i++)

{

RF_SCK=0

if(sendbyte &0x80) //位运算,判断最高位是否为1

{

RF_MOSI=1

}

else

{

RF_MOSI=0

}

sendbyte <<= 1

RF_SCK=1

temp <<= 1

if(RF_MISO)

temp |= 0x01

}

RF_SCK=0

_nop_()

_nop_()

RF_MOSI=0

return (temp)

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_write //

//功能: 该函数实现通过SPI接口对RC531中一个寄存器写入值 //

// //

//输入://

// RC531目标寄存器地址和写入值 //

// //

//输出://

// N/A //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

void SPIWrite(char reg_ad,char reg_data)

{

RF_SCK=0

reg_ad <<= 1

RF_NSS=0

reg_ad &= 0x7F

spi_byte_transceive(reg_ad)

spi_byte_transceive(reg_data)

RF_NSS=1

return

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

//名称: rc531_register_read//

//功能: 该函数实现通过SPI接口读取RC531中一个寄存器的值 //

// //

//输入://

// RC531目标寄存器地址 //

// //

//输出://

// 目标寄存器的值 //

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

unsigned char SPIRead(char reg_ad)

{ char temp

RF_SCK=0

_nop_()

_nop_()

RF_NSS=0

reg_ad <<= 1

reg_ad |= 0x80

spi_byte_transceive(reg_ad)

temp=spi_byte_transceive(0x00)

RF_NSS=1

return (temp)

}

///////////////////////////////////////////////////////////////////////

// 主函数

///////////////////////////////////////////////////////////////////////

void main(void)

{ //设置变量

uchar baud

SPEAKER=0

InitSystem()//初始化系统

SPEAKER=1

LED=0

while (1)

{

//检查命令标志

if (CmdValid) //if LEVEL 1

{

CmdValid = FALSE

if(RevBuffer[0]==11) //if LEVEL 2

{

RevBuffer[2]=RevBuffer[1]

RevBuffer[0]=1

RevBuffer[1]=0

CALL_isr_UART() //equal to 'SETB TI', defined in main.h

SPEAKER=0 //开蜂鸣器和指示灯

delay_10ms(RevBuffer[2])

SPEAKER=1

}

else if(RevBuffer[0]==13) //设置通讯波特率 //if LEVEL 2

{

switch(RevBuffer[1])

{

case 0:

baud=BAUD_9600

break

case 1:

baud=BAUD_14400

break

case 2:

baud=BAUD_19200

break

case 3:

baud=BAUD_28800

break

case 4:

baud=BAUD_38400

break

case 5:

baud=BAUD_57600

break

case 6:

baud=BAUD_115200

break

default:

baud=BAUD_19200

break

} //switch body

RevBuffer[0]=1 //contact

RevBuffer[1]=0

CALL_isr_UART()

delay_10ms(5)

TR1 = 0

TH1 = baud

TL1 = TH1

delay_10ms(2)

TR1 = TRUE

}//if LEVEL 2

else

{

cmd_process() // 进入IC卡处理程序

CALL_isr_UART()

}

}

}//while循环体

}//main函数

///////////////////////////////////////////////////////////////////////

// 系统初始化

///////////////////////////////////////////////////////////////////////

void InitSystem(void)

{

RF_NSS=1

RF_RST=0

ET2 = 0 //Timer 2 disabled

T2CON = 0x04 //start Timer 2(internal timer, auto reload)

PCON = 0x80 //baud rate double

SCON = 0x70 //UART mode 1, enable receive, if No valid stop bit, RI not activated.

//TMOD = 0x22

TMOD = 0x21 //Timer 1 8bit auto reload TR1 control

//Timer 0 16bit TR0 control

TH1 = BAUD_9600 //默认波特率

TL1 = TH1

TR1 = TRUE // 波特率发生器

TH0 = 0x60

TL0 = 0x60

TR0 = 0 //Timer 0 doesn't run

ET0=0

ET1=0

EA=1

EX0=1

IT0 = 1

TR2=0

ES = TRUE //enable UART interrupt

CmdValid=0 //flag initiation

//喇叭和指示灯测试

delay_10ms(10)

delay_10ms(10)

Init_FM1702(0)

}

///////////////////////////////////////////////////////////////////////

// 串口接收和发送中断

///////////////////////////////////////////////////////////////////////

void isr_UART(void) interrupt 4 using 1

{

uchar len, i

unsigned int j=0

if(RI)

{

len=SBUF

RI=0

for(i=0i<leni++)

{

while(!RI)

{

j++

if(j>1000)

{

break

}

}

if(j<1000)

{

RevBuffer[i]=SBUF

RI=0

j=0

}

else

{

break

}

}

if(i==len)

{

REN=0

CmdValid=1

}

}

else if(!RI &&TI)

{

TI=0

len=RevBuffer[0]

for(i=0i<len+1i++)

{

SBUF=RevBuffer[i]

while(!TI)

TI=0

}

REN=1

}

}

/****************************************************************/

/*名称: Load_keyE */

/*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/

/*输入: Secnr: EE起始地址*/

/*输出: True: 密钥装载成功*/

/* False: 密钥装载失败*/

/****************************************************************/

uchar Load_key_CPY(uchar *buff)

{

char idata status

uchar coded_keys[12]

uchar temp

M500HostCodeKey(buff,coded_keys)////////////////

temp=Command_Send(0x0c,coded_keys,LoadKey)

if(temp == FALSE)

{

return FM1702_LOADKEYERR

}

status=(SPIRead(ErrorFlag)) &0x40

if (status==0x40)

return FM1702_AUTHERR

return FM1702_OK

}

///////////////////////////////////////////////////////////////////////

// IC卡处理函数

///////////////////////////////////////////////////////////////////////

void cmd_process(void)

{

uchar cmd

uchar status

cmd = RevBuffer[0]

switch(cmd)

{

case 1: // Halt the card //终止卡的 *** 作

status=MIF_Halt()

RevBuffer[0]=1

RevBuffer[1]=status

break

case 2:

status = Request(RF_CMD_REQUEST_ALL) //RF_CMD_REQUEST_STD=0x26, request Idle

if(status != FM1702_OK)

{

status = Request(RF_CMD_REQUEST_ALL)

if(status != FM1702_OK)

{

RevBuffer[0] = 1

RevBuffer[1] = FM1702_REQERR

break

}

}

if(tagtype[0]==2)

cardtype=mifarepro// Mifare Pro 卡

else if(tagtype[0]==4)

cardtype=mifare1 // Mifare One 卡

else if(tagtype[0]==16)

cardtype=mifarelight // Mifare Light 卡

else

cardtype=unknowncard

RevBuffer[0]=3

RevBuffer[1]=status

RevBuffer[2]=tagtype[0]

RevBuffer[3]=tagtype[1]

break

case 3: // 防冲突 读卡的系列号 MLastSelectedSnr

status = AntiColl()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_ANTICOLLERR

break

}

//memcpy(MLastSelectedSnr,&RevBuffer[2],4)

RevBuffer[0]=5

RevBuffer[1]=status

RevBuffer[2]=UID[0]

RevBuffer[3]=UID[1]

RevBuffer[4]=UID[2]

RevBuffer[5]=UID[3]

break

case 4: // 选择卡 Select Card

status=Select_Card()

if(status!=FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=FM1702_SELERR

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 5:

//下载密钥

// status = Load_keyE2(RevBuffer[2],RevBuffer[1]) //%40

status = Authentication(UID, RevBuffer[2], RevBuffer[1])

if(status != FM1702_OK)

{

RevBuffer[0]=1

RevBuffer[1]=status

break

}

RevBuffer[0]=1

RevBuffer[1]=status

break

case 6: // Key loading into the MF RC500's EEPROM

// 校验卡密码(E2) Load_keyE2_CPY(uchar Secnr, uchar Mode)

// RevBuffer[5] = 0xff

// RevBuffer[6] = 0xff

// RevBuffer[7] = 0xff

// RevBuffer[8] = 0xff

// RevBuffer[9] = 0xff

// RevBuffer[10] = 0xff

status = Load_key_CPY(&RevBuffer[3])

// status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]) //%40

// if(status != FM1702_OK)

// {

// RevBuffer[0]=1

// RevBuffer[1]=status

// break

// }

RevBuffer[0]=1

RevBuffer[1]=status

break

这里不能全部发完,你加我的QQ吧,574301093 我发给你接收完后麻烦采纳下我的答案。谢谢了

两者泣别羡颤皮不是很大,从功能方面兄差将简单来说就是RC530更适合给儿童使用而531更适合给成年人使用。

首先这两电源线长度都是1.7m,供电方式都有所充洞渗电式,电源都是220v,材质都是不锈钢,都能支持自动断电功能,世界通用电压都支持,刀头都是钛金陶瓷,包装里除了理发器电源线说明书,还能赠送限位梳,润滑油,清洁刷和保修卡。

不同点是RC531,大小是216.7×55.4×57.3mm,而RC530是141×92×38mm,RC531的额定功率为18W,而RC530的额定功率为15W。

STC89C52RC单片机是没有硬件SPI功能的,是需要模拟的。普通的I/O即可模拟的。给你一个参考程序:\x0d\x0a//-----------------------函数声明,变量定义-------------------------------------------------------- \x0d\x0a#include \x0d\x0a#include \x0d\x0asbit SCK=P1^0// 将p1.0口模拟时钟输出 \x0d\x0asbit MOSI=P1^1// 将p1.1口模拟主机输出 \x0d\x0asbit MISO=P1^2// 将p1.1口模拟主机输入 \x0d\x0asbit SS1=P1^3// 将p1.1口模拟片选 \x0d\x0a#define delayNOP(){_nop_()_nop_()_nop_()_nop_()}\x0d\x0a//-------------------------------------------------------------------------------------------------- \x0d\x0a// 函数名称: SPISendByte \x0d\x0a// 入口参数:滚答 ch \x0d\x0a// 函数功能: 发送一个字节 \x0d\x0a//-------------------------------------------------------------------------------------------------- \x0d\x0avoid SPISendByte(unsigned char ch) \x0d\x0a{ \x0d\x0aunsigned char idata n=8// 向SDA上发送一位数据字节,共八位 \x0d\x0aSCK = 1 //时钟置高 \x0d\x0aSS1 = 0 //选择从机 \x0d\x0awhile(n--) \x0d\x0a{ \x0d\x0adelayNOP()\x0d\x0aSCK = 0 //时钟置大此慧低 \x0d\x0aif((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 \x0d\x0a{ \x0d\x0aMOSI = 1// 传送位1 \x0d\x0a} \x0d\x0aelse\x0d\x0a{ \x0d\x0aMOSI = 0// 否则传送位0 \x0d\x0a} \x0d\x0adelayNOP()\x0d\x0ach = ch 回答于 2022-11-17


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12484707.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存