内容正文:
任务二 制作行列矩阵式键盘电子密码锁 (1)
单片机技术及应用
同步精品课堂
高等教育出版社第 4 版
1
了解行列矩阵式键盘的工作原理和软件扫描法
掌握制作行列矩阵式键盘电子密码锁的流程和方法。
会使用 C51 函数进行编程,实现密码锁功能
行列矩阵式键盘的电路原理和软件扫描方法
行列矩阵式键盘电子密码锁的程序设计和实现
理解行列矩阵式键盘的扫描原理和键值获取方法
正确使用 C51 函数进行编程,实现密码输入和验证功能
在之前的学习中,我们制作了独立式键盘电子密码锁,但密码位数较少。这次我们将设计一个可以输入 6 位数字的行列矩阵式键盘电子密码锁,提高密码的复杂度和安全性。
让我们一起开启新的学习之旅吧。
任务二 制作行列矩阵式键盘电子密码锁
任务二要制作行列矩阵式键盘电子密码锁,可输入 6 位数字密码。在 4×4 行列矩阵式键盘中输入 6 位密码 “980417”,按下确认键后,若密码正确,LED 会被点亮,否则 LED 不亮。密码预置在单片机的 Flash ROM 中。
任务需求
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
行列矩阵式键盘电路原理图如图所示,其 I/O 口线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线被短接。
注意:单片机的 P1、P2 和 P3 口内部均有上拉电阻,因此行列矩阵式键盘与这些端口接口时一般不需要外接上拉电阻,为了保证电路稳定工作,可以外接 10kΩ 的上拉电阻。如果使用 P0 口做输入端口,则必须外接上拉电阻。
行列矩阵式键盘
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
① 从 P1 口的高 4 位送出低电平,然后读取 P1 口数据,若送出去的数据与读取的数据一致,表示没有键被按下,若不一致则表示有键被按下。
② 若有键被按下,然后逐列扫描,从 P1 高 4 位逐列送出低电平,然后逐行读取 P1 口低 4 位数据,若某一行为低电平,则表示该行某一个键被按下,此时读取 P1 口对应的数据,就可以获得键盘的键值。
行列矩阵式键盘软件扫描方法
任务二 制作行列矩阵式键盘电子密码锁——任务准备
工具及材料准备:
工作准备:
① 软件:Protel DXP 2004、Proteus 7.4、Keil uVision2、EasyPRO Programmer、流程图绘制软件。
② 硬件:计算机 1 台、编程器 1 台、最小系统电路板 1 块、LED 灯控电路板 1 块、电池盒 1 个。
穿好工作服,戴好防静电手环,穿绝缘胶鞋。
清洁工作台面,清理工作区域,工具、仪器仪表摆放整齐有序。
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
C51 程序由一个主函数 main () 和若干个子函数构成。主函数可以调用其他函数,其他函数也可以相互调用,函数可以调用它本身,称为递归调用,但是其他函数不能调用主函数。
C51 函数 - 概述
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
从函数的形式来看,函数可以分为无参数函数和有参数函数。前者在被调用时没有参数传递,后者在被调用时有参数传递。
C51 函数 - 函数的定义
(1) 无参数函数定义格式
类型说明符定义了函数返回值的类型。如果函数没有返回值,需要用 “void” 作为类型说明符。如果没有类型说明符出现,函数返回值默认为整型值。
类型说明符 函数名(void) //void声明该函数无参数传递
{
......
}
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
(2)有参数函数定义格式
类型说明符 函数名(形式参数列表) //形式参数超过一个时,用“,”隔开
{
.....
return(n);
}
函数调用示意图
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
函数调用就是在一个函数体中使用另外一个已经定义的函数,前者为主调用函数,后者为被调用函数。函数调用的格式如下:
C51 函数 - 函数调用
函数名(实参表);
有实参的函数调用中,如果有多个实参,要用“,”间隔开。实参与形参顺序对应,个数相同, 类型相同。
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
① 如果被调用函数的函数定义在主调用函数之后,则需要在调用之前 (一般在程序头部) 对函数进行声明。上述程序段中的函数声明如下:
C51 函数 - 函数声明
void delay(uint ms); // 函数声明
② 如果程序中使用了 C51 标准库函数,则在程序的开头要用 #include 预处理语句将被调用的函数包含进来。
例如上述程序段中调用移位函数_crol_() 时,程序头部预处理如下:
#include "INTRINS.H" //C51内置库函数,头文件中定义了移位函数
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
③ 如果被调用的函数不是标准库函数,在本文件中也没有定义,而是在其他文件中定义的,调用时需要使用关键字 “extern” 进行函数原型说明。
例如上述程序段中如果延时函数的定义在另外一个文件中,则函数声明时需要进行如下说明:
C51 函数 - 函数声明
extern void delay(uint ms); //函数声明
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
编程思路
1.初始化行列矩阵式键盘和 LED 灯的端口。
2.通过软件扫描方法获取键盘输入的 6 位密码。
3.将输入的密码与预置在单片机 Flash ROM 中的密码 “980417” 进行比较。
4.若密码正确,按下确认键后点亮 LED 灯;否则 LED 灯不亮。
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
编程实现 - 初始化部分
#include <reg51.h>
#define KEY_PORT P1
#define LED_PORT P2
// 预置密码unsigned char password[] = {9, 8, 0, 4, 1, 7}; // 输入密码数组unsigned char input_password[6]; // 记录输入密码的位置
unsigned char input_index = 0;
void init() {
// 初始化端口等操作
// ...}
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
编程实现 - 键盘扫描部分
unsigned char key_scan() {
// 行列矩阵式键盘扫描及键值获取
unsigned char row, col;
KEY_PORT = 0x0F; // 高4位送低电平
if ((KEY_PORT & 0x0F) != 0x0F) { // 有键按下
delay(10); // 消抖
if ((KEY_PORT & 0x0F) != 0x0F) {
row = KEY_PORT & 0x0F;
KEY_PORT = 0xF0;
col = KEY_PORT & 0xF0;
return get_key_value(row, col); // 获取键值函数
}
}
return 0xFF; // 无键按下}
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
编程实现 - 密码记录部分
void record_password() {
unsigned char key = key_scan();
if (key != 0xFF && input_index < 6) {
input_password[input_index++] = key;
}}
编程实现 - 密码验证部分
bit check_password() {
unsigned char i;
for (i = 0; i < 6; i++) {
if (input_password[i] != password[i]) {
return 0; // 密码错误
}
}
return 1; // 密码正确}
任务二 制作行列矩阵式键盘电子密码锁- 知识准备
编程实现 - 键盘扫描部分
void main() {
init();
while (1) {
record_password();
if (input_index == 6 && key_scan() == CONFIRM_KEY) { // 确认键按下
if (check_password()) {
LED_PORT = 0x01; // 点亮LED
} else {
LED_PORT = 0x00; // 熄灭LED
}
input_index = 0; // 重置输入位置
}
}}
随堂检测1
行列矩阵式键盘的软件扫描方法第一步是什么?
答案:从 P1 口的高 4 位送出低电平,然后读取 P1 口数据,若送出去的数据与读取的数据一致,表示没有键被按下,若不一致则表示有键被按下。
C51 函数调用时,实参和形参有什么要求?
答案:实参与形参顺序对应,个数相同,类型相同。
随堂检测2
如果被调用函数的定义在主调用函数之后,应该怎么做?
答案:需要在调用之前 (一般在程序头部) 对函数进行声明。
在行列矩阵式键盘中,使用 P0 口做输入端口时需要注意什么?
答案:必须外接上拉电阻。
随堂检测3
简述行列矩阵式键盘的工作原理。
答案:行列矩阵式键盘的 I/O 口线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线被短接。判断是否有键被按下的方法是从 P1 口的高 4 位送出低电平,然后读取 P1 口数据,若送出去的数据与读取的数据一致,表示没有键被按下,若不一致则表示有键被按下。若有键被按下,然后逐列扫描,从 P1 高 4 位逐列送出低电平,然后逐行读取 P1 口低 4 位数据,若某一行为低电平,则表示该行某一个键被按下,此时读取 P1 口对应的数据,就可以获得键盘的键值。
1
分组讨论,讨论如何提高行列矩阵式键盘电子密码锁的安全性。分析在编程过程中可能遇到的问题及解决办法。
1. 知识准备
任务二 制作行列矩阵式键盘电子密码锁 (1)
2. C51 函数
概述
函数的定义
函数调用
函数声明
行列矩阵式键盘
行列矩阵式键盘软件扫描方法
初始化部分
键盘扫描部分
密码记录部分
密码验证部分
主函数部分
3. 编程实现
感谢观看
25
$$