《基于任务驱动的单片机应用教程》课件第9章_第1页
《基于任务驱动的单片机应用教程》课件第9章_第2页
《基于任务驱动的单片机应用教程》课件第9章_第3页
《基于任务驱动的单片机应用教程》课件第9章_第4页
《基于任务驱动的单片机应用教程》课件第9章_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

任务9电子密码锁的设计9.1任务内容与分析

9.2任务实施9.3任务相关知识

9.1任务内容与分析

1.任务内容

在单片机的应用系统中,通常都要有人机对话功能,如输入/输出数据、对系统运行进行控制等,这时就需要键盘。任务9以电子密码锁为例,介绍键盘接口技术的应用。

2.任务分析

若密码输入正确,则输出一个电磁锁开锁信号;若密码输入错误,则密码错误指示灯亮。10s内无任何操作后,清除所有输入内容,等待下次输入。6位数码管用于显示6位数密码,按某键后相应的数值出现在数码管上;再按一个键,则数字出现在下一个数码管上。当清除所有输入和无任何操作时,数码管无显示。

6位数密码的数字可以是“0~9”,这就需要10个按键,还要有1个确认键、1个清除键,而单片机的I/O口资源有限,故采用4 × 4矩阵式键盘。图9-1为电子密码锁原理框图。P3.0接电磁开锁信号;P3.3接蜂鸣器,用于按键时的提示音;P3.4接1个发光二极管,用于密码输入错误指示。图9-1电子密码锁原理框图9.2任务实施

步骤1:根据任务分析,设计硬件电路原理图。

采用89S51作为主控制器,外围电路器件包括数码管驱动、蜂鸣器的输出驱动、矩阵式键盘及发光二极管的输出等。

数码管驱动采用6个共阴极数码管显示,由于单片机的驱动能力有限,采用74HC244作为数码管的驱动,在74HC244的7段码输出线上串联100Ω电阻起限流作用。继电器旁边并联1个保护二极管,以消除电磁锁可能产生的反向高电压和电磁干扰,从而保护三极管等驱动元器件。采用中功率的三极管8050来驱动继电器。电磁锁的选用要视应用场合而定,要求吸合力足够,再根据电磁锁的用电量来选用继电器。

蜂鸣器采用PNP三极管8550来驱动,低电平有效。矩阵式键盘的设计参见9.3.3小节。硬件电路原理如图9-2所示。图9-2电子密码锁电路原理图主程序完成内部RAM单元和特殊功能寄存器的初始化后,进入一个循环结构。键盘扫描中断服务程序实现判断是否有键闭合以及闭合键的键号,每50ms扫描键盘1次。待机中断服务程序实现待机计时(10s),若10s内没有输入内容则清除已输入的内容。步骤3:根据整体设计思路,绘出程序流程图。

主程序、数码管显示子程序、密码判断子程序及待机中断服务程序分别如图9-3~图9-5所示。图9-3主程序流程图图9-4数码显示子程序图9-5密码判断子程序步骤4:根据流程图编制源程序。具体如下:

//*********电子密码锁程序***************//

;程序名:电子密码锁程序PWKEY.A

;程序功能:单片机控制的电子密码锁设计

DISPBUFEQU30H ;显示缓冲单元为30H~35H

KEY_COUNTEQU41H

;密码计数器,通过它得知输入密码的个数

50MS_COUNTEQU42H ; 50ms单元,用于计

50ms中断次数 1S_COUNTEQU43H

; 50ms单元,通过它得知

是否到1s

KEYMARK

BIT

00H;有键按下标志位,1为按下

标志

PASSMARKBIT01H;密码是否正确标志,1为密

码正确标志

BUZZERBITP3.3

EKY_OPENBITP3.0

ERROR_LEDBITP3.4

ORG0000H

AJMPSTART

ORG000BH

AJMPKEY ;键盘扫描中断服务程序

ORG001BH

AJMP

WAIT ;待机中断服务程序

