51门禁系统源程序Word文件下载.docx
- 文档编号:5052996
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:52
- 大小:23.50KB
51门禁系统源程序Word文件下载.docx
《51门禁系统源程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《51门禁系统源程序Word文件下载.docx(52页珍藏版)》请在冰点文库上搜索。
//执行初始化函数
relay_OFF();
//关继电器
LED_BLINK_1();
//ledtest
beep1();
//beeptest
display(0,0,0);
//显示初始化
while
(1)
{
key=key_scan();
//按键操作
if(key==12)if(states>
0)states--;
elsestates=0;
//上一功能
if(key==13)if(++states>
3)states=3;
//下一功能
ctrl_process();
//进入RC522操作
}
string.h"
INT8Ustates=0;
//状态机
INT8UCard_type[2],//卡片类型
Card_SN[4]={0},//IC卡号
Card_SN_BUF[4]={0xff,0xff,0xff,0xff},//卡号登记缓冲区
KEY_BUF[8]={'
0'
'
};
INT8UbPass=0;
bWarn=0;
voiduart_over(void)//串口数据还原
UartCount=0;
UartStart=FALSE;
UartComp=FALSE;
voidpass(void)
Delay_ms(2000);
//让卡片离开
voidwarn(void)
LED_BLINK_2();
INT8UIC_READ(void)
INT8UID_ASC[8],i;
if(PcdRequest(PICC_REQIDL,Card_type)!
=MI_OK)//寻天线区内未进入休眠状态的卡,返回卡片类型2字节
if(PcdRequest(PICC_REQIDL,Card_type)!
{
returnFALSE;
}
if(PcdAnticoll(Card_SN)!
=MI_OK)//防冲撞,返回卡的序列号4字节
bWarn=1;
returnFALSE;
bPass=1;
send_bytes(Card_type,2);
send_bytes(Card_SN,4);
for(i=0;
i<
4;
i++)//卡ID号转化成ASCII
if(Card_SN[i]/16>
9)ID_ASC[i*2]=Card_SN[i]/16+'
7'
;
elseID_ASC[i*2]=Card_SN[i]/16+'
if(Card_SN[i]%16>
9)ID_ASC[i*2+1]=Card_SN[i]%16+'
elseID_ASC[i*2+1]=Card_SN[i]%16+'
display2(3,0,"
ID:
"
4);
//显示卡号
display2(3,2,ID_ASC,8);
returnTRUE;
voidctrl_process(void)
{
INT8Ui,key_count,key_value=16,table[8]="
--------"
statesbuf;
if(states!
=statesbuf)//状态改变,清屏
display_clear_line
(2);
display_clear_line(3);
statesbuf=states;
switch(states)
case0:
//IC卡读卡输入
display(1,0,1);
if(IC_READ())
{
if((Card_SN[0]==Card_SN_BUF[0])
&
&
(Card_SN[1]==Card_SN_BUF[1])
&
(Card_SN[2]==Card_SN_BUF[2])
(Card_SN[3]==Card_SN_BUF[3]))
{
relay_ON();
//灯开关
display(2,0,5);
}
elsedisplay(2,0,6);
relay_OFF();
break;
case1:
display(1,0,2);
//密码输入
display2(3,0,table,8);
key_count=0;
{
key_value=key_scan();
if(key_value==12)
{
states--;
return;
}
if(key_value==13)
states++;
return;
}
if(key_value>
=0&
key_value<
=9)//有按键输入
{
table[key_count++]=key_value+'
display2(3,0,table,8);
}
if(key_value==11)//退格
{
table[--key_count]='
-'
if(key_count==8)
if(table[0]==KEY_BUF[0]&
table[1]==KEY_BUF[1]&
table[2]==KEY_BUF[2]&
table[3]==KEY_BUF[3]&
table[4]==KEY_BUF[4]&
table[5]==KEY_BUF[5]&
table[6]==KEY_BUF[6]&
table[7]==KEY_BUF[7])//密吗正确
bPass=1;
display(2,0,5);
relay_OFF();
break;
else//密码错误
{
beep1();
bWarn=1;
display(2,0,6);
break;
}
break;
case2:
display(1,0,3);
//IC卡登记
if(IC_READ())
for(i=0;
i++)
Card_SN_BUF[i]=Card_SN[i];
EEPROM_WRITE(0,Card_SN,4);
//写入EEPROM
case3:
display(1,0,4);
//密码设置
while
(1)
if(key_value>
if(key_count==8&
key_value==15)//按下确定键
for(i=0;
8;
KEY_BUF[i]=table[i];
EEPROM_WRITE(7,KEY_BUF,8);
break;
}
default:
break;
}
if(bPass)//处理成功
bPass=0;
pass();
if(bWarn)//处理失败
bWarn=0;
warn();
#include"
intrins.h"
voiddelay_ns(unsignedintns)
unsignedinti;
ns;
nop();
//------------------------------------------
//读SPI数据
unsignedcharSPIReadByte(void)
unsignedcharSPICount;
//Counterusedtoclockoutthedata
unsignedcharSPIData;
SPIData=0;
for(SPICount=0;
SPICount<
8;
SPICount++)//Preparetoclockinthedatatoberead
SPIData<
<
=1;
//Rotatethedata
CLR_SPI_CK;
//nop();
//nop();
//RaisetheclocktoclockthedataoutoftheMAX7456
if(STU_SPI_MISO)
SPIData|=0x01;
}
SET_SPI_CK;
//Droptheclockreadyforthenextbit
}//andloopback
return(SPIData);
//Finallyreturnthereaddata
}
//写SPI数据
voidSPIWriteByte(unsignedcharSPIData)
SPICount++)
if(SPIData&
0x80)
SET_SPI_MOSI;
else
CLR_SPI_MOSI;
nop();
=1;
}
/////////////////////////////////////////////////////////////////////
//功能:
读RC632寄存器
//参数说明:
Address[IN]:
寄存器地址
//返回:
读出的值
unsignedcharReadRawRC(unsignedcharAddress)
unsignedcharucAddr;
unsignedcharucResult=0;
CLR_SPI_CS;
ucAddr=((Address<
1)&
0x7E)|0x80;
SPIWriteByte(ucAddr);
ucResult=SPIReadByte();
SET_SPI_CS;
returnucResult;
写RC632寄存器
//value[IN]:
写入的值
voidWriteRawRC(unsignedcharAddress,unsignedcharvalue)
0x7E);
SPIWriteByte(value);
清RC522寄存器位
reg[IN]:
//mask[IN]:
清位值
voidClearBitMask(unsignedcharreg,unsignedcharmask)
chartmp=0x00;
tmp=ReadRawRC(reg);
WriteRawRC(reg,tmp&
~mask);
//clearbitmask
置RC522寄存器位
置位值
voidSetBitMask(unsignedcharreg,unsignedcharmask)
WriteRawRC(reg,tmp|mask);
//setbitmask
//用MF522计算CRC16函数
voidCalulateCRC(unsignedchar*pIndata,unsignedcharlen,unsignedchar*pOutData)
unsignedchari,n;
ClearBitMask(DivIrqReg,0x04);
WriteRawRC(CommandReg,PCD_IDLE);
SetBitMask(FIFOLevelReg,0x80);
for(i=0;
i<
len;
i++)
{WriteRawRC(FIFODataReg,*(pIndata+i));
WriteRawRC(CommandReg,PCD_CALCCRC);
i=0xFF;
do
n=ReadRawRC(DivIrqReg);
i--;
while((i!
=0)&
!
(n&
0x04));
pOutData[0]=ReadRawRC(CRCResultRegL);
pOutData[1]=ReadRawRC(CRCResultRegM);
通过RC522和ISO14443卡通讯
Command[IN]:
RC522命令字
//pInData[IN]:
通过RC522发送到卡片的数据
//InLenByte[IN]:
发送数据的字节长度
//pOutData[OUT]:
接收到的卡片返回数据
//*pOutLenBit[OUT]:
返回数据的位长度
charPcdComMF522(unsignedcharCommand,
unsignedchar*pInData,
unsignedcharInLenByte,
unsignedchar*pOutData,
unsignedint*pOutLenBit)
charstatus=MI_ERR;
unsignedcharirqEn=0x00;
unsignedcharwaitFor=0x00;
unsignedcharlastBits;
unsignedcharn;
switch(Command)
casePCD_AUTHENT:
irqEn=0x12;
waitFor=0x10;
casePCD_TRANSCEIVE:
irqEn=0x77;
waitFor=0x30;
default:
WriteRawRC(ComIEnReg,irqEn|0x80);
ClearBitMask(ComIrqReg,0x80);
InLenByte;
{
WriteRawRC(FIFODataReg,pInData[i]);
WriteRawRC(CommandReg,Command);
if(Command==PCD_TRANSCEIVE)
SetBitMask(BitFramingReg,0x80);
//i=600;
//根据时钟频率调整,操作M1卡最大等待时间25ms
i=2000;
n=ReadRawRC(ComIrqReg);
0x01)&
waitFor));
ClearBitMask(BitFramingReg,0x80);
if(i!
=0)
if(!
(ReadRawRC(ErrorReg)&
0x1B))
status=MI_OK;
if(n&
irqEn&
0x01)
{status=MI_NOTAGERR;
n=ReadRawRC(FIFOLevelReg);
l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 门禁 系统 源程序