单片机按键模块设计.ppt_第1页
单片机按键模块设计.ppt_第2页
单片机按键模块设计.ppt_第3页
单片机按键模块设计.ppt_第4页
单片机按键模块设计.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元5 按键模块设计,回顾,1,数码管显示原理? 2,静态数码管工作原理? 3,动态数码管工作原理? 4,AT89C51有几个定时器?各是多少位的?请简述定时器实现定时原理? 5,8051单片机定时/计数器工作方式有多少种? 6,如何设置8051单片机工作在定时/计数模式下? 7,如何启动定时器工作? 8,请简述DS1302读取时间的编程过程?,本单元任务,任务1 独立式键盘设计 任务2 键盘中断设计 任务3 矩阵式键盘设计 任务4 多个外部中断设计,任务1 独立式键盘设计,任务描述:,任务分析:,众多嵌入式单片机系统、嵌入式单片机产品设备中,键盘模块都是必不可少的,比如手机及各种智能家电等。本任务通过按键控制点亮流水灯(8个按键分别对应控制8个LED),学习最简单的键盘独立式按键设计方法。,键盘实际上是一组开关的集合:当键按下时,两根导线接通;释放时,两根导线不通。8个按键的键盘电路可考虑在P2口上设计,8个LED电路仍然安装在单片机P1口。8个按键分别对应控制8个LED,按下按键则点亮对应的灯。,独立式键盘工作原理及应用,独立式键盘的组成是由若干个按键与单片机的I/O口一一的对应连接,然后通过读取单片机I/O的电平状态来确认哪个对应的按键被按下,一般一个独立式按键对应一个功能,可以通过按键的组合来实现多个功能。,抖动:当用手按下一个键时,往往出现按键在闭合和断开位置之间来回跳动多次才能到闭合稳定状态的现象;在 释放一个键时,也会出现类似的情况,这种情况就是抖动。按下一个键时产生前沿抖动,释放一个键时产生后沿抖动。抖动的持续时间随键盘簧片的材料和操作员而异,通常在510ms。而510ms已经对程序进行多次循环扫描执行,显而易见,抖动问题不解决,就会引起对闭合键的多次识别。 。,应用举例:例5-1,#include“AT89X51.H“ void main() while(1) if(P2_0=0) /判断key0被按下 key_delay();/去抖延时10ms if(P2_0=0) /再次判断key0按下 while(!P2_0); /等待闭合释放 P1_0=0; /点亮LED if(P2_1=0) /判断key1被按下 key_delay();/去抖延时10ms if(P2_1=0) /再次判断key1按下 while(!P2_1); /等待闭合释放 P1_0=1; /熄灭LED ,1. Proteus电路设计 2. Keil C51程序设计 3. Proteus-Keil联合调试仿真,任务实施,硬件电路图,(1)程序流程 由独立式键盘工作原理得知,按键是否按下是通过读取按键对应的IO的电平变化而判断的,在程序设计上,即通过读取按键对应IO口的电平是否为低(软件去抖)来决定哪个按键被按下,当判断key0被按下,则点亮LED0;当判断key1被按下,则点亮LED1。,主程序设计: #include“AT89X51.H“ unsigned char code led_light=0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F; /点亮LED对应的编码 void main() while(1) if(P2_0=0) /判断key0被按下 key_delay();/去抖延时10ms if(P2_0=0) /再次判断key0按下 while(!P2_0); /等待闭合释放 P1=led_light0; /点亮LED0 if(P2_1=0) /判断key1被按下 key_delay();/去抖延时10ms if(P2_1=0) /再次判断key1按下 while(!P2_1); /等待闭合释放 P1=led_light1; /点亮LED1 ; ,运行,Proteus-Keil联合调试仿真,任务2 键盘中断设计,任务描述:,任务分析:,项目组掌握独立式键盘设计后,现要求用1个按键控制流水灯运行样式,初始时8个LED按从头到尾方式循环运行,当按下按键,首尾两灯点亮向中间,到中间后返回首尾的循环运行,再次按下按键又转为从头到尾循环运行,即1个按键交替切换流水灯的两种运行样式。,此任务设计有两个主要功能模块,一是按键的判断,二是LED流水灯的运行。通过前面单元的学习得知,这两个功能在主程序中无限循环判断执行,正常人完成一次按键的时间需要20ms,而LED流水灯运行频率应小于50Hz(即应大于20ms走一个灯,否则运行太快人眼无法识别),那么如果单片机CPU在执行流水灯显示延时程序期间,正好发生按键,CPU无法运行按键扫描程序而导致按键判断的丢失,如果1s或更长时间走一个灯,那么丢失按键的现象将更加严重。由此可见普通的程序查询独立式按键设计方法在此任务设计是无法胜任的。本任务将介绍单片机重要的内部资源中断系统,它将有效解决上述问题。,1,中断的概念,【例5-2】电路如5-10示,8个LED流水灯安装在P1口,按键K0安装在P2.0上,采用独立式按键识别,实现任务描述中要求的功能。 程序分析:主程序有两个功能模块,一方面按键判断程序,另一方面LED流水灯程序。由于按键是两种流水灯运行方式的交替按键,因此可考虑设置按键控制标志位状态,LED流水灯则判断标志位状态决定运行方式,即按键通过标志位间接控制LED流水灯的运行方式。每次按下按键则把标志位取反,以达到控制LED流水灯的运行。,void main() while(1) if(P2_0=0) /判断key0被按下 key_delay();/去抖延时10ms if(P2_0=0) /再次判断key0按下 while(!P2_0); /等待闭合释放 i=0; /编码下标i清0 run_flag= run_flag; /标志位取反 if(run_flag=0) /判断LED运行标志位 P1=led_light1i+; /点亮LED流水灯 led_delay(); /点亮延时 if(i=8)i=0; else P1=led_light2i+; /点亮LED流水灯 led_delay(); /点亮延时 if(i=7)i=0; ,2, 8051单片机中断系统结构,(1)哪些事件可以引发中断 8051单片机有5个中断源。 外部中断0():由连接在P3.2引脚的外部信号触发 定时/计数器0(T0)溢出中断 外部中断1():由连接在P3.3引脚的外部信号触发 定时/计数器1(T1)溢出中断 串行口中断:由发送中断TXD和接收中断RXD组成 当它们有中断请求发出时,将相应的中断标志IE0、TF0、IE1、TF1、TI、RI自动置位,单片机CPU根据中断标志位情况判别是哪个中断源发出的中断请求。中断标志位存放在特殊功能寄存器TCON、SCON中。,(2)中断标志 TCON,SCON,(3)中断允许与禁止 IE,(1)EA:总中断允许控制。当EA=1时,开放所有中断,此时各中断源的允许和禁止通过相应的中断允许位单独加以控制;当EA=0时,禁止所有中断。 (2)ES:允许或禁止串行口中断控制位。ES=1,允许中断;ES=0,禁止中断。 (3)ET1:允许或禁止定时器T1溢出中断控制位。ET1=1,允许中断;ET1=0,禁止中断。 (4)EX1:允许或禁止中断控制位。EX1=1,允许中断;EX1=0,禁止中断。 (5)ET0:允许或禁止定时器T0溢出中断控制位。ET0=1,允许中断;ET0=0,禁止中断。 (6)EX0:允许或禁止中断控制位。EX0=1,允许中断;EX0=0,禁止中断。,(4)中断的响应条件 首先中断源有请求。其次编程设置单片机CPU允许所有中断源请求(EA=1),并且中断允许寄存器IE相应位置为1。这样,在每个机器周期内,单片机对所有中断源进行顺序检测,并找到所有有效的中断请求,对其优先级排队。单片机在紧接着下一个机器周期响应中断条件是:1无同级或更高级中断占用CPU控制权;2当前指令执行完毕;3如果当前指令为RETI或需访问IE、IP的指令,执行完该指令且紧随其后的一条指令也已执行完毕。否则,单片机将放弃对中断请求的响应。,(5)中断响应过程 中断的响应过程由单片机CPU控制,自动完成,具体有如下几个步骤: 执行一个硬件子程序调用,处理优先级最高的中断请求,清除中断请求标志位(TI和RI除外);硬件子程序将单片机当前执行的内容的地址压入堆栈,转入执行相应中断服务程序的第一条指令。 中断处理程序从入口地址开始一直执行到最后为止; 系统返回原来被打断的程序处开始继续执行。,3,中断编程结构,(1) 编写中断初始化程序 为使单片机CPU在执行主程序过程中能够响应中断,就必须先对使用中断的相关寄存器(TMOD、SCON、IE等)进行初始化。 【例5-3】假设单片机系统允许外部中断0、定时/计数器T0中断,并设定采用边沿触发,则主程序中的中断初始化程序如下: IT0=1; /设置为下降沿触发 EX0=1; /允许中断 ET0=1; /允许T0中断 EA=1; /开放所有中断,(2)编写中断服务程序 中断程序入口。C51规定了8051单片机每种中断类型对应中断服务程序的入口编号,现场保护。如果中断服务程序中要使用与主程序有关的寄存器,那么CPU在执行中断服务程序之前要保护这些寄存器的内容,即“保护现场”,中断返回时再恢复它们的值。在使用Keil uVison4集成开发环境时,其C51编译器为中断服务程序提供自动现场保护以及返回时内容恢复的功能,为用户编程提供了方便。,常用的中断服务程序的结构如下。 void 中断程序名( ) interrupt 中断号 using n ; 其中“中断程序名”最好依据中断服务程序的功能,取一个比较直观浅显的名称;“interrupt”是中断服务程序的关键字; “中断号”则根据表5-1所示,如果使用外部事件0中断,则“中断号”为0;using定义工作寄存器组;n为寄存器组编号(03),默认为0;“ ”内部为中断服务要执行的程序。,4,按键与外部事件中断,(1)IT0:设置为1,选择外部中断0由下降沿触发,即当出现一个下降沿表示有一个外部中断0的请求信号。为什么将IT0设置为1呢?任务1学习得知(图6-3),按键按下将会产生一个从高电平到低电平的边沿跳变(称为“下降沿”),按键松开产生从低电平到高电平的边沿跳变(称为“上升沿”)。因此1次按键信号(产生一次下降沿)正好转化成外部中断0信号。 (2)IE0:无需初始,它由硬件自动设置。 (3)EX0:设置为1,即允许CPU响应外部中断0请求。 (4)EA:设置为1,允许CPU响应所有中断请求。,1. Proteus电路设计 2. Keil C51程序设计 3. Proteus-Keil联合调试仿真,任务实施,硬件电路图,(1)程序流程 主程序根据标志位状态,无限循环执行LED流水灯程序;按键的判断转化成中断处理,按下按键则意味着一次中断事件发生,单片机处理按键任务,即跳转到INT0中断处理程序中,交替将LED流水灯标志位置1/清0。,主程序设计: void main() IT0 = 1; /设置外部中断0触发方式位,1为边沿触发 EX0 = 1; /外部中断0中断允许位 EA = 1; /允许总中断标志位 while(1) if(run_flag=0) /判断运行标志位状态 P1 = led_light1i+; delay(); if(i=8)i=0; else P1=led_light2i+; /点亮LED流水灯 delay(); /点亮延时 if(i=7)i=0; ,中断程序: void int0() interrupt 0 /中断服务函数入口 EX0 = 0; i=0; run_flag =run_flag; /每按一下按键,行标志位取反 EX0 = 1; ,运行,Proteus-Keil联合调试仿真,任务3 矩阵式键盘设计,任务描述:,任务分析:,当嵌入式产品、设备中的按键数目较多时,将采用更普遍的按键设计方法矩阵式键盘。本任务要求运用矩阵式键盘的设计方法设计9个按键控制点亮1个数码管分别显示19。,独立式键盘的每个按键都要独占一位I/O,当按键较多就会严重耗费单片机的I/O资源。比如计算机的键盘功能有100多个,如果采用独立式方法设计,就需要100多个I/O,因此独立式键盘设计在按键较多的情况下不再适合。本任务将探讨新的方法矩阵式键盘设计,尽可能少占用I/O资源又保证设计的效果。,矩阵式键盘工作原理及应用,矩阵式键盘是利用几根I/O口线作为列,几根作为行,行跟列相交叉,在交叉点用按键连接列和行的I/O口线。,4,扫描循环,矩阵式键盘的工作原理是单片机通过定时扫描的方式来查询按键的状态,如先从行扫描,在扫描第一行的时候查询在这一行上与列相交叉的按键有没有被按下,如果没有按键按下就以扫描第一行的方式扫描第二行,这样循环扫描所有的行,如果有就作出相应的处理,处理实现后再继续重新扫描。由于在扫描第1行的时候P2.3=0,但行P2.3与列P2.7交叉处的按键被按下时,P2.7就会从本来的高电平变为低电平,从而确定是哪个按键被按下.,应用举例:例5-5,#define Portkey P2 /键盘控制端 列线P2.0 P2.1 #define KeyColm1 P2_2 /行线 P2.2 P2.3 Portkey=0xff; /矩阵按键全输出1 KeyColm1=0; /选择扫描第一行 key_temp=Portkey; /读按键控制端 key_temp=key_temp ,1. Proteus电路设计 2. Keil C51程序设计 3. Proteus-Keil联合调试仿真,任务实施,硬件电路图,(1)程序流程 程序设计最重要的部分就是矩阵键盘的扫描,此电路为33键盘,编程从行开始逐行扫描,扫描至第三行,重新开始循环第一行扫描。,主程序设计: main() key=9; /初始显示关闭 while(1) Portkey=0xff; /矩阵按键全输出1 KeyColm1=0; /选择扫描第一行 key_temp=Portkey; /读按键控制端 key_temp=key_temp,运行,Proteus-Keil联合调试仿真,【课堂练习】构建22矩阵式键盘(K0、K1、K2、K3),控制2个共阳极数码管对应显示23、68、77、19。,任务4 多个外部中断设计,任务描述:,任务分析:,在实际项目设计中,有些时候可能需要将不止一个事件设计成中断处理任务,这就涉及到多个中断并存的情况。本任务要求设计两个按键分别控制LED流水灯工作流程,当k0按下,流水灯从两头向中间运行,达到中间返回两头,来回往返;当k1按下,流水灯先点亮红灯,再点亮蓝灯,即重复点亮红灯、蓝灯。,按键控制流水灯工作状态,不能采用独立式按键设计。因此两个按键都应运用“中断”的设计方法,89C51有INT0、INT1两个外部中断,可以满足两个按键的设计要求。,中断优先级,当几个中断源同时向单片机CPU发出中断请求时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级,使CPU在多个中断源同时发出中断请求时能找到优先级最高的中断源,响应它的中断请求。高优先级的中断请求处理完毕以后,再响应优先级低的中断请求。 中断源的响应优先级由寄存器IP确定,中断系统可以在IP定义两个优先级水平,即高优先级水平和低优先级水平;同时规定了同一水平下不同中断源的优先级。,特殊功能寄存器IP,1. Proteus电路设计 2. Keil C51程序设计 3. Proteus-Keil联合调试仿真,任务实施,硬件电路图,两个按键对应为外部中断0、外部中断1,因此键盘电路必须设计在外部中断口上,如图5-30示将按键k0、k1分别设计在P3.2/INT0、P3.3/INT1管脚上,LED电路依然设计在P1口上。,(1)程序流程 由于两个按键分别控制流水灯不同运行状态,因此程序设计中采用两个运行标志位进行相应的判断;而两个按键的都转化成中断处理,按下按键k0,代表INT0中断事件发生,按下按键k1,代表INT1中断事件发生,单片机响应按键,即跳转到响应中断的处理程序中,将对应的运行标志位置1。在使用“中断”时,都应初始两个中断相关的寄存器。,主程序设计: main() IT0 = 1; /设置外部中断0触发方式位,1为边沿触发 EX0 = 1; /外部中断0中断允许位 IT1 = 1; /设置外部中断1触发方式位,1为边沿触发 EX1 = 1; /外部中断1中断允许位 EA = 1; /允许总中断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论