⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mimashuo2.c

📁 单片机C语言编写的电子密码锁
💻 C
字号:
/****************************************************************
*		***广东省东莞市厚街镇沙塘村顺程鞋业有限公司维护课	***
*		********************************************							
*设计:李小义								
*联系电话:0769-81645660								
*邮址:523953								
*办公地点:成型课								
*								
*								
							
*								
*公司:广东省东莞市厚街镇沙塘村顺程鞋业有限公司保全课					
*****************************************************************/
/****************************************************************
*描述:	此程序可以存储,修改密码的密码锁				
*								
*************************读文件头****************************************/
#include <reg51.h>
#include <intrins.h>


//**********************定义控制脚*********************************************

bdata unsigned char temp,temp1;
bdata char com_date;

//-------------------

 sbit SCL=P3^7;
 sbit WP=P3^6;
 sbit SDA=P2^7;
 sbit led=P3^5;
 sbit P2_4=P2^4;
 sbit P2_3=P2^3;
 sbit com_date0=com_date^0;
 sbit com_date7=com_date^7;
 sbit temp1_7=temp1^7;
 sbit P2_6=P2^6;
 sbit P3_2=P3^2;
 sbit P2_0=P2^0;
 sbit P3_3=P3^3;
 sbit P3_4=P3^4;
//-------------------------
	bit YES1;
 bit lck=0;
 bit YES=0;
 bit ok,getpass;

//-----------------------

 data unsigned char  pass,i,j,k,m,r,t,w,y,u,v,s,f,command,js,xs,jn;
 unsigned char A,AA,C,D;

/********************定义变量*****************************************/
unsigned char key_date;			//按键内容变量
unsigned char one ,two;			//显示数码管第一位,二位内容变量
 unsigned char p,q;




/********************定义数组******************************************/
unsigned char code SEG_7[] = {0x00,0x060,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x28,0xfc,0x31};
				// 写入到AT24C01的LED显示用0--9数据
data unsigned char  setmima[6];		//设定密码数组变量
data unsigned char  inmima[6];		//输入密码数组变量

/*******************声明函数***************************************/

void delay(unsigned int z);
void Reset (void);
void T0_init (void);
void display (void);
unsigned char scan_key(void);
void setpass (void);
void inpass (void);
extern void start (void);
extern void stop (void);
extern void ack (void);
extern void shift8 ( unsigned char A);
extern unsigned char rd_24c01(unsigned char AA);
extern void wr_24c01( unsigned char C,unsigned char D);
void X0ZD (void) ;



/******************* 初始化******************************************/
void Reset (void)
{	
	P0=0xff;
	P2=0x00;
	delay(1000);
	P0=0x00;				
	P2=0xff;					//关闭显示器
	P1=0xff;					//关闭键盘
	P3=0xe7;
	for (i=0;i<6;i++)
		{
			setmima[i]=rd_24c01(i);		//设定密码变量中装入24C01存储器内容
		P0=SEG_7[setmima[i]];
		P2=0xe7;	
		delay(1);
		P2=0xff;
	for (js=0;js<6;js++)

		{
		inmima[jn]=0;	}							//输入数组清零

												}


	T0_init();	
						//T0按键扫描中断初始化
	EX0=1;
				}	

/******	//10ms按键检测子函数初始化*********************/
void T0_init (void)		
{
	TMOD=0x11;
	TH0=0xd8;
	TL0=0xf0;
	EA=1;
	ET0=1;
	TR0=1;
	PX0=1;
				}
/**********************************/
void X0ZD (void) interrupt 0 using 3
{
	for (jn=0;jn<6;jn++)

		{
		inmima[jn]=0;	}
ok=0;

}

