20
第6第 MCS-51 第第第第第第第第第第第第 主主主主主主主主主主主主主主 MCS-51 主主主主主主主主主主主主主 主主 主主主主主主主主主主 主主主主 主主主主主主主 主主主主主主主主主主主主主主主 、、。。 主主主主主 主 主主主主主 主主主主主主主主主主主主主主主主主 主主主主主主主主主 、,。 主主主主主主主主主 主主主主主主主主主主主主主主主主

第 6 章 MCS-51 单片机的交互通道配置与接口

  • Upload
    ashtyn

  • View
    114

  • Download
    0

Embed Size (px)

DESCRIPTION

第 6 章 MCS-51 单片机的交互通道配置与接口. 主要内容: 从工程应用角度介绍了 MCS-51 单片机的交互通道配置与接口,主要包括人机界面中的键盘、显示器、微型打印机等。介绍了多种实用方案和设计技巧。 重点 在于系统概念的形成、各种接口设计方案和设计技巧的掌握,熟悉各种交互设备。 难点 在于使用动态方法进行键盘和显示的硬件及软件设计。. 人机界面 : 是指人与计算机系统进行信息交互的接口,包括信息的输入和输出。 6.1 MCS-51 单片机与键盘的接口技术 键盘: 单片机系统中完成控制参数输入及修改的基本输入设备,是人工干预系统的重要手段。 - PowerPoint PPT Presentation

Citation preview

第 6 章 MCS-51 单片机的交互通道配置与接口

主要内容:

从工程应用角度介绍了 MCS-51 单片机的交互通道配置与接口,主要包括人机界面中的键盘、显示器、微型打印机等。介绍了多种实用方案和设计技巧。重点在于系统概念的形成、各种接口设计方案和设计技巧的掌握,熟悉各种交互设备。难点在于使用动态方法进行键盘和显示的硬件及软件设计。

人机界面 : 是指人与计算机系统进行信息交互的接口,包括信

息的输入和输出。6.1 MCS-51 单片机与键盘的接口技术 键盘:单片机系统中完成控制参数输入及修改的基本输入设备,

是人工干预系统的重要手段。 键盘的分类:按编码方式可分为编码键盘与非编码键盘。按键

组连接方式可分为独立连接式键盘与矩阵连接式键盘。 6.1.1 概述 键盘输入的主要对象:各种按键或开关。 1 .独立连接式键盘 每键相互独立,各自与一条 I/O 线相连, CPU 可直接读

取该 I/O 线的高 / 低电平状态。其优点是硬件、软件结构简单,判键速度快,使用方便;缺点是占 I/O 口线多。

适用场合:多用于设置控制键、功能键。适用于键数少的场合。

独立连接式键盘连接图如右图所示。当没有键被按下时,所有的数据输入线都为高电平;当有任意一个键被按下时,与之相连的数据输入线将变为低电平;通过相应指令,可以判断是否有键按下。

2. 矩阵连接式键盘

键按矩阵排列 , 各键处于矩阵行 / 列的结点处 ,CPU 通过对连在行 ( 列 ) 的 I/O 线送已知电平的信号 , 然后读取列 ( 行 ) 线的状态信息。逐线扫描 , 得出键码。其特点是键多时占用 I/O 口线少 , 硬件资源利用合理,但判键速度慢。

适用场合:多用于设置数字键,适用于键数多的场合。

4 行 4 列矩阵式键盘连接图如右图所示。这种键盘适合采取动态扫描的方式进行识别。

扫描方式:低电平扫描(回送线必须被上拉为高电平)、高电平扫描(回送线需被下拉为低电平)。右图中给出了低电平扫描的电路。3. 薄膜开关

特点:不需要进行导线与开关间的焊接,结构简单、体积小、防尘、防水、防有害气体侵蚀、寿命长、可靠性高。

应用:与按键式键盘类似,多个薄膜开关也可按照独立式或矩阵式设计内部电路,其原理与普通键盘相同。

按键开关去抖动问题 *

