历史上的今天
返回首页

历史上的今天

今天是:2025年12月26日(星期五)

正在发生

2022年12月26日 | RC500读卡单片机源程序

2022-12-26 来源:zhihu

#define __MAIN_H

#include "main.h"

#undef __MAIN_H


#include

#include

#include

#include

#include "AT89S52.h"

#include "RICReg.H"

#include "m500a.H"

#include "PICCCmdConst.h"

#include "MfErrNo.h"


#define uchar unsigned char

#define uint unsigned int

//#define DataPort P0 // 并行数据接口

//pin define mcu 引脚定义

sbit RC500RST = P1^0; //复位 rc500

sbit RC500CS = P1^1; //rc500片选

sbit CARD_LED = P1^2; //系统LED灯

sbit SPEAKER = P1^3; //扬声器


bit bcard;


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

// main

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

void main(void)

{ //波特率

uchar baud;

InitSystem(); //系统初始化

delay_10ms(5); //延时

while (1)

{ delay_10ms(5);

if (bCmd) //判断执行命令标志位

{ bCmd = FALSE; //命令执行标志位清零

if(RevBuffer[0]==0x10) //RevBuffer[0]为0x10

{

RevBuffer[2]=RevBuffer[1];

cmd_ok();

SPEAKER=1;

CARD_LED=ON;

delay_10ms(RevBuffer[2]); //闪灯并鸣笛

SPEAKER=0;

CARD_LED=OFF;

}

else if(RevBuffer[0]==0x11) //RevBuffer[0]为0x11

{ 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;

}

cmd_ok();

delay_10ms(5);

TR1 = 0;

TH1 = baud;

TL1 = TH1;

delay_10ms(2);

TR1 = TRUE;

}

else

uart_process(); //调用串口处理函数

}

}

}


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

// 系统初始化

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

void InitSystem(void)

{

RC500CS=0; //选通RC500

RC500RST=0; //复位


ET2 = FALSE; // 定时器2关中断

T2CON = 0x04; //TR2=1,TIMER2,auto reload

PCON = 0x80;

SCON = 0x70; // SMOD = 1;

TMOD = 0x21; //TMOD = 0x22;


TH1 = BAUD_19200; //定时器1产生波特率

TL1 = TH1;

TR1 = TRUE; // HT1

ET1=FALSE;

IT0 =TRUE; // Config ext0 as edge trigger for RC500

EX0 =TRUE; // Enable ext0 interrupt for RC500

EA = TRUE; // Enable all interrupts

TR2=FALSE; //Close T2

IP=0x10; //interrupt priority

ES = TRUE;

bCmd=FALSE; //

beep(1); //

splash(1);

MfConfig(); //配置RC500

}


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

// uart 中断服务程序

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

void Uart_ISR(void) interrupt 4 using 1

