基于单片机的IC卡门禁系统 - 图文 联系客服

发布时间 : 星期四 文章基于单片机的IC卡门禁系统 - 图文更新完毕开始阅读1ecd4061a300a6c30d229f27

附录一 电路图

23

附录二、程序源代码

#include \#include \

#include \sbit JDQ=P1^6; sbit LED=P1^7; uchar flag1=0;

INT8U CardRevBuf[16] = { 0 };

void init_all(void) { EA = 0; init_rc522(); init_lcd(); EA = 1; }

void display_no_id( void ) { DisplayListChar( 0, 0, \ \ DisplayListChar( 0, 1, \ OFF \}

void display_id( INT8U * SrcBuf ) { char DisplayBuf[10]; char *pDisplayChar; INT8U Tmp, i; pDisplayChar = DisplayBuf; for( i = 0; i < 4; i++ ) { Tmp = ( ( *SrcBuf ) >> 4 ) & 0x0F; if( ( Tmp >=0 ) && ( Tmp <= 9 ) ) { *pDisplayChar ++ = '0' + Tmp; } else

24

{ *pDisplayChar ++ = 'A' + Tmp - 10; } Tmp = ( *SrcBuf ) & 0x0F; if( ( Tmp >=0 ) && ( Tmp <= 9 ) ) { *pDisplayChar ++ = '0' + Tmp; } else { *pDisplayChar ++ = 'A' + Tmp - 10; } SrcBuf ++; } *pDisplayChar ++ = '\\0'; DisplayListChar( 3, 1, DisplayBuf ); }

void ctrl( void ) { if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 { if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 { //display_no_id(); JDQ=0;LED=1;beep=1; CardRevBuf[2]=0; return; } } if( PcdAnticoll( &CardRevBuf[2] ) != MI_OK ) //防冲撞,返回卡的序列号 4字节 { //display_no_id(); JDQ=0;LED=1;beep=1;CardRevBuf[2]=0; return; } if( PcdSelect( &CardRevBuf[2] ) != MI_OK )//选卡 卡片序列号,4字节 {

25

//display_no_id(); JDQ=0;LED=1;beep=1;CardRevBuf[2]=0; return; } }

/********模块变量定义区*******************************************/ char SS,MM,HH,XQ,DA,MO,YE;

uint countt1=0;//定义秒钟产生的计数变量。

char counter11=0;//用于记录K1键选择的是哪个被设置变量 uchar key_value=0;//用于记录键盘扫描获得的键值

/****************************************************************** - 函数名称:timer0_init() - 隶属模块:time.h - 函数属性:内部

- 参数说明:无返回值,无带入参数 - 返回说明:无

- 功能描述:对定时器T0进行初始化.

*****************************************************************/ void timer0_init()//定时器T0的初始化程序 {

TMOD=TMOD|0X01;//0000 0001 T0工作于方式1,定时模式 TH0=(65536-50000)/256;

TL0=(65536-50000)%6;//定时50MS EA=1;ET0=1;//开启总中断,和分中断 TR0=1;//启动定时器T0 }

/****************************************************************** - 函数名称:timer0() interrupt 1 - 隶属模块:time.h - 函数属性:内部

- 参数说明:无返回值,无带入参数 - 返回说明:无

- 功能描述:中断自动响应函数,无需调用.中断产生成秒、分、时信息 *****************************************************************/ void timer0() interrupt 1 {

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;//一定要重新赋初值 countt1++;

if(countt1==20)//如果count=1000表示产生了1秒钟

26