单片机原理实验5(5)

2019-03-09 17:20

单片机原理实验

实验四、定时器应用实验

――LED数码显示与矩阵键盘赋值程序设计

一、

1. 2. 3. 4.

实验目地

掌握定时器/计数器定时设计方法。

掌握矩阵键盘工作原理及读矩阵键盘和去抖程序设计方法。 掌握LED数码显示与矩阵键盘赋值程序设计方法。

进一步学习模块化的程序设计方法,掌握状态及其转移分析方法。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. 定时器及其中断 在实验三中,我们采用调用处延时程序实现5位LED数码管动态显示,并采用独立键盘对显示内容进行加1和减1设置。我们发现在这样一个简单的设计中,CPU很忙,每时每刻都在执行不可缺省的指令,没有时间作完成其它任务。若要增加系统的功能必须在主程序中增加模块,也就增加了CPU执行相应模块的时间,这将导致主程序每次循环的时间超过5mS,且每次循环的时间可能不相同。当系统增加的功能消耗CPU时间不多,主程序循环时间偏离5mS的误差较小,这样的设计方法仍不失是一种可行的方法,反之应放弃该方法。

解决上述问题的方法可以采用单片机的定时/计数器,若将定时/计数器T0设置为方式1定时器,定时时长为4mS,则定时/计数器工作方式寄存器TMOD=01H;若系统晶体振荡器频率为12MHz,则定时器初值为:

M?65536?定时时长?65536-4000?F060H

机器周期即TH0=F0H、TL0=60H。

2. 矩阵键盘工作原理及读键盘和去抖处理 在实验三中,独立键盘SW1和SW2的每个键均接独立K11K10K9ROW2接1条IO口,当系统所需按键较多,若每个按键均占用1条K7K6K5ROW1IO端口,则按键占用的CPU资源过多,系统实现难度较大。

K3K2K1ROW0解决上述问题的方法可以

CS3CS2CS1采用矩阵键盘电路。图4.1是

3*4矩阵键盘电路,其中K0~图4.1:3*4矩阵键盘电路

18

K8K4K0CS0 单片机原理实验

K3四键、K4~K7四键、K8~K11四键组成矩阵键盘的第0、1、2行,各行分别由选择控制口ROW0、ROW1、ROW2控制;(K0,K4,K8)三键、(K1,K5,K9)三键、(K2,K6,K10)三键、(K3,K7,K11)三键组成矩阵键盘的第0、1、2、3列,分别由4条数据线读取键状态。

由图4.1可见,读取键状态的4条数据线CS0~3与LED数码管动态显示电路5条扫描线中的4条共用。之所以能够共用CS0~3端口,是由于CPU读取按键状态所需时间很短(几十微秒),而LED数码管动态显示每个数码管的点亮时间为几个毫秒,因此先短暂关闭数码显示(=1111),读取按键状态;然后关闭矩阵键盘(=111),打开数码显示,并不会影响数码显示的视觉效果,或者说矩阵键盘与数码管动态显示分时复用CS0~3端口。

矩阵键盘各行按键的键状态也是分时读取的。首先置=110,选择第0行四个按键,此时若K0~K3中有键按下,CS0~3端口线的相应位为0,其它位为1,而另两行的按键如有键按下不会影响上述逻辑,此时从CS0~3读取的数据为第0行四个按键的键状态。然后置=101,选择第1行四个按键,读取第1行四个按键的键状态。再后然后置=011,选择第2行四个按键,读取第2行四个按键的键状态。如前所述,上述所有按键的键状态读取仅需几十微秒。

图3.6所示的读键状态及去抖等处理子程序流图对矩阵键盘仍然适用,所不同的是在内部RAM中应指定2字节KEY1和KEY2用于保存开关型的键状态;指定2字节EKEY1和EKEY2用于保存前沿型的键状态。KEY1和KEY2

关闭数码显示器 共可以保存16个键状态,而本实验板中矩阵键盘只有12个键,因此可以将2个独立按键的状态也

扫描0行按键=110、并入这2个字节中。这样,矩阵键盘和独立按键

读K3~0键状态、新的键状态暂的读键状态及去抖处理子程序框仍可延用图3.6

存R6低4位 的流图,只需将图3.6中第一个功能框“读键、

转正逻辑、新的键状态暂存”可细化,如图4.2

扫描1行按键=101、所示。部分程序如下:

