ImageVerifierCode 换一换
格式:DOCX , 页数:52 ,大小:41.07KB ,
资源ID:11484586      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11484586.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(51门禁系统源程序.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

51门禁系统源程序.docx

1、51门禁系统源程序51门禁系统源程序#include reg52.h#include main.h#include uart.h#include timer.h#include rc522.h#include ctrl.h#include lcd12864.h#include beep.h#include key.h #include EEPROM.h void init_all(void) /初始化 EA = 0; /关总中断 init_timer(); /定时器初始化 init_uart(); /串口初始化 init_rc522(); /RC522初始化 lcd_init(); /LCD初

2、始化 EEPROM_READ(0,Card_SN_BUF,4);/EEPROM初始化,取出记录的卡号 EEPROM_READ(7,KEY_BUF,8);/EEPROM初始化,取出记录的密码 send_bytes(Card_SN_BUF,4); EA = 1; /开总中断void main(void) /主函数 INT8U key; Delay_ms(50); /让硬件稳定 init_all(); /执行初始化函数 relay_OFF(); /关继电器 LED_BLINK_1(); /led test beep1(); /beep test display(0,0,0); /显示初始化 whil

3、e(1) key=key_scan(); /按键操作 if(key=12) if(states0) states-; else states=0; /上一功能 Card_SN_BUF4=0xff,0xff,0xff,0xff,/卡号登记缓冲区 KEY_BUF8=0,0,0,0,0,0,0,0;INT8U bPass = 0; bWarn = 0; void uart_over( void ) /串口数据还原 UartCount = 0; UartStart = FALSE; UartComp = FALSE;void pass( void ) beep1(); Delay_ms(2000);/

4、让卡片离开 LED_BLINK_1();void warn(void) LED_BLINK_2();INT8U IC_READ( void ) INT8U ID_ASC8,i; if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )/寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )/寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 return FALSE; if( PcdAnticoll( Card_SN ) != MI_OK ) /防冲

5、撞,返回卡的序列号 4字节 bWarn = 1; return FALSE; bPass = 1; send_bytes(Card_type,2); send_bytes(Card_SN,4); for(i=0;i9) ID_ASCi*2=Card_SNi/16+7; else ID_ASCi*2=Card_SNi/16+0; if(Card_SNi%169) ID_ASCi*2+1=Card_SNi%16+7; else ID_ASCi*2+1=Card_SNi%16+0; display2(3,0,ID: ,4); /显示卡号 display2(3,2,ID_ASC,8); return