键盘的抖动时间一般为 5 ~ 10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。

⑴ 硬件去抖动 消除抖动不良后果的方法:

其中 RC 滤波电路去抖动电路简单实用,效果较好。

⑵ 软件去抖动

检测到按键按下后,执行延时 10ms 子程序后再确认该键是否确实按下,消除抖动影响。

( 1 )开关状态的可靠输入。必须消除键抖动。可以采用硬件和软件两种方法,硬件方法就是在按键输入通道上添加去抖动电路;软件方法则采用延迟 10 ~ 20ms

  ( 2 )键盘状态的监测方法——中断方式还是查询方式。 ( 3 )键盘编码方法。 ( 4 )键盘控制程序的编制。。 6.1.3 键盘接口 功能:对键盘上所按下的键进行识别。 分类: ( 1 )编码键盘:采用专用的编码 /译码器件,被按下

的键由该器件译码输出相应的键码 / 键值。其特点是增加了硬件开销,编码固定,但编程简单。适用于规模大的键盘。

6.1.2 使用键盘时必须解决的问题

( 2 )非编码键盘:采用软件编 /译码的方式,通过扫描,对每个被按下的键判别输出相应的键码 / 键值。其特点是不增加硬件开销,编码灵活,但编程较复杂,占 CPU 时间。适用于小规模的键盘,特别是单片机系统。键盘。

1 .键盘接口的工作原理 对于矩阵式键盘,如上页图所示,键盘的行线 X0 ~ X3 通过电阻接 +5V ,

当键盘上没有键闭合时,所有的扫描线和回送线都断开,无论扫描线处于何种状态,回送线都呈高电平。当键盘上某一键闭合时,则该键所对应的扫描线和回送线被短路,可以确定,变为低电平的回送线与扫描线相交处的键闭合。

CPU 对键盘扫描的方式:程序控制的随机方式( CPU空闲时扫描键盘)、定时控制方式(定时扫描键盘)、中断方式。

CPU 对键盘上闭合键的键号确定方法:根据扫描线和回送线的状态计算求得,或根据行线和列线的状态查表求得。

2 .键输入程序的设计方法 ( 1 )判断键盘上是否有键闭合; ( 2 )消除键的机械抖动; ( 3 )确定闭合键的物理位置; ( 4 )得到闭合键的编号; ( 5 )确保 CPU 对键的一次闭合只做一次处理3 .键盘接口方式( 1 )独立式键盘接口(静态方式)特点:结构简单,每个按键接单片机的一条 I/O 线,通过对输入线的查询,可以识别每个按键的状态。 [ 例题 ] 在 MCS-51 单片机系统中,设计一个含 8 个按键的独立式键盘。解:在 MCS-51 中,含 8 个按键的独立式键盘的线路连接如下页图所示, 8 个按键经上拉电阻拉高后分别接到 MCS-51 单片机P1 口的 8 条 I/O 线上( P1.0 ~ P1.7 )。

在无键按下的情况下, P1.0 ~ P1.7 线上输入均为高电平。当有键按下时,与被按键相连的 I/O 线将得到低电平输入,其他位按键的输入线上仍维持高电平输入。

P1 口 8 条 I/O 线经与非门74LS30 实现逻辑与非后,再经过 1 个非门 74LS04 进行信号变换,然后接至MCS-51 的 引脚上,可通过中断的方式处理键盘。在中断服务程序中,先延时 20 ms 消除键抖动,再对各键进行查询,找到所按键,并转到相应的处理程序中去。

0INT

CLOSE: JNB ACC.7, KEY 7 ; 查询 7 号键 JNB ACC.6, KEY 6 ; 查询 6 号键 JNB ACC.5, KEY5 ; 查询 5 号键

JNB ACC.4, KEY4 ; 查询 4 号键 JNB ACC.3, KEY 3 ; 查询 3 号键 JNB ACC.2, KEY 2 ; 查询 2 号键 JNB ACC.1, KEY 1 ; 查询 1 号键 JNB ACC.0 , KEY 0; 查询 0 号键

