IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于keil4和proteus实现的简易密码锁 -> 正文阅读

[嵌入式]基于keil4和proteus实现的简易密码锁

一、 设计要求
设计一个由单片机控制的电子密码锁,要求如下:

  1. 能设定一组4位的数字开启密码(设定密码功能)
  2. 用LED小灯代替锁开启显示,输入密码正确,则小灯亮起(开锁功能)
  3. 如果3次密码错误,则进行鸣叫报警,并在1分钟之内不能再次输入(报警功能)
  4. 密码输入显示在数码管上,输入正确显示on,输入错误显示err(显示功能)
  5. 可在以上功能上扩展。
    二、原理说明
    该程序用C51语言,Keil5软件及proteus进行仿真。
    用到的硬件设备有AT89C52,蜂鸣器,LCD1602,上拉电阻,三极管,按钮
    代码部分对不同的方法进行封装,主要是延时函数Delay(),蜂鸣器发声函数Beep(),矩阵键盘函数,LCD1602显示函数以及主要功能实现main函数。
    在这里插入图片描述

1、 矩阵键盘输入
根据矩阵键盘的电平翻转对16个按键进行数字的定义,并返回每个按键对应的数字。Main函数里对返回的数字进行判断来确定按下的是哪一个按键,并对相关功能进行定义。在这里我定义0~9数字为输入的正常数字,按键11定义为确定按键,即当矩阵键盘函数MatrixKey()函数返回值为11时定义确认键功能,矩阵键盘函数MatrixKey()函数返回值为12时定义撤销键功能,矩阵键盘函数MatrixKey()函数返回值为13时定义重置密码功能。注意按键消抖。
代码如下:

#include <REGX52.H>
#include "Delay.h"

unsigned char MatrixKey()
{
	unsigned char KeyNumber = 0;
	//按列扫描
	P1 = 0xFF;
	P1_3 = 0;  //判断第一列
	if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 1;} } //delay消抖,一列一行
	if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 5;} } //1列2行
	if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 9;} } //1列3行
	if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 13;} } //1列4行
	
	P1 = 0xFF;
	P1_2 = 0;  //判断第2列
	if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 2;} } //delay消抖,2列一行
	if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 6;} } //2列2行
	if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 10;} } //2列3行
	if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 14;} } //2列4行
	
	P1 = 0xFF;
	P1_1 = 0;  //判断第3列
	if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 3;} } //delay消抖,3列一行
	if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 7;} } //3列2行
	if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 11;} } //3列3行
	if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 15;} } //3列4行
	
	P1 = 0xFF;
	P1_0 = 0;  //判断第4列
	if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 4;} } //delay消抖,4列一行
	if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 8;} } //4列2行
	if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 12;} } //4列3行
	if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 16;} } //4列4行
	
	return KeyNumber;
}

2、 LCD1602进行显示
主要使用的方法为以下几种方法
注意LCD1602的显示范围,行是12,列数是116
在这里插入图片描述

3、 延时函数
延时函数非常简单,就是一个简单的循环
代码如下:

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

4、 蜂鸣器
蜂鸣器的声音的频率取决于延时情况,注意调到合适频率
代码如下:

#include <REGX52.H>
#include "Delay.h"

sbit beep = P2^2;
void Beep()
{
	beep = ~beep;
	Delay(500);
}

5、 main函数
main函数是对整个电子密码锁主要逻辑的实现
首先定义一个password接收输入的密码,count接收输入次数,scount定义错误次数,rightpass接收正确密码。对键盘输入的数字用KeyNum进行接收。0~9数字为输入的正常数字,按键11定义为确定按键,即当矩阵键盘函数MatrixKey()函数返回值为11时定义确认键功能,矩阵键盘函数MatrixKey()函数返回值为12时定义撤销键功能,矩阵键盘函数MatrixKey()函数返回值为13时定义重置密码功能。
在这里插入图片描述
三、电路设计
电路主要包括四块,单片机AT89C52,矩阵键盘,蜂鸣器,LCD1602
在这里插入图片描述

AT89C52的P0口和P2口的P25,P26,P2^7控制LCD1602,P0口需接上拉电阻
AT89C52的P1口控制矩阵键盘。这里矩阵键盘按列扫描,首先对P1进行初始化P1 = 0xFF,然后循环依次从第一列到第四列的接口赋值0(P10,P11,P12,P13),然后对行的接口进行扫描检测。如果某一个按键按下,此时该按键列的接口为0,那么该按键行的接口也为0。根据行与列判断是哪一个按键进行相应赋值定义。
AT89C52的P3^0控制LED小灯。
AT89C52的P22控制蜂鸣器。蜂鸣器分为有源蜂鸣器和无源蜂鸣器(振荡源),我选择的为有源蜂鸣器,将蜂鸣器的电压调为2v。我用的NPN三极管,P22=1时三极管导通,蜂鸣器发声。

四、仿真结果
点击开始,LCD1602显示PASSWORD,提示输入密码。
在这里插入图片描述

输入一个四位密码
在这里插入图片描述

点击RIGHT进行确认,判断是否是正确密码
在这里插入图片描述

密码不正确,显示ERR,密码输入清零
重新输入,错误三次后蜂鸣器会报警,此时无法输入
在这里插入图片描述

输入初始正确密码2001,显示ON,小灯两起
在这里插入图片描述

输入一个密码1256,按下EXCHANGE键,对正确密码进行修改
在这里插入图片描述在这里插入图片描述

此时重新输入之前的初始正确密码2001,已经错误
在这里插入图片描述

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

输入一个密码错误时,按CANCEL键可清零
在这里插入图片描述

五、结果分析
功能需求均能满足。LCD1602可正常显示,密码输入正常,错误次数超过3次蜂鸣器报警并1min内无法输入,密码输入正确会显示ON。输入数字错误可取消重新输入。可软件对正确密码进行修改。正确密码初始为2001,进行密码修改后在不掉电情况下正确密码可变,但掉电丢失,正确密码恢复为初始2001.尝试用硬件24C02进行记忆,可成功写入和读出,但写入的数字存在错误。无法完全实现,以后会尝试从这方面进行改进,并优化代码逻辑结构。

部分代码参考于https://www.bilibili.com/video/BV1Mb411e7re?share_source=copy_web

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-07 12:15:04  更:2021-08-07 12:15:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 22:36:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码