224 基于51单片机的智能门禁系统仿真设计

实现的功能包括密码输入开门禁和刷卡开门禁,密码输入功能可以任意修改密码,三次输错报警,掉电存储功能。

门禁的初始密码为:123456或者111111

完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1z_YNBHSXG4Vs6dN68fmipg?pwd=8888

部分代码展示

#include <reg52.h>
#include "delay_ms.h"
#include  "矩阵键盘.h"
#include "i2c.h"
#include "1602.h"
#include "delay_ms.h"
#include "mima.h"
#define uchar		unsigned char
#define uint		unsigned int
#define A		0x0a                            /* 输入密码 */
#define B		0x0b                            /* 修改密码 */
#define D		0x0d                            /* 关锁 */
#define enter		0x0c                            /* 确认 */
#define backspace	0x0f                            /* 退格键 */
sbit		baojing		= P3 ^ 7;               /* 蜂鸣器接口 */
sbit		lock		= P3 ^ 3;               /* 锁信号 */
sbit		set		= P3 ^ 2;
sbit		men		= P2 ^ 0;
sbit		led		= P2 ^ 1;
uchar idata	mima_5[6]	= { 1, 2, 3, 4, 5, 6 }; /* 初始密码 */
uchar		flag_change;
uchar		aa;                                     /* 存放密码错误的次数,够三次报警 */
uchar		bb;
uchar		flag_t0;
void baoj1()                                            /* 报警函数 */
{
	int i;
	for ( i = 0; i < 5; i++ )
	{
		baojing = 1;
		delay_ms( 5 );
		baojing = 0;
		delay_ms( 5 );
	}
}


void baoj()
{
	uchar i;
	for ( i = 0; i < 10; i++ )
		baoj1();
}


/*密码处理函数*/
void mimachuli()
{
	uchar		key, i;
	uchar idata	mima_1[6]	= { ' ', ' ', ' ', ' ', ' ', ' ' }; /* 存放密码缓冲区 */
	uchar idata	mima_2[6]	= { ' ', ' ', ' ', ' ', ' ', ' ' };
	uchar idata	mima_3[6]	= { ' ', ' ', ' ', ' ', ' ', ' ' };

	if ( men == 0 )
	{
		delay_ms( 20 );
		if ( men == 0 )
		{
			lcd_pos( 0, 0 );
			write_com( 0x0c );      /* 关光标 */
			write_com( 0x06 );      /* 写一个字符后地址指针加 1 */
			write_com( 0x01 );      /* 显示清零,数据指针清零 */
			write_n_char( "Men Jin Open" );
			aa	= 0;            /* 清除密码错误次数 */
			lock	= 0;            /* 开锁 */
			baojing = 1;            /* 响一下 */
			delay_ms( 1000 );
			baojing = 0;
			led	= 0;
		}
		while ( !men )
			;
	}

	key = step_choose();
	if ( key == A )                                                                         /* A被按下,接收输入密码,处理 */
	{
		read_n_add( mima_1, 0x00, 6 );
		write_com( 0x06 );                                                              /* 写一个字符后地址指针加 1 */
		write_com( 0x01 );                                                              /* 显示清零,数据指针清零 */
		write_com( 0x0f );                                                              /* 显示光标 */
		lcd_pos( 0, 0 );
		write_n_char( " press password " );

		if ( input_mima( mima_2 ) )                                                     /* 处理输入密码 */
		{
			if ( mimaduibi( mima_2, mima_1 ) )                                      /* 密码正确 */
			{
				lcd_pos( 0, 0 );
				write_com( 0x0c );
				write_com( 0x06 );                                              /* 写一个字符后地址指针加 1 */
				write_com( 0x01 );                                              /* 显示清零,数据指针清零 */
				write_n_char( " password right " );
				aa	= 0;                                                    /* 清除密码错误次数 */
				lock	= 0;                                                    /* 开锁 */
				baojing = 1;                                                    /* 响一下 */
				delay_ms( 1000 );
				baojing = 0;
				TR0	= 1;
				flag_t0 = 1;
				while ( key != D && flag_t0 )                                   /* D没按下一直开 */
				{
					key = keyscan();
				}
				TR0	= 0;
				lock	= 1;                                                    /* D按下了关锁 */
			}else  { /* 密码 不正确 */
				lcd_pos( 0, 0 );
				write_com( 0x0c );                                              /* 关光标 */
				write_com( 0x06 );                                              /* 写一个字符后地址指针加 1 */
				write_com( 0x01 );                                              /* 显示清零,数据指针清零 */
				write_n_char( " password wrong" );
				delay_ms( 1000 );
				aa++;
				if ( aa == 4 )
				{
					aa	= 0;
					i	= 20;                                           /* 密码不正确报警 */
					while ( i-- )
						baoj();
				}
			}
		}else  { /* 密码没有输入正确或完成 */
			lcd_pos( 0, 0 );
			write_com( 0x0c );                                                      /* 关光标 */
			write_com( 0x06 );                                                      /* 写一个字符后地址指针加 1 */
			write_com( 0x01 );                                                      /* 显示清零,数据指针清零 */
			write_n_char( " password wrong" );
			delay_ms( 1000 );
			aa++;
			if ( aa == 4 )
			{
				aa	= 0;
				i	= 20;                                                   /* 密码不正确报警 */
				while ( i-- )
					baoj();
			}
		}
	}

	if ( key == B )                                                                         /* B被按下,修改密码 */
	{
		read_n_add( mima_1, 0x00, 6 );
		write_com( 0x06 );                                                              /* 写一个字符后地址指针加 1 */
		write_com( 0x01 );                                                              /* 显示清零,数据指针清零 */
		write_com( 0x0f );                                                              /* 显示光标 */
		lcd_pos( 0, 0 );
		write_n_char( " input password" );
		write_com( 0x0f );                                                              /* 显示光标 */
		if ( input_mima( mima_2 ) )                                                     /* 处理输入密码 */
		{
			if ( mimaduibi( mima_2, mima_1 ) )                                      /* 密码正确 */
			{
				lcd_pos( 0, 0 );
				write_com( 0x0c );
				write_com( 0x06 );                                              /* 写一个字符后地址指针加 1 */
				write_com( 0x01 );                                              /* 显示清零,数据指针清零 */
				write_n_char( "password right " );
				aa = 0;                                                         /* 清除密码错误次数 */
				delay_ms( 1500 );
				flag_change = 1;
				while ( flag_change )                                           /*下面开始修改密码 */
				{
					write_com( 0x06 );                                      /* 写一个字符后地址指针加 1 */
					write_com( 0x01 );                                      /* 显示清零,数据指针清零 */
					write_com( 0x0f );                                      /* 显示光标 */
					lcd_pos( 0, 0 );
					write_n_char( "In new password" );
					delay_ms( 1500 );
					if ( input_mima( mima_2 ) )                             /* 处理输入密码 */
					{
						lcd_pos( 0, 0 );
						write_com( 0x0c );
						write_com( 0x06 );             

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值