ORG0030H

;**************主程序****************

START: MOVTMOD,#11H

;T0、T1均工作在方式

1定时

MOVTH0,#3CH

;装T0计数初值

MOVTL0,#0B0H

MOVTH1,#3CH

;装T1计数初值

MOVTL1,#0B0H

MOVKEY_COUNT,#00H ;密码计数器清零 MOV50MS_COUNT,#00H; 50ms计数单元清零

MOV1S_COUNT,#00H ; 1s计数单元清零

CLRKEYMARK ;有键按下标志位清零

CLRPASSMARK ;密码是否正确标志清零

ACALLDISCARD ;调用密码计数器与显示缓冲单

元清零的子程序

SETBET0 ;开中断

SETBET1

SETBEA

SETBTR0

;开定时器计数器0,键盘扫描中断

LOOP: ACALLDISP;调用数码管显示子程序

SETBTR1

JBKEYMARK,MP

;判断是否有键闭合

AJMPLOOP

MP:CLRPASSMARK;有键闭合,清除键闭合有效标志

CLRTR1

ACLLBEEP

;调用蜂鸣器子程序

MOVA,B

;取键号

MOVR1,#DISPBUF;指向首个显示缓冲单元

SUBBA,,#9

JNCGNJIAN

;判断是否为功能键 MOVA,B

;为数字键

MOV@R1,A

INCKEY_COUNT;密码计数器加1

INCR1;指向下一个显示缓冲单元

ACALLPASSWORD

;调用密码判断子程序

AJMPLOOP

GNJIAN:MOVA,B

;为功能键

CJNEA,#10,ACK

;判断是不是取消键

ACLLDISCARD

;是取消键,则清除所有输入内容

AJMPLOOP

ACK:CJNEA,#11,NEXT

;判断是不是确定键

JBPASSMARK,OPEN

;判断密码是否正确

CLRERROR_LED

;密码错误,亮灯指示

AJMPLOOP

OPEN: SETBKEY_OPEN

;开电磁锁

NEXT: AJMPLOOP

;**************数码管显示子程序***********

;功能:数码显示已输入的密码

DISP: MOVR0,#DISPBUF; LED显示位数送R2

MOVR4,#20H ;从最右端LED开始显示 MOVDPTR,#TAB ;字型表首地址

MOVA,KEY_COUNT

CJNEA,#00H,DISP1

;判断密码个数是否为0

AJMPEXIT1

;为0则退出,不显示

DISP1:MOVA,@R0

;显示缓冲区首地址送R0

MOVCA,@A+DPTR

;查表取字型码

MOVP0,A

;字型码送P0口 MOVA,R4

;取位选控制字

MOVP2,A

;送P2口

ACALLDELAY_1ms

;延时1ms

MOVR6,KEY_COUNT

DJNZR6,DISP2

;判断是否显示完已输入的密码

AJMPEXIT1

DISP2: INCR0

;指向下一个密码

RRA

;扫描码移位

MOVR4,A

AJMPDISP1

EXIT1: RET

TAB: DB3FH,06H,5BH,4FH,66H,6DH

;“0~9”共阴极字型码

DB7DH,07H,7FH,6FH

;****************密码判断子程序**************

;功能:判断是否输入完6个密码,若输入完,则判断所输入密码是否正确

;出口参数:密码正确标志和密码错误标志

PASSWORD: MOVA,KEY_COUNT

;取密码已输入个数

CJNEA,#06H,EXIT2

;判断是否已输入完6个密码

MOVKEY_COUNT,#00H ;密码计数器清零 MOVDPTR,#PASSTAB

;指向程序设定密码表首址

MOVR5,#00H

;指向第一个设定密码

MOVR0,#DISBUF

;取显示缓冲单元首址

JUDGE: MOVA,R5

MOVCA,@A+DPTR

;查表取密码

MOV60H,@R0 CJNEA,60H,EXIT2