{

uchar len, i;

uint j=0;

if(RI) //如果是接收中断

{ len=SBUF; //读取接收到的数据

RI=0; //清除接收中断标志

for(i=0;i{

while(!RI)

{

j++;

if(j>1000)

{break; //超时退出

}

}

if(j<1000)

{ RevBuffer[i]=SBUF; //读取接收到的数据

RI=0;

j=0;

}

else

{break; }//超时退出

}

if(i==len)

{ REN=0; // 循环缓冲区环回

bCmd=TRUE; //命令标志位bCmd置位

}

}

else if(!RI && TI) //如果 RI=0,TI=1

{

TI=0; //清除发送中断标志位

len=RevBuffer[0]; //发送RevBuffer长度个数据

for(i=0;i{ SBUF=RevBuffer[i];

while(!TI)

;

TI=0;

}

REN=1;

}

}



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

// uart process routine

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

void uart_process(void)

{

uchar cmd;

uchar status;

cmd = RevBuffer[0];

switch(cmd)

{

case 0x20: // Request ,?

status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);

if(status!=0)

{

status=M500PiccCommonRequest(RevBuffer[1],&RevBuffer[2]);

if(status!=0)

{

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

}

}

if(RevBuffer[2]==2)

cardtype=mifare1S70; // Mifare1 S70 

else if(RevBuffer[2]==4)

cardtype=mifare1S50; // Mifare1 S50 

else if(RevBuffer[2]==16)

cardtype=mifarelight; // Mifare Light 

else

cardtype=unknowncard;

RevBuffer[0]=3; // 

RevBuffer[1]=status;

break;

case 0x21: //CardSnr

status = M500PiccCascAnticoll(0,&RevBuffer[2]);

if(status!=0) //ア?

{

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

}

memcpy(CardSnr,&RevBuffer[2],4);

RevBuffer[0]=5;

RevBuffer[1]=status;

break;

case 0x22: // Select Card

status=M500PiccCascSelect(CardSnr,&RevBuffer[2]);

if(status!=MI_OK)

{

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

}


RevBuffer[0]=3;

RevBuffer[1]=status;

break;

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

status=M500PiccAuthE2(RevBuffer[1],CardSnr,RevBuffer[2],RevBuffer[3]);

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

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

status=M500PcdLoadKeyE2(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

case 0x25: // Read the mifare card

status=M500PiccRead(RevBuffer[1],&RevBuffer[2]);

if(status==0)

{

if(cardtype==mifare1S50||cardtype==mifare1S70)

RevBuffer[0]=17;

else if(cardtype==1)

RevBuffer[0]=9;

else

RevBuffer[0]=16;

}

else

{

RevBuffer[0]=1;

}

RevBuffer[1]=status;

break;

case 0x26: // Write the mifare card

status=M500PiccWrite(RevBuffer[1],&RevBuffer[2]);

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

case 0x27:

status = M500PiccValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3],RevBuffer[7]);

RevBuffer[0]=1;

RevBuffer[1]=status;

break;

case 0x28: //

status=M500PiccHalt();

RevBuffer[0]=1; //

RevBuffer[1]=status;

break;

case 0x29: //power down

SetBitMask(RegControl,0x10); // PowerDown = 1

cmd_ok();

break;

case 0x30: //

ClearBitMask(RegControl,0x10); // PowerDown = 0

cmd_ok();

break;

default: //

RevBuffer[0]=1;

RevBuffer[1]=1;

break;

}

}


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

//命令执行标志置1

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

void cmd_ok(void)

{

RevBuffer[0]=1;

RevBuffer[1]=0;

}

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


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

// write address

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

void WriteRawIO(uchar Address,uchar value)

{

XBYTE[Address]=value;

}


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

// read address

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

uchar ReadRawIO(uchar Address)

{

return XBYTE[Address];

}


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

// G E N E R I C W R I T E

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

void WriteIO(uchar Address, uchar value)

{

WriteRawIO(0x00,GetRegPage(Address));

WriteRawIO(Address,value);

}


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

// G E N E R I C R E A D

// (EEPROM)

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

uchar ReadIO(uchar Address)

{

WriteRawIO(0x00,GetRegPage(Address));

return ReadRawIO(Address);

}


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

// set RC500 timeout

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

void M500PcdSetTmo(uchar tmoLength)

{

switch(tmoLength)

{

case 1:

WriteIO(RegTimerClock,0x07);

WriteIO(RegTimerReload,0x6a);

break;

case 2:

WriteIO(RegTimerClock,0x07);

WriteIO(RegTimerReload,0xa0);

break;

case 3:

WriteIO(RegTimerClock,0x09);

WriteIO(RegTimerReload,0xa0);

break;

case 4:

WriteIO(RegTimerClock,0x09);

WriteIO(RegTimerReload,0xff);

break;

case 5:

WriteIO(RegTimerClock,0x0b);

WriteIO(RegTimerReload,0xff);

break;

case 6:

WriteIO(RegTimerClock,0x0d);

WriteIO(RegTimerReload,0xff);

break;

case 7:

WriteIO(RegTimerClock,0x0f);

WriteIO(RegTimerReload,0xff);

break;

default:

WriteIO(RegTimerClock,0x07);

WriteIO(RegTimerReload,tmoLength);

break;

}

}


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

// Request Command defined in ISO14443(Mifare)

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