读K7~4键状态、新的键状态暂;====读矩阵、独立按键子程序(延时去抖)====

存R6高4位 RDKEY: ORL P2,#0FFH ;关闭LED数码显示器

CLR ROW0 ;ROW0=0,扫描K0~3键

扫描2行按键=011、 NOP ;延时,键盘线越长延时越长

读K11~8键状态、新的键状态 NOP

暂存R7低4位 MOV A,P2 ANL A,#0FH ;K0~3键位保留

XRL A,#0FH ;求反转正逻辑 MOV R6,A ;新的键状态暂存R6 ORL P2,#0FFH CLR ROW1 ;ROW1=0,扫描K4~7键 ???? ;扫描第1、2行按键等

19

关闭矩阵键盘=111、读独立按键SW1和SW2键状态、新的键状态暂存R7低4图4.2:“图3.6读键、转正逻辑、新的键状态暂存”细化

单片机原理实验

ORL P2,#0FFH;关闭矩阵键盘 ORL P1,#0C0H

MOV A,P1 ;读独立按键

ANL A,#0C0H ;接独立键盘的位保留 XRL A,#0C0H ;求反转正逻辑 ADD A,R7

MOV R7,A ???? ;键状态变化判断、延时去抖、键前沿提取等 RET

3. 模块化程序设计方法――系统状态及其转移分析方法

单片机应用系统和程序构架与系统所要实现的功能有关,模块化程序设计方法仍是常用的方法。程序员首先要分析系统的功能,将系统分解为几个不同的工作状态,并用代码表示系统的工作状态,保存状态代码的内部RAM单元称为状态字(不妨记态字为STA),处在不同工作状态时,系统执行不同的程序模块,实现不同的功能;其次要分析实现这些功能的控制量有哪些,包括按键、开关量(或逻辑信号)和模拟量(或模拟量)等,找出系统的工作状态发生变化的条件,即控制量满足什么条件时工作状态将发生什么变化,得出系统的状态转移表。在此基础上,利用“JMP @A+DPTR”指令,根据工作状态字STA的不同取值进行间接长转移(或称为散转),从而实现系统工作状态的转移,完成工作任务的调度。下面举简例说明之。

在实验板上设计一个系统,实现以下功能:①上电时4位数码管显示“8952”1秒,指示灯全亮。②紧接着显示“学号”(低4位),同时LD1灯亮表示当前显示内容为“学号”,此时按键K0~11无效,SW1和SW2键有效。③若按SW2键一次,LD2亮表示此时可以利用数码显示和按键K0~9进行赋值,K0~9键代表“0~9”数值键,每按1次数值键后,原4位显示数值在显示器上左移1位,新输入的数值从右边进入,输入数值的位数不限,但从显示器左边移出的数值不保留;若再按“SW2”键一次,显示器上显示的数值保存,重新显示“学号”,LD1亮。④在显示“学号”,LD1亮的情况下,若按下SW1键一次,系统显示最后输入的4位数值供查询,LD3亮表示查询,此时不能对显示数值进行修改,5秒后自动重新显示“学号”,LD1亮;若在自动重新显示“学号”之前,按住SW1键不抬起,将暂停5秒计时,按键松开后恢复计时,从而推迟重新显示“学号”。

对上述的系统功能进行分析,“功能①”规定了系统上电后1秒内的行为,这此功能可归为上电复位初始化内容;分析其它功能,可将系统分解为3个工作状态:第1种状态为待机状态,(STA)=0,显示“学号”、LD1亮;第2种状态为赋值状态,(STA)=1,显示输入的值、LD2亮;第3种状态为查询状态,显示最后输入的4位数值、LD3亮。在待机状态下,系统只响应SW1和SW2的键前沿,若按SW2键1次则系统转入赋值状态,若按SW1键1次则系统转入查询状态;在赋值状态下,系统响应K0~9和SW2的键前沿,若按K0~9中的任一键则进行赋值,若按SW2键则系统转回待机状态;在查询状态下,系统只响应SW1的键状态,若按SW1键不松开则暂停5秒计时,推迟返回待机状态。由上面的分析可得到系统的状态转移表,如表4.1所示。

20

单片机原理实验 表4.1:状态转移表举例

