单片机原理实验
MOV P0,A ;七段码送P0口 CLR CS0 ;点亮个位数码管
关闭数码显示器 MOV DSW,#01H ;扫描指针指向下十位 RET
根据扫描循环变量(DSW)转移 DIS1: …… ;扫描十位数码管
(DSW)=0 DIS2: …… ;扫描百位数码管
扫描个位数码管 DIS3: …… ;扫描千位数码管
DIS4: MOV A,DSB4 ;扫描指示灯 (DSW)=1 扫描十位数码管 CPL A
MOV P0,A (DSW)=2 CLR CS4 扫描百位数码管 MOV DSW,#00H
(DSW)=1 RET 扫描千位数码管 ;====LED段码表====
(DSW)=2 LED7: DB 0C0H,…… ;0~9,a~f共16个七段码 扫描指示灯 3. 键去抖动的软件处理方法
在实验二中,我们还观察到以下两现象,其一
返回 是,点击SW1和SW2键时,单片机有时可检测到按键,有时检测不到按键;其二是,点击一次按键时,图3.4:5位LED数码管动态单片机有时会检测到多次按键。前者是由于在实验显示子程序流图 二的“循环速度可键控循环灯”项目中,每换一盏
键状态 原始键状态 灯主程序循环一次,读一次键状态,当循环时间较
长时(超过点出按键时间),将漏过键状态变化,若
去抖后采用图3.3所示的主程序循环,每5mS读一次键状
键状态 态,本问题将得到解决。后者是由于键的抖动,所有的按键在按下的初始时间段内,触点未达到稳定
t 20mS 接触,连接按键的端口的电平不稳定,CPU读到的
键状态稳定 键状态不稳定,此即所谓的键抖动,如图3.5所示,键按下时刻 通常键抖动发生在键按下的最初20mS内。键去抖动图3.5:键抖动及处理 处理方法有多种,软件延时去抖是最常用的方法,
其算法原理是CPU一旦检测到键状态有变化表明有键按下,延时一段时间(不小于20mS)后,待键状态稳定后,再读取有效的键状态。
在内部RAM指定1字节用于保存键状态,记为KEY,该字节应是可位寻址,以便主程序对键状态的查询;另指定1字节作为键去抖延时器,记为KTMR。若采用图3.3所示的主程序循环,由于系统每5mS调用一次读键状态及去抖处理子程序,因此每次读键状态后,先暂存键状态,若键状态发生变化则启动去抖延时器(实际是记录子程序调用次数,每调用1次相当5mS),延时未到则放弃不稳定的键状态,仍延用原来的键状态;若延时已到则启用新的键状态,键去抖算法如图3.6所示。
在一个微机系统中,按键可以有两种用法。其一是不论键按下有多久,按一下只
13
单片机原理实验
起一次作用,这种按键是键状态变化的前沿起作用,不妨将这种键称为前沿型 (或触发型) 键。其二是键只在按下时才有作用,一旦键松开其作用也消失,不妨称这种键为开关型键。如前所述KEY保存键状态,它保存的是开关型的键状态(按下为1,抬起为0),因此在读键状态及处理子程序中添加了键状态变化前沿提取功能,前沿提取算法如下:若前后两次键状态有变化(异或为1),且本次键状态也为1,则表明键状态发生了正跃变。在内部RAM中另指定1字节用于保存
读键、转正逻辑 前沿型的键状态,记为EKEY。
新的键状态暂存 ;====读独立按键子程序(延时去抖)====
RDKEY: ORL P1,#0C0H ;先置1,后读口
去抖延 MOV A,P1 ;读键 N 键状态变? 时器加 ANL A,#0C0H ;接独立键盘的位保留
载初值 Y XRL A,#0C0H ;求反转正逻辑
Y MOV R7,A ;新的键状态暂存R7
过了延时 CJNE A,KEY,RDK0 ;键状态变化则转移
时间? MOV KTMR,#05H ;去抖延时器加载初值
N SJMP RDK1
放弃不稳定的键状RDK0: MOV A,KTMR ;过了延时时间?
态、延用原键状态 JZ RDK1
DEC KTMR ;延时未结束 MOV R7,KEY ;放弃不稳定的键状态
键前沿提取 RDK1: MOV A,KEY ;键前沿提取
启用新的键状态 XRL A,R7 ANL A,R7
返回 MOV EKEY,A MOV KEY,R7 ;启用键的新状态 图3.6:读键状态及去抖等处理 RET 子程序流图
4. 模块化程序设计方法
实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示等。采用模块化的程序设计方法,有以下优点:
①单个模块程序的功能单一,易于编写、调试和修改;
②便于分工,可使多个程序员同时进行程序的编写和调试,加快软件研制进度; ③程序可读性好,便于功能扩充和版本升级;
④对程序的修改可局部进行,其他部分可以保持不变;
⑤对于使用频繁的子程序可以建立子程序库,便于移植到其它工程项目中。 在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,将一些专用的子任务交由下一级子模块完成,按这种方法一直细分成易于理解和实现的小模块为止。模块的划分应遵循下述原则:
14
单片机原理实验
①每个模块应具有独立的功能,完成一个明确的任务。
②模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换的频繁程度。
③模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,也不合适。
例,如图3.3所示程序结构框架,可将模块分成主程序、初始化模块、读键状态及去抖处理子程序、数码管动态扫描显示子程序4个模块。采用汇编语言编程时,主程序清单如下(文件名MAIN.ASM): ;====变量定义段==== CS0 BIT P2.0 ;个位位选 CS1 BIT P2.1 ;十位位选 CS2 BIT P2.2 ;百位位选 CS3 BIT P2.3 ;千位位选 CS4 BIT P2.4 ;LED灯位选 DSW EQU 30H ;位选计数 DSB0 EQU 31H ;显示缓冲单元个位 DSB1 EQU 32H ;显示缓冲单元十位 DSB2 EQU 33H ;显示缓冲单元百位 DSB3 EQU 34H ;显示缓冲单元千位 DSB4 EQU 20H ;显示缓冲单元指示灯状态 LD1 BIT DSB4.0 ;指示灯LD1控制位 ???? ;指示灯LD2~7控制位 LD8 BIT DSB4.7 ;指示灯LD8控制位 KEY EQU 21H ;键状态字 SW1 BIT KEY.6 ;SW1键 SW2 BIT KEY.7 ;SW2键 EKEY EQU 22H ;键前沿字 ESW1 BIT EKEY.6 ;SW1键前沿 ESW2 BIT EKEY.7 ;SW2键前沿 KTMR EQU 35H ;键去抖延时器 ;================== ORG 0000H LJMP MAIN ORG 0030H
MAIN: INCLUDE \添加初始化模块 MLOOP: LCALL DELAY ;延时5ms LCALL RDKEY ;读键
15
单片机原理实验
LCALL DISP ???? ;主程序中的其它任务 M05: LJMP MLOOP
;====延时子程序(2*R7+3)*R6+5=5ms==== DELAY: MOV R6,#0AH DL01: MOV R7,#0F8H DL02: DJNZ R7,DL02 DJNZ R6,DL01 RET
;====通用子程序段==== INCLUDE \ ;添加读键状态及去抖处理子程序 INCLUDE \ ;添加数码管动态扫描显示子程序
END
与高级语言编程不同,当用汇编语言编程时,程序员必须对CPU资源进行统筹规划,因此在主程序的开始处必须有变量定义段,该段中包含IO口定义、所有程序模块所用变量的定义。各程序模块、子程序中所用变量一般不使用各变量的地址,而使用变量的名称(或符号),将所有变量集中在主程序开始处定义,便于CPU资源的统筹规划、调整和修改。各模块、子程序均以文件形式单独编辑和调试,主程序使用
在上述程序清单中, 5mS延时子程序仅有5行,因此未将其作成1个独立模块。
四、 实验内容
1. 5位LED数码管动态显示驱动子程序设计 参照图3.4,将“实验原理2”的“5位LED数码管动态显示子程序”中用“??”表示的十、百、千位数码管扫描部分程序行、以及程序最后1行的七段码码表写完整。
建立工作文件夹“E:\\学号\\实验三”,启动“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑5位LED数码管动态显示子程序,编辑完成后,在工作文件夹中,以文件名“DISP.ASM”保存文件。
2. 独立键盘读键状态及去抖动处理子程序设计
点击“新建文件”快捷按钮,在打开的文件窗口中编辑“实验原理3”中的“读独立按键子程序(延时去抖)”,编辑完成后,在工作文件夹中,以文件名“RDKEY.ASM”保存文件。
3. 按键控制4位显示数码加减程序设计
以图3.3的框图为基础,设计1个工程项目,实现以下功能:①上电最初阶段完成下列操作(即初始化),设置内部RAM中60H~7FH单元为堆栈区,清除内部RAM中的20H~7FH单元,在LED数码显示器中显示“学号”的低4位1秒,之后清除5个显示缓冲单元(这样进入主循环后先显示0000)。②在主循环中“??”添加内容,以实现“每按1次SW1键,显示数值十进制加1,每按1次SW2键,显示数值十进制减1。”
功能②可按如下方法实现,在内部RAM中定义1个变量(比如记为,
16
单片机原理实验
无符号、双字节、压缩BCD码);当CPU查询到SW1键(前沿型),则十进制加1;当CPU查询到SW2键(前沿型),则十进制加9999(等价于减1);将加减1后的送入显示缓冲单元DSB3~0。
按工程项目的功能要求和上述算法,完成以下任务:①将图3.3的主程序流程画完整,写出完整的主程序清单;②用“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑主程序,编辑完成后,在工作文件夹中,以文件名“MAIN.ASM”保存文件,用同样方法建立初始化模块“INITIAL.ASM;③在工作文件夹中,以“PROJECT1”文件名创建工程项目,将MAIN.ASM添加到模块文件中,编译项目直至通过;④将编译通过的目标程序下载到实验板中,取下下载器,通电试运行;⑤若目标程序运行不能达到预期效果,用实验一、所述方法进行模拟仿真,查找算法、程序错误,再编译、下载、运行目标程序直至达到预期效果,完成调试。
五、 实验报告要求
实验报告要求写明实验目的,并提交以下内容。
1. 简述“按键控制4位显示数码加减程序设计”的控制算法原理,提交所有程序流图、汇编语言源程序清单。
2. 回答思考题。
六、 思考题
1. “按键控制4位显示数码加减程序设计”项目中,若查询SW1或SW2键时采用开关型键状态,会出现什么现象?可修改程序,在实验板中运行程序,观察现象。
2. 把5mS软件延时改用定时器/计数器定时,如何实现?并说明两种方法的优缺点。
17