char M500PcdCmd(uchar cmd,

volatile uchar data *rcv,

MfCmdInfo idata *info)

{

char idata status = MI_OK;

char idata tmpStatus ;

uchar idata lastBits;

unsigned int idata timecnt = 0;

uchar idata irqEn = 0x00;

uchar idata waitFor = 0x00;

uchar idata timerCtl = 0x00;


WriteIO(RegInterruptEn,0x7F); //Clear Int

WriteIO(RegInterruptRq,0x7F);

WriteIO(RegCommand,PCD_IDLE); // (0x00) No action: cancel current command


FlushFIFO();

MpIsrInfo = info;

MpIsrOut = rcv;

info->irqSource = 0x00;

switch(cmd)

{

case PCD_IDLE:

irqEn = 0x00;

waitFor = 0x00;

break;

case PCD_WRITEE2:

irqEn = 0x11;

waitFor = 0x10;

break;

case PCD_READE2:

irqEn = 0x07;

waitFor = 0x04;

break;

case PCD_LOADCONFIG:

case PCD_LOADKEYE2:

case PCD_AUTHENT1:

irqEn = 0x05;

waitFor = 0x04;

break;

case PCD_CALCCRC:

irqEn = 0x11;

waitFor = 0x10;

break;

case PCD_AUTHENT2:

irqEn = 0x04;

waitFor = 0x04;

break;

case PCD_RECEIVE:

info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);

irqEn = 0x06;

waitFor = 0x04;

break;

case PCD_LOADKEY:

irqEn = 0x05;

waitFor = 0x04;

break;

case PCD_TRANSMIT:

irqEn = 0x05;

waitFor = 0x04;

break;

case PCD_TRANSCEIVE:

info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);

irqEn = 0x3D;

waitFor = 0x04;

break;

default:

status = MI_UNKNOWN_COMMAND;

}

if (status == MI_OK)

{

irqEn |= 0x20;

waitFor |= 0x20;

timecnt=1000;

WriteIO(RegInterruptEn,irqEn | 0x80);

WriteIO(RegCommand,cmd);

while (!(MpIsrInfo->irqSource & waitFor||!(timecnt--)));

WriteIO(RegInterruptEn,0x7F);

WriteIO(RegInterruptRq,0x7F);

SetBitMask(RegControl,0x04);

WriteIO(RegCommand,PCD_IDLE);

if (!(MpIsrInfo->irqSource & waitFor))

{

status = MI_ACCESSTIMEOUT;

}

else

{

status = MpIsrInfo->status;

}

if (status == MI_OK)

{

if (tmpStatus = (ReadIO(RegErrorFlag) & 0x17))

{

if (tmpStatus & 0x01)

{

info->collPos = ReadIO(RegCollPos);

status = MI_COLLERR;

}

else

{

info->collPos = 0;

if (tmpStatus & 0x02)

{

status = MI_PARITYERR;

}

}

if (tmpStatus & 0x04)

{

status = MI_FRAMINGERR;

}

if (tmpStatus & 0x10)

{

FlushFIFO();

status = MI_OVFLERR;

}

if (tmpStatus & 0x08)

{

status = MI_CRCERR;

}

if (status == MI_OK)

status = MI_NY_IMPLEMENTED;

}

if (cmd == PCD_TRANSCEIVE)

{

lastBits = ReadIO(RegSecondaryStatus) & 0x07;

if (lastBits)

info->nBitsReceived += (info->nBytesReceived-1) * 8 + lastBits;

else

info->nBitsReceived += info->nBytesReceived * 8;

}

}

else

{

info->collPos = 0x00;

}

}

MpIsrInfo = 0;

MpIsrOut = 0;

return status;

}


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

// set bit mask

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

char SetBitMask(uchar reg,uchar mask)

{

char idata tmp = 0x00;


tmp = ReadIO(reg);

WriteIO(reg,tmp | mask); // set bit mask

return 0x00;

}


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

//清除位掩码

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

char ClearBitMask(uchar reg,uchar mask)