状态 显示及执行任务 可响应的控制量及其作用 状态转移及其条件 有SW1键则转入查询状态 有SW2键则转入赋值状态 待机状态 显示“学号”(低SW1和SW2键前沿,用于(STA)=0 4位)、LD1亮。 控制状态转移。 赋值状态 显示当前的输入(STA)=1 值、LD2亮。 K0~9和SW2的键前沿,分有SW2键则返回待机状态 别用于赋值和状态转移。 计时到则返回待机状态 查询状态 最后输入的4位SW1的键状态,用于控制5(STA)=2 数值、LD3亮。 秒计时器工作。 根据状态转移表,可以容易得到系统程序流程图,如图4.3所示,部分主程序清单如下:

;====变量及常数定义段====

复位入口 INCLUDE \ ;添加变量等定义模块

;=============== ORG 0000H 初始化 LJMP MAIN

N ORG 000BH 4mS到? LJMP T0SER ;转T0中断服务子程序

Y ORG 0030H

清定时标志,4mSMAIN: INCLUDE \;添加初始化模块

定时重设;读键状MLOOP: JNB TF0,$ ;4mS到?

态及去抖处理;数 CLR TF0 ;清定时标志

码管动态显示 MOV TH0,#0F0H ;4mS定时重设 MOV TL0,#60H LCALL RDKEY ;调用读键状态及去抖处理 ??(如其它控制 LCALL DISP ;调用数码管动态显示 量读取等) MOV A,STA ;根据状态值散转相应模块 ANL A,#03H

根据状态值散转相 RL A

应模块 MOV DPTR,#MTAB JMP @A+DPTR STA=0 待机模块 MTAB: AJMP WORK0 ;转移到待机模块

STA=1 AJMP WORK1 ;转移到赋值模块

赋值模块 AJMP WORK2 ;转移到查询模块

STA=2 AJMP WORK0 ;冗余

查询模块 ;====待机模块==== WORK0: ???? 图4.3:系统程序流图 AJMP MLOOP

21

单片机原理实验

;====赋值模块==== WORK1: ???? AJMP MLOOP ;====查询模块==== WORK2: ???? AJMP MLOOP

;====其它非通用子程序==== ????;详见赋值模块细化的DSBUPT ;====T0中断服务子程序==== T0SER: RETI

;====通用子程序段====

INCLUDE \添加读键状态及去抖处理子程序 INCLUDE \添加数码管动态扫描显示子程序 END

由图4.3及上述主程序清单可见,一般情况下,采用模块化方法设计程序时,程序有以下三个特点。其一是,每个模块只有唯一的入口和唯一的出口。其二是执行各模块只有2种方法,或用调用指令调用子程序模块,完成特定任务后返回调用处;或根据状态值,用间接长转移指令散转至相应工作模块,各工作模块执行后用无条件转移指令回到程序主循环的起点MLOOP处。其三是不能使用无条件转移指令由一个工作模块直接转入另一模块;工作模块间的转移是只能通过修改状态值,在下一次主循环中自动转入所需模块,详见以下对“赋值模块”的细化和相应程序清单。

在本系统中,有2个数据是必须保存的,其一是“学号”的低4位,其二是键盘输入的4位数值,这2个数据都是双字节的压缩DCB码。为此,在内部RAM中开辟4个字节单元用于存储这2个数据,其中存储第1个数据(First Number),存储第2个数据(Second Number),每个数据均存储在2个连续地址单元,高位字节存储在低地址。此外还必须在内部RAM中开辟2字节的单元用于查询模块中的5秒计时,不妨记为SEC和SECL,其中SEC为秒计时单元,SECL 为不足1秒的计时单元,SECL以4mS为基准计时(处在查询状态时,系统每4mS进入查询模块一次),SECL计满250为1秒。

在本系统中,由于系统比“实验三”复杂,需要定义更多的变量,如键状态字2字节KEY1和KEY2、键前沿字2字节EKEY1和EKEY2、14个键状态位、14个键前沿位等,因此可将变量及常数的定义独立为1个模块“VARDFN.ASM”。

上面,我们从系统的角度分析了系统的状态,得到了状态转移表和模块化的主程序流图,也对系统的所有变量、数据格式进行定义,在此基础上可进一步细化各工作模块。在3个工作模块中“赋值模块”相对最复杂,下面此模块为例来讨论模块的细化问题。由表4.1的状态转移表可得“赋值模块”的流程图,如图4.4所示,程序清单如下。

WORK1: MOV R0,#SNUM0 ;数据2送显缓 ACALL DSBUDT

22


单片机原理实验5(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016年10月22日浙江省事业单位联考职业能力倾向测验真题及答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: