单片机原理实验
①每个模块应具有独立的功能,完成一个明确的任务。
②模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换的频繁程度。
③模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,也不合适。
例,如图3.3所示程序结构框架,可将模块分成主程序、初始化模块、读键状态及去抖处理子程序、数码管动态扫描显示子程序4个模块。采用汇编语言编程时,主程序清单如下(文件名MAIN.ASM): ;====变量定义段==== CS0 BIT P2.0 ;个位位选 CS1 CS2 CS3 CS4 DSW DSB0 DSB1 DSB2 DSB3
BIT P2.1 BIT P2.2 BIT P2.3 BIT P2.4 EQU 30H EQU 31H EQU 32H EQU 33H EQU 34H
;十位位选 ;百位位选 ;千位位选 ;LED灯位选 ;位选计数
;显示缓冲单元个位 ;显示缓冲单元十位 ;显示缓冲单元百位 ;显示缓冲单元千位
DSB4 EQU 20H ;显示缓冲单元指示灯状态 LD1 BIT DSB4.0 ;指示灯LD1控制位 ???? ;指示灯LD2~7控制位 LD8 BIT DSB4.7 ;指示灯LD8控制位 KEY EQU 21H ;键状态字 SW1 BIT KEY.6 SW2 BIT KEY.7
;SW1键 ;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 ;读键
15
LCALL RDKEY
单片机原理实验
LCALL DISP ????
;主程序中的其它任务
M05:LJMP MLOOP
;====延时子程序(2*R7+3)*R6+5=5ms==== DELAY: MOV R6,#0AH DL01: DL02:
MOV R7,#0F8H 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
单片机原理实验
实验四、定时器应用实验
――LED数码显示与矩阵键盘赋值程序设计
一、
实验目地
1. 掌握定时器/计数器定时设计方法。
2. 掌握矩阵键盘工作原理及读矩阵键盘和去抖程序设计方法。 3. 掌握LED数码显示与矩阵键盘赋值程序设计方法。
4. 进一步学习模块化的程序设计方法,掌握状态及其转移分析方法。
二、 实验设备
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的每个键均接独立K11ROW2接1条IO口,当系统所需按键较多,若每个按键均占用1条IO端口,则按键占用的CPU资源过多,系统实现难度较大。 解决上述问题的方法可以采用矩阵键盘电路。图4.1是3*4矩阵键盘电路,其中K0~
18
K10K6K2CS2K9K5K1CS1K8K4K0CS0ROW1ROW0K7K3CS3图4.1:3*4矩阵键盘电路 单片机原理实验
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个独立按键的状态也并入这2个字节中。这样,矩阵键盘和独立按键的读键状态及去抖处理子程序框仍可延用图3.6的流图,只需将图3.6中第一个功能框“读键、转正逻辑、新的键状态暂存”可细化,如图4.2所示。部分程序如下:
;====读矩阵、独立按键子程序(延时去抖)==== RDKEY: ORL P2,#0FFH ;关闭LED数码显示器
CLR ROW0 NOP NOP 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
关闭数码显示器 扫描0行按键
;ROW0=0,扫描K0~3键
;延时,键盘线越长延时越长
????