【AT89C52单片机项目】数字密码锁设计

  • 实验目的

使用单片机设计数字密码锁。

  • 实验仪器

一套STC89C52RC开发板套件,包括STC89C52RC开发板,以及USB烧录线。

  • 设计要求

1、有设置密码、开锁工作模式;

2、可以每次都设置密码,也可以设置一次密码多次使用。

  • 实验原理

本实验所需要的主要硬件电路介绍

1)、矩阵按键

 

 

矩阵键盘扫描原理:

1、行线输出全为0;

2、读入列线值;   

3、列线输出上次读入的值

4、读入行线值

5、组合2种读入值

优点:m*n个按键值需要一次反转(2次输入输出)就可以检测到结果,比行列扫面简单。

  • 实验流程
  1. 根据教材进行学习数码管显示控制,本项目单片机为八段共阴数码管,段码为{ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f},分别表示0~9
  2. 根据教材进行学习矩形键盘、矩形键盘的反转扫描、矩形键盘密码锁的样例,根据矩形键盘密码锁样例改写代码。
  3. 将程序烧录进入单片机,并且把单片机中USB232连接OFF。
  • 实验结果

输入密码“12345678”后,数码管显示open。

输入其他密码后,数码管显示Err。

  • 代码

 

#include <reg52.h>#define DataPort P0   //定义数码管显示数据端口
#define KeyPort P3    //定义矩阵按键的数据端口
sbit LATCH1 = P2 ^ 6;  //定义锁存使能端口  段锁存
sbit LATCH2 = P2 ^ 7;  //定义锁存使能端口  位锁存unsigned char code DuanMa[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管段码表,包含字母abcdefunsigned char code WeiMa[] = { 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //位码表unsigned char TempData[8];   //用来存放数码管数据
unsigned char Data[8];
unsigned char password[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };  //设置密码
void DelayUs2x(unsigned char t);  //延迟函数
void DelayMs(unsigned char t);  //毫秒延迟函数
void Display(unsigned char FirstBit, unsigned char Num);  //数码管显示函数
unsigned char KeyScan(void);  //键盘扫描函数,使用行列逐级扫描法
unsigned char KeyPro(void);  //把键盘扫描结果转换为数字的函数
main()
{unsigned char num = 0, i = 0, j; //定义并初始化变量unsigned char Flag = 0;while (1){num = KeyPro();  //获取按键数字if (num != 0xff) //如果按键状态发生变化{if (i == 0){for (j = 0; j < 8; j++) //初始化数码管数据,清屏{TempData[j] = 0xff; }}if (i < 8){Data[i] = DuanMa[num]; //把按键值输入到临时数组中for (j = 0; j <= i; j++)   //通过一定顺序把临时数组中{                       //的值赋值到显示缓冲区,从右往左输入TempData[7 - i + j] = Data[j]; //数字从数码管右侧逐渐出现}}i++;   //输入数值累加if (i == 9) //如果密码输入完毕{i = 0; //初始化变量i,以便之后可以重新输入密码Flag = 1;  //先把比较位置1for (j = 0; j < 8; j++)  //循环比较8个数值{                       //如果有一个不等 则最终Flag值为0Flag = Flag && (Data[j] == DuanMa[password[j]]);}    //比较输入值和已有密码for (j = 0; j < 8; j++) // 清屏{TempData[j] = 0xff;}if (Flag){TempData[0] = 0x3f;//OTempData[1] = 0x73;//PTempData[2] = 0x79;//ETempData[3] = 0x54;//nfor (j = 4; j < 8; j++){TempData[j] = 0x00; //除了open后面不显示}}else{TempData[0] = 0x79;//ETempData[1] = 0x50;//rTempData[2] = 0x50;//rfor (j = 3; j < 8; j++){TempData[j] = 0x00;}}}}Display(0, 8);//DelayMs(1000);}
}void DelayUs2x(unsigned char t)
{while (--t){}
}
void DelayMs(unsigned char t)
{while (--t){DelayUs2x(245);DelayUs2x(245);}
}
void Display(unsigned char FirstBit, unsigned char Num)
{unsigned char i;for (i = 0; i < Num; i++){DataPort = 0;  //清空数据,防止有交替重影LATCH1 = 1;LATCH1 = 0;DataPort = WeiMa[i + FirstBit]; //取位码LATCH2 = 1;  //位锁存LATCH2 = 0;DataPort = TempData[i];  //取显示数据,段码LATCH1 = 1;  //段锁存LATCH1 = 0;DelayUs2x(200);  //扫描间隙延时,时间太长会闪烁}                   //太短会造成重影
}unsigned char KeyScan(void)  //键盘扫描函数,使用行列逐级扫描法
{unsigned char Val;KeyPort = 0xf0;  //高四位 置高电平,低四位 置低电平if (KeyPort != 0xf0)  //如果有按键按下{DelayMs(10);  //去抖if (KeyPort != 0xf0){  //如果有按键按下KeyPort = 0xfe; //检测第一行if (KeyPort != 0xfe){Val = KeyPort & 0xf0;Val += 0x0e;while (KeyPort != 0xfe) ;DelayMs(10); //去抖while (KeyPort != 0xfe) ;return Val;}KeyPort = 0xfd; //检测第二行if (KeyPort != 0xfd){Val = KeyPort & 0xf0;Val += 0x0d;while (KeyPort != 0xfd) ;DelayMs(10);  //去抖while (KeyPort != 0xfd) ;return Val;}KeyPort = 0xfb;  //检测第三行if (KeyPort != 0xfb){Val = KeyPort & 0xf0;Val += 0x0b;while (KeyPort != 0xfb) ;DelayMs(10); //去抖while (KeyPort != 0xfb) ;return Val;}KeyPort = 0xf7; //检测第四行if (KeyPort != 0xf7){Val = KeyPort & 0xf0;Val += 0x07;while (KeyPort != 0xf7) ;DelayMs(10); //去抖while (KeyPort != 0xf7) ;return Val;}}}return 0xff;
}unsigned char KeyPro(void)
{switch (KeyScan()){case 0x7e: return 0; break;//0 按下相应的键显示相对应的码值case 0x7d: return 1; break;//1case 0x7b: return 2; break;//2case 0x77: return 3; break;//3case 0xbe: return 4; break;//4case 0xbd: return 5; break;//5case 0xbb: return 6; break;//6case 0xb7: return 7; break;//7case 0xde: return 8; break;//8case 0xdd: return 9; break;//9case 0xdb: return 10; break;//acase 0xd7: return 11; break;//bcase 0xee: return 12; break;//ccase 0xed: return 13; break;//dcase 0xeb: return 14; break;//ecase 0xe7: return 15; break;//fdefault: return 0xff; break;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java电子病历系统源码

电子病历系统采取结构化与自由式录入的新模式&#xff0c;自由书写&#xff0c;轻松录入。化实现病人医疗记录&#xff08;包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。&#xff09;的保存、管理、传输和重现&#xff0c;取代手写纸张病历。不仅实现了…

存储服务的演化与MySQL分库分表

文章目录 一、存储服务的演化1.单体结构2.单表单库的数据量膨胀 -> 分库分表3.单个MySQL的读写压力过大 -> MySQL索引优化4.进一步缓解MySQL读写压力 -> 读写分离5.冷热数据分离 -> 使用Redis缓存 二、MySQL分库分表1.策略2.需要注意的问题 一、存储服务的演化 1.…

3D全景虚拟旅游在旅游行业中具备哪些应用价值?

在网络强国战略指引下&#xff0c;我们的网络基础设施建设步伐正在加快&#xff0c;与此同时&#xff0c;虚拟技术也在不断的更新迭代&#xff0c;虚拟旅游也逐渐崭露头角&#xff0c;将真实世界中的景点、文化以及历史场景等数字化&#xff0c;让游客身临其境地感受这些景点和…

HBase(一)HBase v2.2 高可用多节点搭建

最近刚刚完成了HBase相关的一个项目,作为项目的技术负责人,完成了大部分的项目部署,特性调研工作,以此系列文章作为上一阶段工作的总结. 前言 其实目前就大多数做应用的情况来讲,我们并不需要去自己搭建一套HBase的集群,现有的很多云厂商提供的服务已经极大的方便日常的应用使…

javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中 6、显示首页 ①目标 浏览器访问index.html&#xff0c;通过首页Servlet&#xff0c;渲染视图&#xff0c;显示首页。 ②思路 ③代码 [1]创建PortalServlet <servlet><servlet-name>PortalServlet</servlet-name…

怎么用Midjourney制作表情包

要使用Midjourney制作表情包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开Midjourney的官方网站或下载Midjourney应用程序&#xff0c;并登录你的账户。 2. 在Midjourney中&#xff0c;选择创建新项目或表情包。 3. 在项目中&#xff0c;你可以选择使用预设的模…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

将大模型集成到语音识别系统中的例子

概述 本文旨在探索将大型语言模型&#xff08;LLMs&#xff09;集成到自动语音识别&#xff08;ASR&#xff09;系统中以提高转录准确性的潜力。 文章介绍了目前的ASR方法及其存在的问题&#xff0c;并对使用LLMs的上下文学习能力来改进ASR系统的性能进行了合理的动机论证。 本…

深度学习标量、向量、矩阵、张量之间的区别与联系

文章目录 前言1、张量**注意**&#xff1a; 2、**标量** (scalar)&#xff1a;0阶的张量&#xff0c;0个轴&#xff0c;一个单独的数(整数或实数)&#xff1b;3、**向量**(vector)&#xff1a;1阶的张量&#xff0c;也叫矢量&#xff0c;1个轴&#xff0c;一个数组&#xff1b;…

那些你必须知道的4个matlab小技巧(附最新安装包)

文末福利&#xff1a;MATLAB R2022b软件安装包 MATLAB 简介 01 一、MATLAB简介 数学类科技应用软件包括数值计算&#xff08;Number Crunching&#xff09;型软件和数学分析&#xff08;Math Analysis&#xff09;型软件 数值计算型软件 它们对大批数据具有较强的管理、计…

微信小程序下拉刷新获取数据和触底事件刷新实现

一、下拉刷新 1.json文件 说明&#xff1a;开启下拉刷新&#xff0c;然后设置窗口的背景色&#xff0c;方便观看。 "enablePullDownRefresh": true,"backgroundColor":"#FFC0CB" 2. js文件 说明&#xff1a;重新发起请求&#xff0c;并显示加…

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

Vue3统计数值(Statistic)

可自定义设置以下属性&#xff1a; 数值的标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’数值的内容&#xff08;value&#xff09;&#xff0c;类型&#xff1a;string | number&#xff0c;默认&#xff1a;…

AlphaPose复现配置教程

AlphaPose复现配置教程 AlphaPose介绍 AlphaPose是一种准确的多人姿态估计器&#xff0c;这是第一个在COCO数据集上达到70 mAP (75 mAP)和在MPII数据集上达到80 mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态&#xff0c;我们还提供了一种高效的在线姿态跟踪器&…

scala学习手册

1. case class学习 样例类模式匹配 1.1 样例类&#xff08;case class&#xff09;适合用于不可变的数据。它是一种特殊的类&#xff0c;能够被优化以用于模式匹配。 case class MetaData(userId: String)case class Book(name: String) {def printBookName(): Unit {printl…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…

函数和控制流

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

Simulink仿真模块 - Data Store Read

Data Store Read:从数据存储中读取数据 在仿真库中的位置为:Simulink / Signal Routing 模型为: 说明 Data Store Read 模块将指定数据存储中的数据复制到其输出中。多个 Data Store Read 模块可从同一个数据存储读取数据。 用来读取数据的源数据存储由 Data Store Memory 模…

vue+element-ui通用后台管理系统(适合新手)

vueelement-ui通用后台管理系统&#xff08;适合新手&#xff09; 1、使用到的技术 使用vue2element-uiaxiosjs-cookielessecharts实现的一个简易的通用后台管理系统&#xff0c;具有很强的可扩展性&#xff0c;修改简单&#xff0c;只要有点前端基础就能看懂&#xff1b; 2…

怎么学习Java数据库连接(JDBC)? - 易智编译EaseEditing

学习Java数据库连接&#xff08;JDBC&#xff09;是掌握Java与数据库交互的关键步骤。以下是学习Java JDBC的一些建议&#xff1a; 先掌握Java基础&#xff1a; 在学习JDBC之前&#xff0c;确保你已经掌握了Java的基本语法、面向对象编程和其他核心概念。这将有助于更好地理解…