INT0: RETI KEY 7: …… ; 7 号键处理程序 KEY 71: MOV A, P1 ; 再读 P1 口各引脚

JNB ACC.7, FUNC71 ; 确认键是否释放 RETI

KEY 6: …… ; 其他键处理程序 ……

D20: …… ; 20ms 延时子程序 …… END

主程序如下:

ORG 0000HLJMP MAINORG 0003H ; 外部中断 0 中断服务入口地址LJMP INT ; 转中断服务ORG 0100H

MAIN: SETB EA ; 开总中断允许SETB EX0 ; 开 INT0 中断SETB IT0 ; 下降沿有效

……

中断服务程序清单如下: INTI CALL D20 ; 延时去抖动

MOV P1, #0FFH ; P1 口送全 1值(准双向口原因)MOV A, P1 ; 读 P1 口各引脚

CJNE A, #0FFH , CLOSE ; 验证是否确实有键闭合 AJMP INT0 ; 无键按下(按键时间过短)则退

;出中断

( 2 )矩阵式键盘接口——行反转法 矩阵式键盘按键识别方法有行反转法和扫描法等。行反转法

需要两个双向 I/O 口分别接行、列线。步骤如下: ( 1 )由行线输出全“ 0” ,读入列线,判有无键按下。 ( 2 )若有键按下 ,再将读入的列列线输出 , 读进行线的值。 ( 3 )第一步读进的列线值与第二步读进的行线值运算,

从而得到代表此键的唯一的特征值。 行反转法因输入与输出线反过来用而得名。优点

是判键速度快,两次即可。[ 例题 ] 请为 8051 微处理器设计一个由 4 行 4 列键阵构成的键盘。

解: 4×4 矩阵键盘的线路连接如下页图所示。其中 P2 口的低 4位作为输出线。 P1 口的低 4位作为输入线,输入线通过74LS21 进行逻辑相与后作为 8051 的一个外部中断源输入。当有键按下时就将引起中断。中断服务程序要对所按的键进行判别。

( 1 )查询闭合键的位置子程序 KEYR

KEYR子程序用以确定每组线中哪一位为 0 ,是否有多个0 。在调用前,应将读某组线的数据存入累加器 A 中。 KEYR子程序返回时,某组线中 0 的位置( 0 ~ 3 )保存在 R3 中。按键闭合引起中断后,执行中断服务程序。

表 2-5 工作寄存器组选择控制表

KEYR 子程序如下: KEYR: CJNE A, #0FEH, TESTP11 ; 测试 P1.0

MOV R3, #0 ; P1.0=0 ,说明被按键的输入线为 P1.0

LJMP FINISH ; 返回 TESTP11: CJNE A, #0FDH, TESTP12 ; 测试 P1.1

MOV R3, #1

LJMP FINISH

TESTP12: CJNE A, #0FBH, TESTP13 ; 测试 P1.2

MOV R3, #2

LJMP FINISH

TESTP13: CJNE A, #0F7H, FINISH ; 测试 P1.3

MOV R3, #3

FINISH: RET

( 2 )中断服务程序 中断服务程序开始部分应利用软件延时消除键抖动,然后再对所按的键做出处理。 中断服务程序如下: ORG 1000H

INT11:LCALL DELAY ; 延时去抖动MOV A, P1 ; 读输入线ANL A, #0FH ; 判断是否有键闭合CJNE A, #0FH, TEST ; 有键闭合,转判断按键程序RETI ; 无键闭合,返回

TEST: MOV B, A ; 暂存LCALL KEYR ; 调用读取子程序MOV 40H, R3 ; 暂存在 40H 单元MOV P2, #0FFH ; 输出线写 1MOV P1, B ; 输入线写入数据MOV A, P2 ; 读输出线LCALL KEYR ; 调用读取子程序XCH A, R3SWAP AORL 40H, A ; 得按键特征值RETI