/*****************T0中断服务子函数用于检测按键子函数*******************/
void T0_ZD (void) interrupt 1 using 2 
{
	
	TH0=0xd8;
	TL0=0xf0;
	
	if (q==1)
		{
			p++;}
	if (p >=30)
		{
		p=0;
		q=0;}

	P1=0xf0;
	if (P1 !=0xf0)
	{
		if (p==0) q=1;

		if (p==1)
			{
				scan_key();
				if (key_date >=0x0d) 
			{ key_date=0;}
				if (key_date==0x0a) 
  			   	{getpass=1;}
					else 
						{getpass=0;}
				if (getpass)
				{
				pass = ! pass;    }
				if (pass)
				
				{	one =0x61;}					//第一位显示S
					else
						{one =0x6e;	}			//第一位显示J			
						delay(1);
						if (key_date==0x0c)  
					{
					ok=1;
					one=0x28;
											}
					else
						{ok=0;
									
											}
			   if ((ok || getpass)==0)
				{	
				 inmima[0]=inmima[1];
				 inmima[1]=inmima[2];
				 inmima[2]=inmima[3];
				 inmima[3]=inmima[4];
				 inmima[4]=inmima[5];
				 inmima[5]=key_date;	}
				 two=SEG_7[key_date];
					display();
												}}

											
												}


/***************子函数用于显示一.二位LED内容****************/

void 	display(void)
{
	for (m=0;m<60;m++)
	{
		P0=one;
		P2_4=0;
		delay(2);
		P2_4=1;
		P0=two;
		P2_3=0;
		delay(2);
		P2_3=1;		
						}

						}


/*************************************************************************/
unsigned char scan_key (void)
{
	temp=0xf7;
	w=1;											//赋N变量初值
	for (r=0;r<4;r++)							//行循环4次
		{
		
			P1=temp;								//变量中的值装入给P1上
			temp1=P1;							//读取P1口中的值装入TEMP1变量中
			for (t=0;t<3;t++)					//列循环3次
				{
					if (temp1_7==0)		//读取P1.7中的值若为1
						{
							key_date=w;			//键值为N中的数
							TR1=1;				//启动显示LED中断显示按键内容
							led=0;		}		//发光二极管同步显示
					temp1 =_crol_(temp1,1);					//列循环变量左移一位
					w++;			
					}			//按键计数值加1
				
					temp =_cror_(temp,1);	}					//行循环变量左移一位
				return (key_date);			//返回按键内容
										}

/*******SETPASS子函数***************************************/
void setpass(void)
{

if (ok)
{
	one=0x6e;		//显示HD表示存入存储器中
	two=0x7a;
	display();
	if (YES==0)
		{
		if (inmima[0]==setmima[0])
			{
			if (inmima[1]==setmima[1])
				{
				if (inmima[2]==setmima[2])
					{
					if (inmima[3]==setmima[3])
						{
						if (inmima[4]==setmima[4])
							{
							if (inmima[5]==setmima[5])
								{
									YES=1;
											
								for (js=0;js<6;js++)
							
									{
									inmima[jn]=0;	}							//输入数组清零
								P2=0xdf;
								P0=0xfc;
								P3_4=1;					//指示灯亮

								delay(2000);			//显示可以重新输入密码
								ok=0;

									}}}}}}}}				//旧密码核对正确

		
	if (YES)
	{
	if (ok)
		{	
			for (y=0;y<6;y++)
				{
					one=0x1e;									//显示TO表示把密码设定值装载到内存变量中
					two=0xfc;
					display();
			wr_24c01 (y,inmima[y]);
										}
					P3_4=0;				//指示灯灭

		for (u=0;u<6;u++)
			{
				setmima[u]=rd_24c01(u);}
		one=0xfc;									//显示OK表示全部操作成功						
		two=0x4e;
	display();
	display();
	display();
	display();
		for (u=0;u<6;u++)				//显示修改密码
			{
		P0=SEG_7[setmima[i]];
		P2=0;	
		delay(500);
		P2=0xff;			}


	for (js=0;js<6;js++)
			{
				inmima[jn]=0;	}		
				P2=0xff;
						one=0x70;			//显示J
	  pass=0;				
	  YES=0;
		}
	  ok=0;
		two=0x00;
		P2=0xff;
		}}

