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

您所在的位置:网站首页 智能锁开关程序反了 基于STC89C52单片机的密码锁设计与实现

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

2024-07-10 23:24| 来源: 网络整理| 查看: 265

目 录 一、引言 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和单片机为控制核心的电子密码锁系统。 本课题设计功能主要包括如下几个方面:

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

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

#include #include #include #include #include #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 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3