中断程序结束后,键的特征值存放在 40H 单元中。此键的输出线号位于40H 单元的高 4位,其输入线号位于低 4位。此后,根据 40H 单元的内容去查表,得到相应键的代码,可进行显示或其他处理。( 3 )去抖动的延时子程序 DELAY

利用 CPU 的空闲方式,通过定时器 T1 实现延时, T1 必须预先置初值,以得到需要的延迟时间。设晶振频率为 6MHz ,欲延时 20ms ,定时时间为: ( 216 - TC ) ×6/12=20×103μs ,初值: TC=25536=63C0H 。程序如下: DELAY: MOV TOMD, #11H ; 方式 1定时

MOV TL1, #0C0H ; 定时器 1定时初值MOV TH1, #63HSETB EA ; 开中断SETB ET1 ; 开定时器 1 中断SETB PT1 ; 定时器 1 为高级中断(因被键盘中断调

用)SETB TR1 ; 启动定时器ORL PCON , #1 ; 启动空闲方式,实际 CPU 在此处等待CLR TR1 ; 以下四条指令只有在延时后,定时器被唤醒,才能执

行CLR PT1CLR ET1RETEND

( 4 )通过串行口扩展键盘接口 MCS-51 系列单片机的串行口与串 /并转换芯片配合(如串入并出芯片

74LS164 )可以扩展键盘。[ 例题 ] 利用 MCS-51 的串行口与串 /并转换芯片配合,扩展 2 行 8 列的键

盘接口,键号为 0 ~ 15 。要求给出其硬件连接和键盘查询子程序。解:串口与串 /并转换芯片配合扩展键盘的线路连接如下图所示。

其中, P1.0 和 P1.1作为行线。键盘的编码为: P1.0 线上的 8 个键分别为 00H+ ( 00H ~ 07H ), P1.1 线上的 8 个键分别为 08H+ ( 00H ~ 07H )。扫描线( 00H ~ 07H )的具体值存放在 R4 中。

程序采取查询方式读取键号,并且考虑了键的抖动问题。 DLY1 是延时子程序。

程序如下: ORG 1000H SERKEY:MOV SCON, #00H ; 设置串行口

MOV A, #00H ; 键盘初始化,送 00H到列线上 LCALL VARTO ; 发送数据

CHK:JNB P1.0, CHK0 ; 检查是否有键按下 JNB P1.1, CHK0 ; 检查是否有键按下

AJMP CHK ; 无键按下,继续查找 CHK0:LCALL DLY1 ; 调用 10ms 延时子程序,去抖

JNB P1.0, CHEN ; 确实有键按下,转 CHEN JNB P1.1, CHEN AJMP CHK ; 无键按下,继续查找

CHEN:MOV R2, #0FEH; 首列扫描字送 R2 ,查键号,最低位为 0 MOV R4, #00H ; 首列偏移值送 R4

CHKN:MOV A, R2 ; 发送列扫描字 LCALL VARTO JB P1.0, CH1 ; 检查 P1.0 有无键按下;若无,转 CH1 MOV A, #0 ; 第一行首列值送 A , 00H+ ( R4 ) AJMP CKEY ; 转求键号

CH1:JB P1.1, NEXT ; 检查 P1.1 有无键按下;若无,转 NEXT MOV A, #8H ; 第二行首列值送 A

CKEY:ADD A, R4 ; 求键号,并入栈保护 RET

NEXT:INC R4 ; 指向下一列 MOV A, R2 ; 取出原扫描字 JNB ACC.7 , KEND ; 是否已检查完 8 列? RL A ; 8 列未完,指向下一列 MOV R2, A ; 列扫描字送 R2 AJMP CHKN ; 8 列未完,检查下一列

KEND:AJMP SERKEY ; 8 列查完,未查到有键按下,等待 VARTO:MOV SBUF, A ; 发送 A 中数据

JNB TI, $ ; 发送等待 CLR TI ; 清除 RET

DLY1: …… ; 延时 10ms子程序(略) END ; 结束