/***********************************************************/
void inpass (void)
{
	if (ok)
	{
		if (inmima[0]==setmima[0])
			{
			if (inmima[1]==setmima[1])
				{
				if (inmima[2]==setmima[2])
					{
					YES1=1;}
					else
				{	YES1=0;
								}}}

					if (YES1)
					{
					if (inmima[3]==setmima[3])
						{
						if (inmima[4]==setmima[4])
							{
							if (inmima[5]==setmima[5])
							{
						lck=1;

						one=0xfc;							//显示OP表示开锁
						two=0xcf;
						
					  	display();
						P1=0xfc;
						P2_6=0;
						P2_0=0;				//继电器吸合
						P3_3=1;				//指示灯亮
						delay(4000);
						lck=0;
						P3_3=0;				//指示灯灭
						P2_6=1;
						P2_0=1;
						P1=0xff;				//开锁10S钟以后关闭锁及显示器
						ok=0;					//确认标志复位
						YES1=0;
						for (js=0;js<6;js++)

						{
								inmima[jn]=0;	}		
						one=0x70;			//显示J
						two=0x00;
						}}}}
	else
	{				
					lck=0;
						one=0x1c;							//显示LK表示上锁
						two=0x4e;
					  	display();
							for (js=0;js<6;js++)

							{
								inmima[jn]=0;	}		
											}
						one=0x1c;							//显示LK表示上锁
						two=0x4e;

					  	display();
					  	display();
					  	display();

						ok=0;
						one=0x70;			//显示J
						two=0x00;
						
						}}


/******************24c01存储器函数***************************************/
void start (void)
{
	SDA=1;	_nop_();_nop_();_nop_();_nop_();
	SCL=1; _nop_();_nop_();_nop_();_nop_();
	SDA=0; _nop_();_nop_();_nop_();_nop_();
	SCL=0; _nop_();_nop_();_nop_();_nop_();  }

/*******************************/

void stop (void)
{
	SDA=0; _nop_();_nop_();_nop_();_nop_();
	SCL=1; _nop_();_nop_();_nop_();_nop_();
	SDA=1; _nop_();_nop_();_nop_();_nop_();
										}

/************************************/
void ack()
{
	SCL=1; _nop_();_nop_();_nop_();_nop_();
	SCL=0; _nop_();_nop_();_nop_();_nop_();  }
/************************/
void shift8(char A)
{
	com_date=A;

	for	(f=0;f<8;f++)
		{
			SDA=com_date7;
			SCL=1; 	 _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_(); 
			SCL=0; 	 _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();
 		    com_date=com_date*2;
															}}

/********************************************************/
unsigned char rd_24c01(char AA)
{
	SDA=1; _nop_();_nop_();_nop_();_nop_();
	SCL=0; _nop_();_nop_();_nop_();_nop_();
	start();
	command=160;
	shift8(command);
	ack();
	shift8(AA);
	ack();
	start();
	command=161;
	shift8(command);
	ack();
	SDA=1; _nop_();_nop_();_nop_();_nop_();
	for (s=0;s<8;s++)
	{
		com_date=com_date*2;
		SCL=1; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
		com_date0=SDA;
		SCL=0; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
														}
	  stop();
	  return(com_date);
	  }

/************************************************/
void wr_24c01(char C,char D)
{
	WP=0;
	 _nop_(); _nop_();_nop_();_nop_();_nop_();

	SDA=1; _nop_(); _nop_();_nop_();_nop_();
	SCL=0; _nop_(); _nop_();_nop_();_nop_();
	start();
	command=160;
	shift8(command);
	ack();
	shift8(C);
	ack();
	shift8(D);
	ack();
	stop();
	 _nop_(); _nop_();_nop_();_nop_();_nop_();
	 delay(10);
	WP=1;
		}
/***********************************/
//************延时K*1ms子函数*****************
void delay(unsigned int z)
{
unsigned int h,g;
for (h=0;h<z;h++)
{
	for (g=0;g<120;g++)
	{;}
	}
	}






/****************************主程序**************************************/
  void main (void)
  {
	Reset();					//复位
		ok=0;
		one=0x70;			//显示J

	while (1)
	{
		two=0x00;
			display();
			switch (pass)		//按PASS值散传
				{
				case 0:
					inpass ();	//输入密码函数
					break;
				case 1:
					setpass ();	//设定密码函数
					break;
				default:		//其余退出
					break;
							}}}




                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -