基于STC89C52单片机的密码锁设计与实现

基于STC89C52单片机的密码锁设计与实现LCD电路,为了能直观的看到生成的密码,以及用户输入的密码,就需要一个显示设备,而在单片机系统中,比较常见的显示设备就是LED和LCD,相比较于LED来说,LCD显示效果更加美观,更加真实;社会在不断发展、物质生活水平在不断的提高,人们对自己的生活水平也提出了更高的要求,尤其是在安全隐私方面。按键电路,为了做到密码的提取以及校验,就需要有人机交互的操作,本设计采用了机械按键充当此功能。LED电路,本设计有红绿两个LED,当密码校验正确时,绿灯亮;继电器电路,为了模拟锁的开和关,用到了继电器的开关来模拟。

目 录
一、引言 3
1.1 课题研究背景及意义 3
1.2 课题设计的目的以及主要内容 4
二、系统硬件设计 5
2.1、系统硬件总体设计 5
2.2 单片机型号的选择 6
1.STC89C52单片机简介 6
2.STC89C52单片机时序 7
3.STC89C52单片机引脚介绍 7
2.3 单片机最小系统 9
2.4 LCD选型 11
2.5 LCD电路设计 13
2.6 LED提示电路 14
2.7 继电器电路 14
2.8 按键电路 14
三、系统软件设计 16
3.1 LCD子程序模块 17
3.3 按键模块流程图 19
3.4 LED指示灯流程图 20
参考文献 21
致谢 22

1.2 课题设计的目的以及主要内容
社会在不断发展、物质生活水平在不断的提高,人们对自己的生活水平也提出了更高的要求,尤其是在安全隐私方面。因此洗安全易用的密码锁又显得极其重要,而且它已经成为人们日常生活的重要组成部分。
本系统设计了一款性价比较高的基于LCD1602和单片机为控制核心的电子密码锁系统。
本课题设计功能主要包括如下几个方面:

  1. 按下“存包”按键生成随机的四位数密码;
  2. 按下“取包”按键后,进行密码输入并自动校验;
  3. 密码校验时对错与否,通过不同的LED指示灯来指示;
  4. LCD实时显示相关信息;
  5. 用protues仿真软件实现上述功能。

二、系统硬件设计
2.1、系统硬件总体设计
为了达到系统要求,硬件应该包括如下部分:
单片机最小系统,最小系统主要包括时钟电路和复位电路;
LCD电路,为了能直观的看到生成的密码,以及用户输入的密码,就需要一个显示设备,而在单片机系统中,比较常见的显示设备就是LED和LCD,相比较于LED来说,LCD显示效果更加美观,更加真实;
按键电路,本文转载自http://www.biyezuopin.vip/onews.asp?id=14935为了做到密码的提取以及校验,就需要有人机交互的操作,本设计采用了机械按键充当此功能。
LED电路,本设计有红绿两个LED,当密码校验正确时,绿灯亮;相反当密码校验错误时,红灯亮。
继电器电路,为了模拟锁的开和关,用到了继电器的开关来模拟。

#include <reg51.h>
#include <intrins.h>
#include <stdlib.h>
#include <string.h>
#include<absacc.h>
#include "lcd1602.h"
#include "main.h"
#include "key.h"

sbit Lock = P3^7;  //代表锁控的继电器IO   高电平关锁,低电平开锁
sbit LEDRED = P3^3;  //代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
sbit LEDGREEN = P3^4;  //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
uchar genPasswd[4];           //存储生成的四位随机数密码
uchar inpPasswd[4];           //存储取包时输入的四位密码
uchar code welcome[8]="welcome";  //开机显示的欢迎标语
uchar code set[7]="Passwd";    //显示生成的密码标题
uchar code  close[12]="close door!";   //提示关门
uchar code 	input[13] = "input passwd";   //提示请输入密码

/****************定时器设置相关的变量***********************/
unsigned char TL0_temp;	 /*暂存TL0的初值*/
unsigned char TH0_temp;	 /*暂存TH0的初值*/
#define INT_CLOCK 10    /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
#define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/





/*延时程序*/
void delay(uint z)		
{
	unsigned int i,j;
   for(i=0;i<z;i++)
    for(j=0;j<100;j++);
}
/******************************
显示首页 welcome
******************************/
void display1()
{
   unsigned char i;
   for(i = 0;i < 7;i++)
   {
   		wr_com(0x85+i);
		wr_dat(welcome[i]);
   }
}


/************************************
显示密码生成界面
************************************/
void display2()
{
   unsigned char i;
   
   for(i = 0;i < 6;i++)
   {
   		wr_com(0x85+i);
		wr_dat(set[i]);
   }
   for(i = 0;i < 4;i++)
   {
   		wr_com(0xc6+i);
		wr_dat(genPasswd[i]+0x30);
		
   }
}

/************************************
显示请关门界面
************************************/

void display3()
{
     unsigned char i;
   for(i = 0;i < 11;i++)
   {
   		wr_com(0x83+i);
		wr_dat(close[i]);
   }

}


/************************************
显示密码输入界面
************************************/
void display4()
{
   unsigned char i;
   for(i = 0;i < 12;i++)
   {
   		wr_com(0x82+i);
		wr_dat(input[i]);
   }
   for(i = 0;i < 4;i++)
   {
   		wr_com(0xc6+i);
		wr_dat(inpPasswd[i]+0x30);
		
   }

}
	




/***********************************
定时器0初始化
***********************************/
void Timer0_init()
{
	unsigned long T0_temp;                                     /*暂存T0的初始值	*/
	T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12);    /*T0初始值计算公式,参考教科书*/
	TL0_temp = T0_temp & 0xff;
	TH0_temp = T0_temp >> 8;
	TL0 = TL0_temp;
	TH0 = TH0_temp;
	TMOD |= 0x01;
	TR0 = 1;  	              /*开定时器0中断*/
	ET0 = 1;  
	EA = 1;                    /*开总中断*/                                       

}






/*主函数*/
uchar global_state = 0;
uchar count_num = 0;  //输入的数字个数
void main()
{  
   uchar i;
   uchar passwd;
    
   	uchar key_value = 0;
	uchar temp_key_value = 0xff;
	Lock = 1;  //刚上电 锁是需要保持闭合
	Timer0_init();	//定时器初始化
 	lcd_init();	//LCD1602初始化
   
	while(1)	//进入不断循环
	{
	   	temp_key_value = Calkey_scan();	  //读取矩阵按键的键值
		if(temp_key_value != 0xff)
		{
			key_value = temp_key_value;
		}
		switch(global_state)
		{
			case 0:	 //初始化状态
				display1();	 //显示欢迎语句	-- "welcome"
			

				if(key_value == 13)  //存包按键被按下
				{
				    key_value = 0xff;  //将按键值清除
					Lock = 0;    //开锁
					
					display3();    //显示关门提示语	-- "close door!"
				    delay(1900);    //等待关门 大约3秒
					Lock = 1;   //关门
					clear();		 //清屏,准备下一屏的显示
					global_state = 1;   //切换运行状态
					passwd = TL0;  //采用定时器寄存器的值作为密码
					genPasswd[0] = passwd/100;		  //存储密码
					genPasswd[1] = passwd%100/10;
					genPasswd[2] = passwd%10;
					genPasswd[3] = (genPasswd[1]+genPasswd[2])%10;
				} 
				if(key_value == 14)  //取包按键被按下
				{
				    key_value = 0xff;  //将按键值清除
					clear();    //清屏,准备下一屏的显示
					global_state = 2;  //切换运行状态
					count_num = 0;   //清除数字按键变量
					for(i = 0;i < 4;i++)  //清空输入的密码数组
					    inpPasswd[i] = ' '-0x30;
				} 
			break;
			case 1:		//密码生成状态
			   	display2();	 //显示密码生成界面
				delay(1900);    //等待大约3秒
				global_state = 0;  //返回到初始界面
				clear();	//清屏,准备下一屏的显示
				
			break;
			case 2:	  //输入密码状态
			   display4();	   //显示输入密码界面
			   if((key_value >= 0) && (key_value <= 9))	  //如果按下的为0-9的数字按键
			   {
			       
			        if(count_num <= 3)	 //如果按键次数小于4次
					{
				        inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
				   		count_num++;
				    }
					 key_value = 0xff;  //将按键值清除
			   }
			   if(key_value == 15) //清除按键被按下
			   {
			        key_value = 0xff;  //将按键值清除
			   		for(i = 0;i < 4;i++)
					  inpPasswd[i] = ' '-0x30;  //清除刚刚输入的密码
			   }
			   if(key_value == 16) //确认按键被按下
			   {
			        key_value = 0xff;  //将按键值清除
			   		for(i = 0;i < 4;i++)
					{
						if(inpPasswd[i] != genPasswd[i])
						   break;
					}
					if(i == 4)	  //密码输入正确
					{
						LEDRED = 1;	 //红灯熄灭
						LEDGREEN = 0;  //绿灯亮
						Lock = 1;  //开锁
						delay(1900);    //等待大约3秒
						Lock = 0;  //关锁
						LEDGREEN = 1;  //绿灯熄灭
					}
					else   //密码输入错误
					{
						LEDRED = 0;	 //红灯亮
						LEDGREEN = 1;  //绿灯熄灭
						Lock = 0;  //关锁
						delay(1900);    //等待大约3秒
						LEDRED = 1;  //红灯熄灭
					}
					clear();   	//清屏,准备下一屏的显示
					global_state = 0;  //返回到初始界面

			   }
			break;	
		}
	}
}


void T0_interrupt(void) interrupt 1	 
{
	TH0 += TH0_temp;
	TL0 += TL0_temp;

}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38694.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注