6、TRUE;void ctrl_process( void ) INT8U i,key_count,key_value=16,table8=-,statesbuf; if(states!=statesbuf) /状态改变,清屏 display_clear_line(2); display_clear_line(3); statesbuf=states; switch(states) case 0: /IC卡读卡输入 display(1,0,1); if(IC_READ() if (Card_SN0=Card_SN_BUF0) &(Card_SN1=Card_SN_BUF1) &(Card_SN2

7、=Card_SN_BUF2) &(Card_SN3=Card_SN_BUF3) relay_ON();/灯开关 display(2,0,5); else display(2,0,6); relay_OFF(); break; case 1: display(1,0,2); /密码输入 display2(3,0,table,8); key_count=0; while(1) key_value=key_scan(); if(key_value=12) states-; return; if(key_value=13) states+; return; if(key_value=0 & key_v

8、alue =9)/有按键输入 tablekey_count+=key_value+0; display2(3,0,table,8); if(key_value=11)/退格 table-key_count=-; display2(3,0,table,8); if(key_count=8) if( table0=KEY_BUF0 & table1=KEY_BUF1 & table2=KEY_BUF2 & table3=KEY_BUF3 & table4=KEY_BUF4 & table5=KEY_BUF5 & table6=KEY_BUF6 & table7=KEY_BUF7 ) /密吗正确 b

9、Pass=1; relay_ON();/灯开关 display(2,0,5); relay_OFF(); break; else /密码错误 relay_OFF(); beep1() ; bWarn=1; display(2,0,6); break; break ; case 2: display(1,0,3); /IC卡登记 if(IC_READ() for(i=0;i=0 & key_value =9)/有按键输入 tablekey_count+=key_value+0; display2(3,0,table,8); if(key_value=11)/退格 table-key_count=

10、-; display2(3,0,table,8); if(key_count=8 & key_value = 15) /按下确定键 for(i=0;i8;i+) KEY_BUFi=tablei; EEPROM_WRITE(7,KEY_BUF,8);/写入EEPROM break; break ; default : break; if( bPass ) /处理成功 bPass = 0; pass(); if( bWarn ) /处理失败 bWarn = 0; warn(); #include reg52.h #include intrins.h #include main.h #include

11、 rc522.h #include string.hvoid delay_ns(unsigned int ns) unsigned int i; for(i=0;ins;i+) nop(); nop(); nop(); /-/ 读SPI数据 /-unsigned char SPIReadByte(void) unsigned char SPICount; / Counter used to clock out the data unsigned char SPIData; SPIData = 0; for (SPICount = 0; SPICount 8; SPICount+) / Prep

12、are to clock in the data to be read SPIData =1; / Rotate the data CLR_SPI_CK; /nop();/nop(); / Raise the clock to clock the data out of the MAX7456 if(STU_SPI_MISO) SPIData|=0x01; SET_SPI_CK; /nop();/nop(); / Drop the clock ready for the next bit / and loop back return (SPIData); / Finally return th

13、e read data /-/ 写SPI数据 /-void SPIWriteByte(unsigned char SPIData) unsigned char SPICount; / Counter used to clock out the data for (SPICount = 0; SPICount 8; SPICount+) if (SPIData & 0x80) SET_SPI_MOSI; else CLR_SPI_MOSI; nop();nop(); CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData = 1; /功 能

14、:读RC632寄存器/参数说明:AddressIN:寄存器地址/返 回:读出的值/unsigned char ReadRawRC(unsigned char Address) unsigned char ucAddr; unsigned char ucResult=0; CLR_SPI_CS; ucAddr = (Address1)&0x7E)|0x80; SPIWriteByte(ucAddr); ucResult=SPIReadByte(); SET_SPI_CS; return ucResult;/功 能:写RC632寄存器/参数说明:AddressIN:寄存器地址/ valueIN:写

15、入的值/void WriteRawRC(unsigned char Address, unsigned char value) unsigned char ucAddr; CLR_SPI_CS; ucAddr = (Address1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value); SET_SPI_CS; /功 能:清RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:清位值/void ClearBitMask(unsigned char reg,unsigned char mask) char tmp = 0x00; tm

16、p = ReadRawRC(reg); WriteRawRC(reg, tmp & mask); / clear bit mask /功 能:置RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:置位值/void SetBitMask(unsigned char reg,unsigned char mask) char tmp = 0x00; tmp = ReadRawRC(reg); WriteRawRC(reg,tmp | mask); / set bit mask/用MF522计算CRC16函数/void CalulateCRC(unsigned char *pInda

17、ta,unsigned char len,unsigned char *pOutData) unsigned char i,n; ClearBitMask(DivIrqReg,0x04); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; ilen; i+) WriteRawRC(FIFODataReg, *(pIndata+i); WriteRawRC(CommandReg, PCD_CALCCRC); i = 0xFF; do n = ReadRawRC(DivIrqReg); i-; whi

18、le (i!=0) & !(n&0x04); pOutData0 = ReadRawRC(CRCResultRegL); pOutData1 = ReadRawRC(CRCResultRegM);/功 能:通过RC522和ISO14443卡通讯/参数说明:CommandIN:RC522命令字/ pInDataIN:通过RC522发送到卡片的数据/ InLenByteIN:发送数据的字节长度/ pOutDataOUT:接收到的卡片返回数据/ *pOutLenBitOUT:返回数据的位长度/char PcdComMF522(unsigned char Command, unsigned char

19、*pInData, unsigned char InLenByte, unsigned char *pOutData, unsigned int *pOutLenBit) char status = MI_ERR; unsigned char irqEn = 0x00; unsigned char waitFor = 0x00; unsigned char lastBits; unsigned char n; unsigned int i; switch (Command) case PCD_AUTHENT: irqEn = 0x12; waitFor = 0x10; break; case

20、PCD_TRANSCEIVE: irqEn = 0x77; waitFor = 0x30; break; default: break; WriteRawRC(ComIEnReg,irqEn|0x80); ClearBitMask(ComIrqReg,0x80); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i MAXRLEN) n = MAXRLEN; for (i=0; in; i+) pOutDatai = ReadRawRC(FIFODataReg); else status = MI_ERR;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1