* 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欢迎分享,转载请注明来源:内存溢出
评论列表(0条)