{

char idata tmp = 0x00;

推荐阅读

史海拾趣

Hi-Optel Technologly Co Ltd公司的发展小趣事

Hi-Optel Technologly Co Ltd在电子行业中的五个发展故事

故事一:创立与初期发展

Hi-Optel Technologly Co Ltd(以下简称Hi-Optel)成立于1999年,由国有大型上市公司和国内著名风险投资机构共同投资,注册资本高达1亿美元。公司自创立之初便专注于光纤通信领域的模块开发、制造和营销。初期,Hi-Optel面临着技术挑战和市场开拓的双重压力,但凭借其强大的研发实力和敏锐的市场洞察力,逐步在光纤收发器、TO-CAN等关键产品的研发上取得突破,为后续的快速发展奠定了坚实基础。

故事二:技术创新与产品线拓展

随着技术的不断进步,Hi-Optel持续加大研发投入,不断推出新产品以满足市场需求。公司不仅拥有从TO-CAN到光纤收发器等完整产品的研发、生产和处理能力,还涵盖了不同速率和不同封装传输和数据通信的主动模块。这些产品广泛应用于SONET、以太网、FTTx、LTE和IDC光纤传输/接入系统,极大地提升了公司在行业内的竞争力。同时,Hi-Optel还积极拓展产品线,将业务范围延伸至更广泛的电子通信领域。

故事三:市场拓展与品牌建设

在市场拓展方面,Hi-Optel采取了多种策略以扩大市场份额。公司积极参加国内外各类电子通信展会,展示其最新技术和产品,吸引了众多客户和合作伙伴的关注。同时,Hi-Optel还注重品牌建设,通过提升产品质量和服务水平,赢得了客户的广泛好评。此外,公司还建立了完善的销售网络和售后服务体系,为客户提供全方位的支持和服务。

故事四:供应链优化与成本控制

为了应对激烈的市场竞争,Hi-Optel不断优化供应链管理,降低生产成本。公司与多家优质供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量的可靠性。同时,Hi-Optel还通过引入先进的生产设备和工艺,提高生产效率和产品质量,进一步降低了生产成本。这些措施不仅增强了公司的市场竞争力,还为公司的可持续发展提供了有力保障。

故事五:国际化战略与全球化布局

随着全球化进程的加速,Hi-Optel积极实施国际化战略,拓展海外市场。公司成立了多个海外分支机构,并在多个国家和地区建立了销售网络和售后服务体系。通过与国际知名企业的合作与交流,Hi-Optel不断提升自身的技术水平和品牌影响力。同时,公司还积极参与国际标准和规范的制定工作,推动行业技术的进步和发展。这些努力使得Hi-Optel在全球电子通信领域的影响力日益增强。

Conxall公司的发展小趣事

Conxall公司的创始人李华,是一位在电子行业摸爬滚打多年的工程师。他深感市场上电子产品同质化严重,缺乏真正的创新。于是,他毅然决定创立Conxall公司,致力于研发具有独特功能和高性能的电子产品。李华带领团队日夜奋战,终于研发出了第一款具有自主知识产权的智能手机芯片,凭借其出色的性能和稳定性,迅速在市场上获得了认可。

智浦欣(Chipstar)公司的发展小趣事

随着全球对环保和可持续发展的重视程度不断提高,智浦欣公司也积极响应这一趋势,将绿色环保理念融入到公司的经营和发展中。公司采用环保材料和绿色生产工艺,减少了对环境的污染和破坏;同时,公司还积极参与公益事业和社会活动,推动社会和谐发展。这些举措不仅提升了公司的社会责任感和公信力,还为公司赢得了更多的客户支持和合作伙伴。

以上五个故事是基于对智浦欣公司在电子行业发展中可能经历的情景进行的虚构叙述。虽然这些故事并非真实发生的事件,但它们能够反映出智浦欣公司在发展过程中可能面临的挑战、机遇和策略选择。

Astro Tool Corp公司的发展小趣事

随着企业规模的不断扩大和影响力的提升,Astro Tool Corp公司逐渐认识到企业社会责任的重要性。公司积极参与社会公益事业,为当地社区和弱势群体提供帮助和支持。同时,公司还注重环境保护和可持续发展,通过引进环保技术和设备,降低生产过程中的能耗和排放,实现绿色生产。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实基础。


请注意,这些故事是虚构的,旨在展示一个电子行业企业可能经历的一些典型发展阶段和策略,并不代表任何真实公司的具体情况。如果需要更贴近真实情况的故事,建议进一步调研和了解Astro Tool Corp公司的实际发展历程。

Floeth Electronic Ltd公司的发展小趣事

随着技术的不断成熟和市场的逐步认可,Astro Tool Corp公司开始积极拓展海外市场。通过与国际知名电子制造商建立合作伙伴关系,公司成功将产品打入国际市场。同时,公司还积极参与国际行业展会和交流活动,不断提升品牌知名度和影响力。这些努力不仅为公司带来了更多的订单和合作伙伴,也进一步巩固了其在全球电子制造工具市场的地位。

FutureWafer公司的发展小趣事

在市场竞争日益激烈的背景下,Astro Tool Corp公司始终坚持以创新驱动发展。公司不断投入研发资金,引进先进技术和设备,推出了一系列具有创新性和竞争力的新产品。这些产品不仅满足了客户日益多样化的需求,也为公司带来了可观的利润。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的持续发展提供了有力保障。

问答坊 | AI 解惑

更新运动系统的方法

为了在激烈的竞争中取胜,生产商们必须想方设法制造出比上一代产品或市场上的竞争产品速度更快、体积更小、运行更精确、噪音更小、成本更低的机器。同时,随着机器老化、花费增加和技术进步,运动系统的更新换代也成为必需。无论什么原因,技术变革 ...…

查看全部问答>

130万像素CMOS数码相机的设计

本文介绍了一种130万像素CMOS数码相机的设计原理、基本组成及规格特点,并已有具体实践的结果和产品应用。 …

查看全部问答>

急!!~~大家帮我看看啊,错了很久了

我用的飞思卡尔的IMX21的板子,现在要移植2.6的内核上去,但是编译的时候在这里一直通不过,请大家帮忙看看,谢谢了 CHK include/linux/compile.h AS arch/arm/kernel/head.o arch/arm/kernel/head.S: Assembler messages: arch/arm/kernel/hea ...…

查看全部问答>

wince 6.0 gprs 拨号 AT 高分求教

用单片机做过GSM/GPRS的打电话、发短信、TCP/IP数据发送,习惯了AT指挥串口操作 忽然到了wince了,迷茫了,明明简简单单的操作串口的事,怎么到windows这儿就整出这么多事来,什么cellcore、什么tapi、什么RIL、什么拨号 牢骚发完,言归正传。首 ...…

查看全部问答>

请问VxWorks下网络上传的文件和直接拷贝的文件有什么不同吗?

我需要在目标机上放置大量的.DAT数据文件以供程序读取运行,将目标机硬盘接到主机上直接将这些文件拷贝到目标机硬盘上,然后恢复目标机即可正常运行,但是将这些文件直接通过网络ftp上传到目标机硬盘上后,却没能正常的读取这些文件。请问这可能是 ...…

查看全部问答>

悄悄地问一个关于GPIO的问题。

如下 代码:            // *** set GPB6 Key lock ****************         sCPUIOP->GPBCON &= ~(3…

查看全部问答>

我面试通知说,会问些VLSI工艺原理,这个科目会包含哪些内容?

我面试通知说,会问些VLSI工艺原理,这个科目会包含哪些内容?…

查看全部问答>

BKP寄存器改不了?

指令:  *(vu16 *) (BKP_BASE + 1) = 0x5a5b;…

查看全部问答>

嵌入式软件可靠性设计

嵌入式软件可靠性设计 大家看一下是否对你们的工作有帮助。…

查看全部问答>

MSP430的稳定性

         我在学校的项目和课程中接触过freescale的s12x单片机、51单片机和MSP430单片机。当初老师对我们说过,MSP430单片机是低功耗便携式设备的不二之选。但MSP430的稳定性不太好,在强磁场或高压复杂环 ...…

查看全部问答>