【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.hqwc.cn/news/29446.html

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

相关文章

JDK、JRE、JVM三者之间的关系以及区别

一、关系 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap等] JRE JVM Java 的核心类库 二、JDK,JRE与JVM介绍 1、JDK JDK是用于Java程序开发的最小环境&#xff0c;包含&#xff1a;Java程序设计语言&#xff0c;Java虚拟机&#xff08;JVM&#xff09;&#xff0…

物理机传输大文件到虚拟机

物理机快速传输大文件到虚拟机 测试使用Tabby传输大文件到虚拟机 1.1 准备大文件 1.2 通过Tabby上传文件到Linux 总耗时约&#xff1a;7分钟 1.3 通过EveryThing配置服务 打开EveryThing&#xff0c;点击工具—> 选项—>http服务器 启用HTTP服务器&#xff0c;配置…

性能测试学习阶段性总结

目录 1.前言 2.概念部分 2.1不同角度看软件性能 2.2关键词 2.3测试的方法 2.4应用领域 3.性能测试过程模型&#xff08;PTGM&#xff09; 2.1测试前期准备 2.2测试工具引入 2.3测试计划 2.4测试设计与开发 2.5测试执行和管理 2.6测试分析 总结&#xff1a; 1.前言…

字符函数和字符串函数1(详解)

❤️ 作者简介 &#xff1a;对纯音乐情有独钟的阿甘 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和…

无参数读文件和RCE总结

什么是无参数&#xff1f; 顾名思义&#xff0c;就是只使用函数&#xff0c;且函数不能带有参数&#xff0c;这里有种种限制&#xff1a;比如我们选择的函数必须能接受其括号内函数的返回值&#xff1b;使用的函数规定必须参数为空或者为一个参数等 接下来&#xff0c;从代码…

准备WebUI自动化测试面试?这30个问题你必须掌握(一)

本文共有8600字&#xff0c;包含了前十五个问题&#xff0c;如需要后十五个问题&#xff0c;可查看文末链接~ 1. 什么是WebUI自动化测试&#xff1f; WebUI自动化测试是指使用自动化测试工具和技术来模拟用户在Web用户界面&#xff08;UI&#xff09;上执行操作&#xff0c;并…

Ceph 服务的运用

目录 一、资源池 pool 管理 1.创建一个 Pool 资源池 2.查看集群 Pool 信息 3.查看资源池副本的数量 4.查看 PG 和 PGP 数量 5.修改 pg_num 和 pgp_num 的数量为 128 6.修改 Pool 副本数量为 2 7.修改默认副本数为 2 8.删除 Pool 资源池 8.1修改配置文件 8.2推送 ceph…

Vue中的侦听器:数据变化的秘密揭示

一、侦听器&#xff1a;vue中想监听数据的变化 &#x1f680;&#xff08;一&#xff09;侦听器watch 如何侦听到某个变量值改变呢&#xff1f;使用watch配置项&#x1f6a7;&#x1f6a7;&#x1f6a7;watch&#xff1a;可以侦听到data/computed属性值的改变。语法&#xff…

CentOS目录详解

在centos中&#xff0c;最顶层的目录称作根目录&#xff0c; 用/表示。/目录下用户可以再创建目录&#xff0c;但是有一些目录随着系统创建就已经存在&#xff0c;接下来重点介绍几个常用目录。 /bin&#xff08;binary&#xff09;包含了许多所有用户都可以访问的可执行文件&a…

6.6Jmeter远程调度Linux机器Jmeter测试

1、配置Agent和启动 1.1、打开jmeter/bin目录下的jmeter.properties 1、server_port1099取消注释 2、remote_hosts127.0.0.1 改为remote_hosts127.0.0.1:1099 或者是remote_hostsAgent机的ip:1099 3、server.rmi.localport1099 4、server.rmi.ssl.disablefalse改为true&#x…

【问题总结】基于docker-compose实现nginx转发redis

目录&#xff1a; 文章目录 需求简介&#xff1a;Q1: nginx的http模块和http模块有什么不同Q2: 可以都使用stream模块进行配置吗 Docker环境下如何转发1 修改docker-compose2 修改nginx.conf3 测试连接 需求简介&#xff1a; 需要在192.168.3.11的ngnix上&#xff0c;转发192.…

T5模型: Transfer Text-to-Text Transformer(谷歌)

&#x1f525; T5由谷歌发表于2019&#xff0c;《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》&#xff0c;最终版本发布在&#xff1a;JMLR。 一句话总结T5: 大一统模型&#xff0c;seq2seq形式完成各类nlp任务&#xff0c;大数据集…