单片机按键模块设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P2.7
key0 key1 key2 key3 key4 key5 key6 key7
抖动:当用手按下一个键时,往往出现按键在闭合和断开位置之 间来回跳动多次才能到闭合稳定状态的现象;在 释放一个键时, 也会出现类似的情况,这种情况就是抖动。按下一个键时产生前 沿抖动,释放一个键时产生后沿抖动。抖动的持续时间随键盘簧 片的材料和操作员而异,通常在5~10ms。而5~10ms已经对程序 进行多次循环扫描执行,显而易见,抖动问题不解决,就会引起 对闭合键的多次识别。 。
N
Y
点 亮 LED0
key1按 下 ?
N
Y
点 亮 LED1
key2按 下 ?
N
Y
点 亮 LED2
key3按 下 ?
N
Y
点 亮 LED3
key4按 下 ?
N
Y
点 亮 LED4
key5按 下 ?
N
Y
点 亮 LED5
key6按 下 ?
N
Y
点 亮 LED6
key7按 下 ?
N
Y
点 亮 LED7
主程序设计:
键按下
前沿抖动 闭合稳 定
后沿抖动
应用举例:例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 } } } }
常用的中断服务程序的结构如下。 void 中断程序名( ) interrupt 中断号 using n { ……; } 其中“中断程序名”最好依据中断服务程序的功能, 取一个比较直观浅显的名称;“interrupt”是中断服务 程序的关键字; “中断号”则根据表5-1所示,如果 使用外部事件0中断,则“中断号”为0;using定义 工作寄存器组;n为寄存器组编号(0~3),默认为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响应所有中断请求。
开始
按键按下? Y
N
LED运 行 标 志 位 取 反
N
LED运 行 标 志 位 =1?
Y
流水灯运行模式1
流水灯运行模式2
LED点 亮 延 时
LED点 亮 延 时
i自 加 1
i自 加 1
i=8? Y
N
i=7? Y
N
i清 0
i清 0
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_light1[i++]; //点亮LED流水灯 led_delay(); //点亮延时 if(i==8)i=0; } else {
Proteus-Keil联合调试仿真
运行
任务2 键盘中断设计
任务描述:
项目组掌握独立式键盘设计后,现要求用1个按键控制流水灯运行 样式,初始时8个LED按从头到尾方式循环运行,当按下按键,首尾两灯 点亮向中间,到中间后返回首尾的循环运行,再次按下按键又转为从头到 尾循环运行……,即1个按键交替切换流水灯的两种运行样式。
当它们有中断请求发出时,将相应的中断标志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,禁止中断。
任务分析:
此任务设计有两个主要功能模块,一是按键的判断,二是LED流水 灯的运行。通过前面单元的学习得知,这两个功能在主程序中无限循环判 断执行,正常人完成一次按键的时间需要20ms,而LED流水灯运行频率 应小于50Hz(即应大于20ms走一个灯,否则运行太快人眼无法识别), 那么如果单片机CPU在执行流水灯显示延时程序期间,正好发生按键, CPU无法运行按键扫描程序而导致按键判断的丢失,如果1s或更长时间走 一个灯,那么丢失按键的现象将更加严重。由此可见普通的程序查询独立 式按键设计方法在此任务设计是无法胜任的。本任务将介绍单片机重要的 内部资源—中断系统,它将有效解决上述问题。
P1=led_light2[i++]; //点亮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组成
1,中断的概念
【例5-2】电路如5-10示,8个LED流水灯安装在 P1口,按键K0安装在P2.0上,采用独立式按键识 别,实现任务描述中要求的功能。 程序分析:主程序有两个功能模块,一方面按键 判断程序,另一方面LED流水灯程序。由于按键 是两种流水灯运行方式的交替按键,因此可考虑 设置按键控制标志位状态,LED流水灯则判断标 志位状态决定运行方式,即按键通过标志位间接 控制LED流水灯的运行方式。每次按下按键则把 标志位取反,以达到控制LED流水灯的运行。
任务分析:
键盘实际上是一组开关的集合:当键按下时,两根导线接通;释放 时,两根导线不通。8个按键的键盘电路可考虑在P2口上设计,8个LED电 路仍然安装在单片机P1口。8个按键分别对应控制8个LED,按下按键则点 亮对应的灯。
独立式键盘工作原理及应用
独立式键盘的组成是由若干个按键与单片机的I/O口一一 的对应连接,然后通过读取单片机I/O的电平状态来确认哪 个对应的按键被按下,一般一个独立式按键对应一个功能, 可以通过按键的组合来实现多个功能。
3,中断编程结构
(1) 编写中断初始化程序 为使单片机CPU在执行主程序过程中能够响应中断, 就必须先对使用中断的相关寄存器(TMOD、SCON、 IE等)进行初始化。 【例5-3】假设单片机系统允许外部中断0、定时/计数 器T0中断,并设定采用边沿触发,则主程序中的中断 初始化程序如下: IT0=1; //设置为下降沿触发 EX0=1; //允许中断 ET0=1; //允许T0中断 EA=1; //开放所有中断
(2)编写中断服务程序
中断程序入口。C51规定了8051单片机每种中 断类型对应中断服务程序的入口编号
中断类型 C51中断处理程序的中断号
外部中断0
定时/计数器0溢出中断 外部中断1 定时/计数器1溢出中断 串行口中断
0
1 2 3 4
现场保护。如果中断服务程序中要使用与主程序有 关的寄存器,那么CPU在执行中断服务程序之前要 保护这些寄存器的内容,即“保护现场”,中断返 回时再恢复它们的值。在使用Keil uVison4集成开 发环境时,其C51编译器为中断服务程序提供自动 现场保护以及返回时内容恢复的功能,为用户编程 提供了方便。
单元5 按键模块设计
回顾
1,数码管显示原理? 2,静态数码管工作原理? 3,动态数码管工作原理? 4,AT89C51有几个定时器?各是多少位的?请 简述定时器实现定时原理?
5,8051单片机定时/计数器工作方式有多少种? 6,如何设置8051单片机工作在定时/计数模式下? 7,如何启动定时器工作?
#include"AT89X51.H" unsigned char code led_light[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F}; 对应的编码 void main() { while(1) { if(P2_0==0) //判断key0被按下 { key_delay();//去抖延时10ms if(P2_0==0) //再次判断key0按下 { while(!P2_0); //等待闭合释放 P1=led_light[0]; //点亮LED0 } } if(P2_1==0) //判断key1被按下 { key_delay();//去抖延时10ms if(P2_1==0) //再次判断key1按下 { while(!P2_1); //等待闭合释放 P1=led_light[1]; //点亮LED1 } } ……; } } //点亮LED
8,请简述DS1302读取时间的编程过程?
本单元任务
任务1 任务2 任务3 任务4
独立式键盘设计 键盘中断设计 矩阵式键盘设计 多个外部中断设计
任务1 独立式键盘设计
任务描述:
众多嵌入式单片机系统、嵌入式单片机产品设备中,键盘模块都是 必不可少的,比如手机及各种智能家电等。本任务通过按键控制点亮流水 灯(8个按键分别对应控制8个LED),学习最简单的键盘—独立式按键设 计方法。
硬件电路图
开始
(1)程序流程
由独立式键盘工作原理得知,按键 是否按下是通过读取按键对应的 IO的电平变化而判断的,在程序 设计上,即通过读取按键对应IO 口的电平是否为低(软件去抖)来 决定哪个按键被按下,当判断 key0被按下,则点亮LED0;当判 断key1被按下,则点亮LED1……。
key0按 下 ?
(4)中断的响应条件 首先中断源有请求。其次编程设置单片机CPU允许所 有中断源请求(EA=1),并且中断允许寄存器IE相 应位置为1。这样,在每个机器周期内,单片机对所 有中断源进行顺序检测,并找到所有有效的中断请求, 对其优先级排队。单片机在紧接着下一个机器周期响 应中断条件是:1无同级或更高级中断占用CPU控制 权;2当前指令执行完毕;3如果当前指令为RETI或 需访问IE、IP的指令,执行完该指令且紧随其后的一 条指令也已执行完毕。否则,单片机将放弃对中断请 求的响应。
P2.0=0?
Y
N
软 件 延 时 10ms
P2.0=0?
Y
N
N
闭合释放?
Y
P1.0=0点 亮 LED
P2.1=0?
Y
N
软 件 延 时 10ms
P2.1=0?
Y
N
N
闭合释放?
Y
P1.0=1熄 灭 LED
任务实施
1. Proteus电路设计 2. Keil C51程序设计 3. Proteus-Keil联合调试仿真
(5)中断响应过程 中断的响应过程由单片机CPU控制,自动完成, 具体有如下几个步骤:
执行一个硬件子程序调用,处理优先级最高的中断 请求,清除中断请求标志位(TI和RI除外);硬件 子程序将单片机当前执行的内容的地址压入堆栈, 转入执行相应中断服务程序的第一条指令。 中断处理程序从入口地址开始一直执行到最后为止; 系统返回原来被打断的程序处开始继续执行。