文档详情

项目3__51单片机按键识别的设计教材

我**
实名认证
店铺
PPT
649KB
约31页
文档ID:116181472
项目3__51单片机按键识别的设计教材_第1页
1/31

项目3 按键识别的设计 ★ 知识目标: 1. 掌握AT89S51单片机最小系统的组成及相关电路的工作原理; 2. 掌握AT89S51单片机基本键盘接口电路的组成及按键识别方法 ★ 能力目标: 1. 认识AT89S51单片机、晶体振荡器、电阻、电容、按键,键盘 等元器件 2. 会设计硬件去抖动电路,编写软件去抖动按键识别程序; 3. 掌握矩阵键盘按键扫描程序,分支处理 • 在单片机应用系统中,键盘主要用于向计算机输入数据 、传送命令等,是人工干预计算机的主要手段键盘要 通过接口与单片机相连,分为编码键盘和非编码键盘两 类 • 键盘上闭合键的识别由专用的硬件编码器实现,并产生 键编码号或键值的称为编码键盘,如计算机键盘而靠 软件编程来识别的称为非编码键盘,在单片机组成的各 种系统中,使用最广泛的是非编码键盘当然,也有用 到编码键盘的 • 非编码键盘有分为:独立键盘和行列式(又称为矩阵式 )键盘 单 键 矩阵键盘 • 读P1口的按键状态,P2口以二进制记录P1 口的状态变化次数 1.提出任务 2.任务分析 • (1)硬件电路设计 • 以8051单片机作为控制电路,按键连接至单片 机的 P1口,P2口外接8个采用共阳极连接方式的 发光二极管(LED)和 8个限流电阻,硬件电路 原理图所示。

任务1:按键测试 任务1:按键测试 3.程序流程 #include #define uchar unsigned char unsigned char i,j; void main( ) { j=0; //变化次数 P2=0xff; //P2口灯全灭,灯灭表示为0,灯亮表示1 i=P1; //读P1口 while(1) { if(i!=P1) //判断P1口是否有变化 { j++; //有变化次数加1 P2=~j; //次数在P2口显示 i=P1; //重新记录P1口的状态 } } } Lesson369-lesskey11 • 在键盘的软件设计中还要注意按键的去抖动问题由于 按键一般是由机械式触点构成的,在按键按下和断开的 瞬间均有一个抖动过程,时间大约为5ms~10ms,可能 会造成单片机对按键的误识别 • 物理按键抖动波形图 • 按键消抖一般有两种方法,即硬件消抖和软件消抖 硬件消抖方法 在软件设计中,当单片机检测到有键按下时,可以先 延时一段时间越过抖动过程再对按键识别 实际应用中,一般希望按键一次按下单片机只处理一 次,但由于单片机执行程序的速度很快,按键一次按 下可能被单片机多次处理。

为避免此问题,可在按键 第一次按下时延时10ms之后再次检测按键是否按下, 如果此时按键仍然按下,则确定有按键输入这样便 可以避免按键的重复处理 软件消抖方法 任务2 单键控制LED的设计 软件消抖流程图 任务2 单键控制LED的设计 • 用单键(即独立键盘中的按键)实现对LED进行控制, 每按一次按键时,LED 方式变化一次,用以表示按键控 制的结果 1.提出任务 2.任务分析 • (1)硬件电路设计 • 以8051单片机作为控制电路,按键连接至单片机的P1.4 引脚,另一端接地,P2.0口外接1个采用共阳极连接方式 的发光二极管(LED)和 1个限流电阻,硬件电路原理 图所示 任务2 单键控制LED的设计 任务2 单键控制LED的设计 软件消抖流程图 #include #define uchar unsigned char void delay(uchar); sbit p14=P1^4; //定义位 sbit p20=P2^0; main() { p20=0; //P2.0初始状态灯亮 while(1) { if(p14==0) //判断是否按键 { delay(2); //延时20MS,去抖动 if(p14==0) // 确认有键按下 { p20=~p20; //指示灯状态取反 while(!p14); //等待按键释放 } } } } /*延时子程序*/ void delay(uchar k ) { uchar x,y,z; for(x=k;x0;x--) for(y=20;y0;y--) for(z=250;z0;z--); } Lesson3-lessonkey12 思考题: 1. 用P2口指示灯记录P14复位键,按键的次数 任务2 多路按键状态指示的设计 ◇ 知识链接 • 一、矩阵式键盘 • 1.结构和工作原理 • 当输入部分有多个按键时,若仍然采用独立键盘 ,必然会占用大量的I/O口,采用矩阵键盘是一种 比较节省资源的方法。

