完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、 设计要求
设计一个由单片机控制的电子密码锁,要求如下:
1、 矩阵键盘输入 根据矩阵键盘的电平翻转对16个按键进行数字的定义,并返回每个按键对应的数字。Main函数里对返回的数字进行判断来确定按下的是哪一个按键,并对相关功能进行定义。在这里我定义0~9数字为输入的正常数字,按键11定义为确定按键,即当矩阵键盘函数MatrixKey()函数返回值为11时定义确认键功能,矩阵键盘函数MatrixKey()函数返回值为12时定义撤销键功能,矩阵键盘函数MatrixKey()函数返回值为13时定义重置密码功能。注意按键消抖。 代码如下: #include #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 #include "Delay.h" ***it 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进行记忆,可成功写入和读出,但写入的数字存在错误。无法完全实现,以后会尝试从这方面进行改进,并优化代码逻辑结构。 |
|
|
|
只有小组成员才能发言,加入小组>>
3269 浏览 9 评论
2947 浏览 16 评论
3446 浏览 1 评论
8967 浏览 16 评论
4041 浏览 18 评论
1084浏览 3评论
562浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
556浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2294浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1850浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-13 11:02 , Processed in 1.159522 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号