目 录
一、引言 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;}

















基于STC89C52单片机的密码锁设计与实现相关推荐

  1. 基于stc89c52单片机的密码锁制作

    1.制作所需材料:stc89c52单片机,普中51实验板,LCD屏幕 2.制作过程         程序设计 打开Keil uVision5,新建工程文件. 编辑LCD驱动模块(直接使用下方代码即可) ...

  2. 基于51单片机蓝牙密码锁

    目录 一.项目需求 二.原理图 三.设计思路 四.实物 五.代码 资料下载地址:基于51单片机蓝牙密码锁-单片机文档类资源-CSDN下载 一.项目需求 1.采用DS1302时钟模块,通过该模块可检测当 ...

  3. 基于51单片机的密码锁

    本次的项目是基于51单片机的密码锁,适合用来作为课程设计 主要实现了:密码锁功能,通过矩阵按键输入密码,输入范围为0-F,共有四位:同时,也可以使用更改按键更改密码,在更改时需要输入原密码来进入更改模 ...

  4. stc89c51单片机音乐盒系统设计_基于STC89C52单片机的七彩迷你音乐盒

    基于STC89C52单片机的七彩迷你音乐盒.在单片机最小系统的基础上,对其他两个I/O口连接硬件电路.P1.0接一个七彩快闪LED灯.P1.5口接一个NPN型三极管的放大电路,再连接一个无源蜂鸣器(用 ...

  5. 基于STC89C52单片机的霓虹灯

    基于STC89C52单片机的霓虹灯 1.设计要求 使用PWM驱动8个LED灯         人眼不能观察到灯光全灭         灯光要有动画效果 2.设计概述         本实验所用芯片为S ...

  6. 基于STC89C52单片机的智能车控制系统设计

    目 录 1系统概述 1 1.1设计目的和意义 1 1.2设计思路 2 1.3系统需求分析 2 1.3.1市场需求 2 1.3.2实现功能 2 1.4开发环境 3 1.5运行环境 3 2总体设计 4 2 ...

  7. C语言智能窗帘编码,基于STC89C52单片机智能窗帘控制系统.doc

    基于STC89C52单片机智能窗帘控制系统 基于STC89C52单片机智能窗帘控制系统 [摘要] 本设计以STC89C52单片机为主控芯片,接收并处理BH1750FVI光照传感器的光强信号.DS18B ...

  8. 用计算机设计电路图,基于51单片机的计算器设计(含电路图,程序)

    基于51单片机的计算器设计(含电路图,程序)(课题申报表,任务书,开题报告,中期检查表,外文翻译,论文11200字,程序,答辩PPT) 摘 要 计算器一般是指"电子计算器",能进行 ...

  9. 温度警报c语言,基于STC89C52单片机温度报警器.doc

    基于STC89C52单片机温度报警器 摘 要 温度的检测与控制是工业生产过程中比较典型的应用之一,随着传感器在生产和生活中的更加广泛的应用,利用新型单总线式数字温度传感器实现对温度的测试与控制得到更快 ...

最新文章

  1. Elasticsearch增删改查
  2. 架构 php_十年PHP架构师的成长之路,程序员必备
  3. 计算机导论第一章试题及答案,计算机导论第一章试题
  4. Python语法点滴
  5. python实现文件上传功能_python实现上传下载文件功能
  6. powerpoint文字教程
  7. pat乙级相当于什么水平_雅思6.5是什么水平?相当于托福多少分?
  8. Python中字典(dict)详解
  9. 字符串匹配-kmp算法
  10. C++ const和static const的区别
  11. PHP调用powershell权限,浏览器挂起执行运行Powershell的PHP
  12. 财务数据图表分析,这些财务预算表模板免费用
  13. OBJ格式建筑模型数据处理步骤
  14. 渗透攻击阶段 PTES
  15. 小程序 tabBar菜单
  16. 微信公众服务号申请流程
  17. 华为AC6605二层组网,配置无线漫游
  18. java anon,试图找到泄漏!对于pmap来说,anon意味着什么?
  19. Photoshop CS6 序列号完美激活教程
  20. 将栅格影像转换为CAD/GIS矢量的3种方法

热门文章

  1. 论文笔记 EMNLP 2020|Resource-Enhanced Neural Model for Event Argument Extraction
  2. 日历---C++封装一个Date类,Calendar类,实现简单的日历+日期计算器程序
  3. 抓取空气质量指数AQI_PM2.5历史数据,可视化展示
  4. 微信小程序开发之——仿微信视频录制上传
  5. Rockchip基于RK3566/RK3568 WiFi AP6256调试笔记
  6. [转载]无线网络优化
  7. 英国AI初创企业OKRA获416万美元A轮融资
  8. 在Linux上使用7z的最高压缩比来压缩文件
  9. 计算机游戏中屏幕上显示的,计算机显示器选择弧形屏幕还是直接屏幕?主游戏...
  10. 纯JS实现slideToggle动画,慢慢下拉打开