矩阵式键盘又称行列式键 盘,往往用于按键数量较多的场合矩阵式键盘 的按键设置在行与列的交点上 任务3 多路按键状态指示的设计 一般矩阵键盘的连接示意图 任务2 多路按键状态指示的设计 • 2.按键的识别 A) 行(列)扫描法 • (1)先将全部列线置为低电平,然后通过行线接口读取 行线电平,判断键盘中是否有按键被按下 • (2)判断闭合键的具体位置在确认键盘中有按键被按 下后,依次将列线置为低电平,再逐行检测各行的电平状 态若某行为低电平,则该行与置为低电平的列线相交处 的按键即为闭合按键 • (3)综合上述两步的结果,即可确定出闭合键所在的行 和列,从而识别出所按下的键 • B) 反转法: 1)行输入、列输出,将列输出端全置为0, 通过接口读取行线电平,判断行的位置 2)列输入、行输出,将行输出端全置为0, 通过接口读取列线电平,判断列的位置 综合两步获取按键号 任务2 多路按键状态指示的设计 任务2 多路按键状态指示的设计 • 3.矩阵式键盘的软件设计 • 无论采用哪种方式,都要编制相应的键盘扫描程 序在键盘扫描程序中一般要完成以下几个功能 : • (1)判断键盘上有无按键按下; • (2)去键的机械抖动影响; • (3)求所按键的键号; • (4)转向键处理程序。

任务2 多路按键状态指示的设计 按键识别 程序流程图 任务3 多路按键状态指示的设计 • 用8051单片机及LED数码管实现对键盘键值的实现当 按下键盘中不同按键时,用LED灯显示不同的键值 1.提出任务 任务2 多路按键状态指示的设计 2.任务分析 • (1)硬件电路设计 • 本设计采用8051单片机最小系统,P1口外接矩阵 式键盘接口电路,P2口外接8个共阳发光二极管 任务2 多路按键状态指示的设计 键盘键值显示电路图 任务3 多路按键状态指示的设计 3.源程序编写 uchar keyscan( ) //键盘反转扫描 {uchar i,scan1,scan2,keycode; P1=0xf0; //行线设为低低平 scan1=P1; // 读P1口 if ((scan1 //延时 scan1=P1; if ((scan1 //列线设为低电平 scan2=P1; keycode=scan1|scan2; //组合成键编码 for(i=0;i0;x--) for(y=20;y0;y--) for(z=250;z0;z--); } /*延时20ms*/ 任务3 多路按键状态指示的设计 3.源程序编写 •//#include •#include •#define uchar unsigned char •void delay(uchar); •uchar keyscan(); •uchar code keytable[]={0xee,0xed,0xeb,0xe7,0xde,0xd d,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x 7d,0x7b,0x77,0xff}; •uchar key; main() { while(1) { key=keyscan( ); if(key!=16) //显示二进制键值 P2=~key; else P2=0xff; //无按键不显示 } } 任务3 多路按键状态指示的设计 二、函数的返回值 函数的值是指函数被调用之后,执行函数体中的程序段所 取得的并返回给主调函数的值。

对函数返回值有以下一些 说明: 函数的值只能通过return语句返回主调函数 return 语句的一般形式为: return 表达式; 或者为: return (表达式); 该语句的功能是计算表达式的值,并返回给主调函数在 函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值 任务3 多路按键状态指示的设计 函数值的类型和函数定义中函数的类型应保持一致如果 两者不一致,则以函数类型为准,自动进行类型转换 如函数值为整型,在函数定义时可以省去类型说明 不返回函数值的函数,可以明确定义为“空类型”,类型 说明符为“void”如: void s(int n) { …… } 一旦函数被定义为空类型后,就不能在主调函数中使用被 调函数的函数值了为了使程序有良好的可读性并减少出 错,凡不要求返回值的函数都应定义为空类型 任务3 多路按键状态指示的设计 ◇ 思考与练习: • 矩阵键盘中,如果有两个按键同时按下,能否识别? • 如果要求按键释放后,继续显示键值,程序如何处理? • 如果不同的按键处理不同的事件,程序如何处理?假设0-F 键处理的事件分别对应函数function0-functionF。

• 如果要改变每个按键对应的键值,程序如何修改? 。

下载提示
相似文档
正为您匹配相似的精品文档