单片机原理实验
实验四、定时器应用实验
――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数码管动态显示每个数码管的点亮时间为几个毫秒,因此先短暂关闭数码显示(
矩阵键盘各行按键的键状态也是分时读取的。首先置
图3.6所示的读键状态及去抖等处理子程序流图对矩阵键盘仍然适用,所不同的是在内部RAM中应指定2字节KEY1和KEY2用于保存开关型的键状态;指定2字节EKEY1和EKEY2用于保存前沿型的键状态。KEY1和KEY2
关闭数码显示器 共可以保存16个键状态,而本实验板中矩阵键盘只有12个键,因此可以将2个独立按键的状态也
扫描0行按键
读K3~0键状态、新的键状态暂的读键状态及去抖处理子程序框仍可延用图3.6
存R6低4位 的流图,只需将图3.6中第一个功能框“读键、
转正逻辑、新的键状态暂存”可细化,如图4.2
扫描1行按键
读K7~4键状态、新的键状态暂;====读矩阵、独立按键子程序(延时去抖)====
存R6高4位 RDKEY: ORL P2,#0FFH ;关闭LED数码显示器
CLR ROW0 ;ROW0=0,扫描K0~3键
扫描2行按键
读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
关闭矩阵键盘
单片机原理实验
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个数据,其中
在本系统中,由于系统比“实验三”复杂,需要定义更多的变量,如键状态字2字节KEY1和KEY2、键前沿字2字节EKEY1和EKEY2、14个键状态位、14个键前沿位等,因此可将变量及常数的定义独立为1个模块“VARDFN.ASM”。
上面,我们从系统的角度分析了系统的状态,得到了状态转移表和模块化的主程序流图,也对系统的所有变量、数据格式进行定义,在此基础上可进一步细化各工作模块。在3个工作模块中“赋值模块”相对最复杂,下面此模块为例来讨论模块的细化问题。由表4.1的状态转移表可得“赋值模块”的流程图,如图4.4所示,程序清单如下。
WORK1: MOV R0,#SNUM0 ;数据2送显缓 ACALL DSBUDT
22