;判断密码是否正确

INCR0

;指向下一个显示缓冲单元

INCR5

;指向下一个设定密码

CJNER5,#06H,JUDGE

; 6个密码是否判断完

SETBPASSMARK

;建立密码正确标志

AJMPEXIT2

EXIT: CLRPASSMARK

;建立密码错误标志

EXIT2: RET

PASSTAB: DB1,2,3,4,5,6 ;密码定为123456

;*******键盘扫描中断服务子程序KEY************

KEY: ...;请参考例9-2键盘扫描程序

RETI

;************待机中断服务子程序WAIT***********

;功能:10s内没有输入内容则清除已输入的内容

WAIT: MOVTH1,#3CH

;装T1计数初值

MOVTL1,#0B0H

INC50MS_COUNT

MOVA,50MS_COUNT

CJNEA,#20H,EXIT3

;判断是否到1s

INC1S_COUNT MOVA,1S_COUNT

CJNEA,#10,EXIT3 ;判断是否到10s

ACLLDISCARD

EXIT3: RETI

;**********清除缓冲单元子程序***********

DISCARD:MOVKEY_COUNT,#00H ;密码计数器清零

MOVR7,#06H ;显示缓冲单元清零

MOVR0,#DISPBUF

CLRA

L1:MOV@R0,A

DJNZR7,L1

RET

;************蜂鸣器提示音子程序****************

BEEP:

CLRBUZZER

ACALLDELAY_2MS

SETBBUZZER

ACALLDELAY_2MS

RET

;*******1ms延时子程序*******************

DELAY_1ms: MOVR7,#02H;延时1ms子程序

DL1: MOVR6,#0FFH

DL2: DJNZR6,DL2

DJNZR7,DL1

RET

;*******2ms延时子程序*******************

DELAY_2ms:MOVR7,#50;延时2ms子程序

DL1: MOVR6,#123

DL2: DJNZR6,DL2

DJNZR7,DL1

RET

9.3任务相关知识

9.3.1键盘接口

1.按键的特点

键盘是由若干个按键按照一定规则组成的,每一个按键实际上是一个开关元件。按键按照结构原理可分为两类:一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键、磁感应按键等。前者造价低,后者寿命长。

2.按键的输入原理

对于一组键或一个键盘,总有一个接口电路与CPU相连。图9-6所示电路中,当S0键按下时,该键所对应口线将由高电平变为低电平,这样当检测到P1.0口为低电平时,可判断出S0键被按下。因此,通过软件可判断出按键是否被按下。图9-6按键输入电路

3.按键的抖动及消抖

由于通常的按键所用的开关是机械式开关,当开关闭合、断开时并不是马上稳定地接通和断开,而是在闭合与断开瞬间均伴随有一连串的抖动。其抖动过程如图9-7所示。抖动时间的长短与开关的机械特性有关,一般为5~10ms。图9-7按键触点的机械抖动为了确保CPU对键的一次闭合仅做一次处理,必须在程序或硬件上进行防抖处理。为节省硬件,通常在单片机系统中,一般不采用硬件方法消除键的抖动,而是用软件方法消抖。即检测键闭合后延时5~10ms,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认真正有键按下。当检测到按键释放后,也要给5~10ms的延时,待后延抖动消失后再转入该键处理程序。只有按键按下再放开后才做一次键处理。

以图9-6中S0键为例,按键软件消抖方法程序如下:

S0_KEY: JB

P1.0,

S0_KEY

;无键按下,继续查询

ACALL

DELAY_10MS;有键按下,延时10ms

JB

P1.0,

S0_KEY

;再判断,若无键按下,是抖动转回

JNB

P1.0,

$

;键一直按下,等待

ACALL

DELAY_10MS

;键松开,延时10ms

JB

P1.0,

S0_PROG

;一次按键完成,转S0键处理程序

S0_PROG:9.3.2独立式键盘的工作原理

1.独立式键盘接口电路

独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键的典型应用如图9-8所示。图9-8独立式按键的典型应用

2.独立式键盘的软件结构

【例9-1】请完成任务8数码秒表的扩展功能,即用3个独立式按键实现秒表的启动、暂停和清零功能。解3个按键采用独立式键盘接法,第1和第2个按键分别连接到外部中断TNT0、INT1的输入引脚P3.2、P3.3,第3个按键连接到定时器T1的外部脉冲输入引脚P3.5。以中断方式实现键盘输入状态的扫描,其中按键1为启动按钮,按键2为暂停按钮,按键3为清零按钮。硬件原理图请参考任务8中图8-1。程序设计思路:任务8程序划分为主程序和秒计时程序两大模块。在本例中再增添一个键盘扫描程序模块,键盘扫描也由中断服务子程序来实现。定时器T1设为8位的计数方式2,计数初值设为0FFH,这样当按键3按下时,即可引起中断。中断源TNT0、INT1和T1均允许中断,各按键的处理通过相应的中断子程序来实现。

//********数码秒表程序***********//

;程序名:数码秒表程序SECWATCH.A

;程序功能:数码秒表,秒表启动、显示、暂停和清零功能

MSECEQU40H

SECEQU41H

ORG0000H

AJMPSTART

ORG0003H

AJMPKE2;转键盘暂停程序,外部中断TNT0

ORG000BH

AJMPCONT;转秒表计时定时器中断服务程序

ORG0013H

AJMPKE1

;转键盘启动程序,外部中断TNT1

ORG001BH

AJMPKE3;转秒表清零程序,定时器T1中断

ORG0030H

START: MOVTMOD,#61H;T0方式1定时,T1方式

2计数

MOVTH0,#3CH

;装T0计数初值

MOVTL0,#0B0H

MOVTH0,#0FFH

;装T1计数初值

MOVTL0,#0FFH

MOVMSEC,#14H

;50ms计数单元初值

MOVSEC,#00H

;秒计数单元初值

MOVSP,#3FH

;堆栈指针初值

MOV30H,#00H

;显示缓冲单元清零

MOV31H,#00H

MOVIE,#8FH

;允许中断

AGIN: LCALLDISP ;调用显示子程序

AJMPAGIN

;***************显示子程序***********

DISP: .... ;请参考任务8

RET

;*********定时器T0中断服务子程序CONT********

;入口参数:秒计数单元SEC

;出口参数:秒单元SEC,显示缓冲区30H、31H

CONT:

....

;请参考任务6

RETI

;***********按键1中断服务子程序KE1*************

KE1:SETBTR0;启动定时器T0,开始计时

SETBTR1 ;启动定时器1

RETI

;*******按键2中断服务子程序KE2************

KE2:CLRTR0 ;关闭定时器T0,暂停计时

RETI

;*********按键3中断服务子程序KE3**************

KE3:

CLRTR0

;关闭定时器T0,暂停计时

MOVSEC,#00H

;秒计数值清零

MOV30H,#00H

;秒显示缓冲区清零

MOV31H,#00H

RETI

END9.3.3矩阵式键盘的工作原理

1.矩阵式键盘接口电路

矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如图9-9所示。由图可知,一个4×4的行、列结构可以构成一个含有16个按键的键盘。在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。图9-94×4矩阵式键盘矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到VCC上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响。

2.矩阵式键盘的识别

图9-9中8号键的识别为例来说明扫描法识别按键的过程。

按键按下时,与此键相连的行线与列线导通。行线在无键按下时处在高电平,显然,如果让所有的列线也处在高电平,那么按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。

CPU根据行电平的变化,便能判定相应的行是否有键按下。当8号键按下时,X2一定为低电平。然而,X2行为低电平时,能否肯定是8号键按下呢?回答是否定的,因为9、10、11号键按下,同样也会使X2行为低电平。这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘扫描后,再来观察8号键按下时的工作过程。当Y0列处于低电平时,X2行处于低电平,而当Y1、Y2、Y3列处于低电平时,X2行却处在高电平,由此可判定按下的键应是X2行与Y0列的交叉点,即8号键。

3.矩阵式键盘的编码

对于矩阵式键盘,按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图9-9中的8号键,位于X2行,Y0列,故其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转移指令对按键进行处理。因此,可采用依次排列键号的方式对按键进行编码。以图9-9中的4×4键盘为例,可将键号编码为0,1,2,3,…,14,15共16个键号。编码相互转换可通过计算或查表的方法实现。键号计算公式为:键号=所在行号×键盘列数+所在列号或键号 = 行首键号(0、4、8、12)+列号(0、1、2、3)。

4.矩阵式键盘的工作方式

对键盘的响应取决于键盘的工作方式,而键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有3种,即编程扫描、定时扫描和中断扫描。

1)编程扫描

键盘扫描程序流程如图9-10所示,一般应包括以下内容:

(1)判断有无键按下。

(2)键盘扫描取得闭合键的行、列值。

(3)用计算法或查表法得到键值。

(4)判断闭合键是否释放,如未释放则继续等待。

(5)保存闭合键键号,同时转去执行该闭合键的功能。图9-10键盘扫描程序流程图

2)定时扫描

定时扫描每隔一段时间对键盘扫描一次,利用单片机内部的定时器产生一定时间(如10ms)的定时,当到达定时时间后,就产生定时器溢出中断,CPU响应中断后转去执行键盘扫描子程序,并识别键号。

3)中断扫描

采用上述两种键盘扫描方式时,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时并非经常需要键盘输入。因此,CPU经常处于空扫描状态。为提高CPU的工作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU处理自己的工作;当有键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。

【例9-2】任务9电子密码锁的4×4矩阵式键盘的程序设计。键盘的行线接到P1口的低4位,列线接到P1口的高4位。行线P1.0~P1.3分别接有4个上拉电阻到正电源VCC,并把行线P1.0~P1.3设置为输入线,列线P1.4~P1.7设置为输出线。4根行线和4根列线形成16个相交点。要求有10个数字键,键值为0~9;两个功能键,其中一个为确认键,另一个为取消键。解(1)硬件设计。硬件电路如图9-9所示,设计数字键0~9的键号依次为0~9,取消键的键号为10,确认键的键号为11,键号可按键值=行首键号(0、4、8、12)+列键号(0、1、2、3)的公式计算。按键功能分布及键号如图9-11所示。图9-114×4矩阵式键盘中每个按键的输入信息和键号

(2)程序设计思路。

①检测当前是否有键被按下。检测的方法是P1.4~P1.7输出全“0”,读取P1.0~P1.3的状态;若P1.0~P1.3为全“1”,则无键闭合,否则有键闭合。

②去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。

③若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。

P1.4~P1.7按下述4种组合依次输出:

在每组行输出时读取P1.0~P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。

(3)键盘扫描程序。

参考键盘扫描程序流程图9-10及以上分析,请自行绘出流程图。

//*************键盘扫描子程序*************//

;子程序功能:电子密码锁的4 × 4矩阵式键盘的扫描程序

;子程序名:KEY

;入口参数:无

;出口参数:键号保存在特殊功能寄存器B中

KEY:MOV

P1,#0FH

;高4位P1.4~P1.7输出全“0”

MOVA,P1

ANLA,#0FH

;读取低4位P1.0~P1.3的状态

CJNEA,#0FH,NEXT1;判断低4位是否为0,若

不为0,表示有键闭合

SJMPNEXT4;无键闭合,清有键按下标志,

返回

NEXT1:ACALLDELAY_10MS

;延时,防抖动

MOVA,P1

ANLA,#0FH;再读取低4位P1.0~P1.3的状态

CJNEA,#0FH,NEXT2;判断是否确实有键闭合

SJM

温馨提示

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

评论

0/150

提交评论