(整理)单片机实验讲义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《微机应用实验》课程教学所做的基本实验
前言
需要说明的是,设置本实验课程的目的完全是为了培养读者的“计算机工程概念”,即学习如何用最短的时间和最少的花费,将实际问题转化成使计算机能够“做到并完成”的方法。
故读者在做每个实验之前,必须对所做实验的理论依据做出“形式化”的说明,只有在完全理解了这些依据的情况下,再进行实验才有意义。
以下是每个合格的计算机工程人员在工作时都必须遵守的五个基本步骤(或称为五条原则)。
步骤一.对所希望解决的问题做出“形式化”的描述(用术语说就是“无二义性”,因为早在微型计算机出现之前,就有人证明过“计算机无法解决‘二义性’的问题”这个定理);若别人已经对该问题做出了这样的描述,则应确实理解它。
步骤二.根据所解决的问题的特性与规模,建立该问题与计算机所能处理的对象(即数据)之间的相互对应关系,用术语说就是进行问题的“数据设计”。
需要特别说明的是,前两个步骤基本上与所使用的计算机系统(包括硬件和软件)无关。
步骤三.选择某一种(或几种)相应的程序设计语言(必要时还要选择或设计相应的机器硬件),将步骤一中“人对问题的形式化描述”,转化成“计算机对问题的快速处理”,而计算机的“处理对象”则由步骤二所确定。
用术语说就是进行问题的“程序代码设计”。
另外需要说明的是在动手编写具体的程序代码之前,应先做“确定设计目标”的工作。
即若编写的是子程序,就必须确定该子程序所处理的各种参数的形式和该子程序的“引用条件”;若编写的是程序,就必须确定该程序执行时所产生的现象、用户所做的操作和执行后所产生的结果等等。
步骤四.在各种特定的环境下,调试步骤三所编写的程序代码以保证其正确性。
步骤五.书写相应的“软件(或软件+硬件)使用说明”,注意这其实是步骤三中“确定设计目标”的简述。
值得注意的是,后三个步骤的“正确性”是建立在前两个步骤的“正确性”的基础之上的,没有前两个步骤,后面所做的全部工作都毫无意义(因为你的“出发点”就不对,即犯了
“南辕北辙”的错误)。
设立本实验课程的根本目的,就是培养读者如何来建立和应用前两条原则的思维方法,从而使自己成为真正的“计算机工程人员”。
以下是一个在计算机工程行业中“能够有所作为”的工程人员所达到的技术指标(设整个工程的工作量为100%)
设立本实验课程的根本目的,就是培养同学们如何来建立和应用前两条原则的思维方法,通过系列化(由浅入深)的软、硬件综合实验训练来提高自身的计算机硬件与系统应用水平、动手能力以及与硬件相关的软件编程与调试能力、使同学们掌握如下技能:(1)计算机系统典型硬件电路的原理、应用、与基本调成技术。
(2)典型计算机应用系统的结构、组成、配置与综合应用技能。
(3)典型的计算机系统检测、控制、通信等技术及面向对象的系统设计方法。
实验装置的使用方法
学习本课程时所做的全部实验,均在上海航虹高科技有限公司所生产的爱迪克(AEDK)教学实验仿真开发系统装置(以下简称为装置)上进行,所仿真的目标CPU为MCS-51系列的单片机,以下就是使用该装置的简要说明。
需要特别注意的是它只是前言里五个步骤中的第三和第四个步骤,故它只是“学习手段”而不是“学习目的”。
因为只有在“目的正确”的前提条件下,再去讨论“实现手段”才有意义。
1)在每次做实验之前,需要在用户硬盘上建立1个自己的子目录(文件夹),用于保存所做的全部实验结果。
需要注意的是必须且只需建立1个这样的子目录,其理由是若没有这样的子目录(或这样的子目录太多),用户将不容易找到自己以前所做的结果以继续工作。
注意子目录名称必须由“MS-DOS”操作系统所规定的文件字符所构成,且子目录名的字符个数不得超过8个,子目录扩展名(即子目录类型)的字符个数不得超过3个。
否则在执行源文件的“编译”操作时,会出现“The file not found”的错误通知信息。
故建议同学们使用自己学号的后3位数码作为子目录的名称,这样既容易记忆又不会重复。
另外还应准备一块自己的软盘,每当完成1次实验后,将自己所做的实验结果保存在软盘中做为备份。
2)双击“LCA51ET”图标,启动AEDK仿真控制程序,再单击“文件”图标,并选择自己的子目录。
3)进入自己的子目录后,若是新实验,选择“新建”操作,然后就可开始编写自己的程序代码,编写完毕并检查后,选择“另存为”操作,将结果用自己所容易记忆的名称保存起来,注意该文件的命名规则与上述的“子目录命名规则”一样,且必须使用“.ASM”作为所保存文件的“文件类型”;若是以前未完成的实验,应先将保存在软盘上的后备文件复制到自己的子目录中,再选择“打开”该文件并继续编写代码。
编写完毕并检查后,选择“保存”操作,将结果保存到到原来的文件之中去。
4)在编辑过程中,使用的是与编写普通文本文件一样的操作方法,故不再说明。
编辑完毕后,必须将结果保存在相应的文件中。
5)先根据连线要求,将相应的实验连线全部接好并检查无误后,打开仿真装置的电源,再
选择“编译”操作,若系统没有发现用户所编写的代码的“语法错误”,就会将所编写的源代码转换成机器语言代码并直接送入实验装置,之后用户就可开始以下的“运行调试”操作;否则会显示出相应的出错行号,用户可据此进行相应的修改操作,修改完毕后,重新编译自己的源代码。
6)目标代码被装入仿真装置后,系统会自动执行“总清"操作,即“复位”仿真装置,将“PC 指针”(屏幕显示为绿色的光带,它表示“将被执行的机器指令”)设置为0,之后用户就可用键盘或鼠标来控制相应的程序执行。
具体说明如下
a) 跟踪型单步(F7):即只执行1条机器指令后,就处于“暂停状态”(即让仿真软件获得“系统控制权”)。
若所执行的当前指令是“子程序调用”,就进入相应的子程序中,下一条将被执行的指令就是该子程序的第一条指令。
b) 通过型单步(F8):也是只执行1条机器指令,就处于“暂停状态”。
若所执行的当前指令是“子程序调用”,也将其作为1条指令对待,即下1条将被执行的就是该调用指令后面的那条机器指令。
c) 执行到光标所在处(F4):在使用本功能之前,用户可用键盘或鼠标将光标“定位”到希望“暂停”的位置。
启动该功能后,程序将执行到该位置后就“暂停”(注意其前提是该位置确实“能够到达”)。
d) 全速(F9):即将“系统控制权”完全交给用户编写的程序,若希望停止它,只能采用以下的“总清”手段。
e) 总清:这是停止处于“全速”运行的用户程序,重新使仿真软件获得“系统控制权”的唯一方法,有些资料又将其称为“矢折”处理,其方法是按下装置上的RST(即复位)按键。
f) 设置断点和清除断点:所谓“断点”可认为是用户在程序中设置的某种“暂停标志”,本装置所设置的断点用红色的光带表示。
当程序执行到该处时,就会处于“暂停状态”(此时光带将变成橙黄色),以便于观察某些特定的结果。
值得注意的是,虽然仿真硬件和软件提供了“允许设置多个断点”的功能,但建议用户只在所编写的程序中最多设置1个“断点”(故此时可用前述的“执行到光标所在处”的功能来代替“设置断点”的功能),这样做的目的是为了简化调试手段,避免产生不必要的错误。
另外需要注意的是“断点”一定要设置在机器指
令的头一个字节的位置上,否则会产生不可预料的结果。
g) 设置观察窗口:当用户希望看到程序执行时某些变量单元中数值的变化情况,首要条件就是在屏幕上设置1个“信息观察窗”,然后在该“窗口”中执行以下的“添加观察项”的操作,才能达到相应的目的。
h) 添加观察项目:上述的“设置观察窗口”只是使用户具备了观察变量内容的“前提条件”,而只有当用户使用“添加观察项”操作,将自己所希望观察的那些变量的名称“填写”到“观察窗口”中后,系统才会在处于“暂停”状态的时候,在观察窗口中显示出相应变量的内容。
7)当用户希望结束工作时,只要先单击“文件”图标,再单击该图标菜单中的“退出”图标,就可结束该仿真程序,返回Windows操作系统,然后将本次实验所编写的源程序代码复制到后备软盘上作为备份文件,最后删除建立在用户硬盘上的用户子目录。
第一节基本I/O操作
1. 设备基本特性介绍和对所要达到目的所做出的“形式化描述”
装置上有8只单色发光二极管(以下简称LED),将其编号为1~8#,每个LED驱动器对应于1个输入控制端,其名称为DL1~DL8,控制功能为“0灭1亮”。
还有8个钮子开关,也将其编号为1~8#,每个开关也对应于1个信号输出端,其名称为K1~K8,输出特性为“0下1上”(这里的“下”和“上”是指开关钮的位置)。
现要求实现“Ki为0=>LEDi熄灭,Ki 为1=>LEDi发光”的功能(i=1~8)。
2. 控制策略的制订
将8个钮子开关的输出信号K1~K8作为自变量(用符号K表示),再将8只LED驱动器的输入信号DL1~DL8作为K的函数(用符号DL表示),在确定了Ki与DLi(i=1~8)相互对应这个前提条件后,根据开关的输出特性和LED驱动器的输入特性,就可获得"DL=K"(注意这里的DL和K均为逻辑变量)的数学描述公式。
3. K信号的输入和DL信号的输出
根据所学过的知识,我们使用装置上的74LS244三态门来输入K1~K8信号,对应的设备地址为KIN;用装置上的74LS273 8D触发器来输出DL1~DL8信号,对应的设备地址为LOUT。
再根据所要达到的目的,确定出使用以下的连线方法。
1) K1~K8接74LS244的PI0~PI7,其设备选择端“CS*”接编号为8000H的译码器输出端。
2) DL1~DL8接74LS273的PO0~PO7,其设备选择端“CS*”接编号为8100H的译码器输出端。
4. 程序代码的编写
由于需要编写具有独立执行功能的程序,故首要前提是确定出该程序执行时所出现的现象和用户所做的操作(即确定设计目标),否则一切都是“无的放矢”,现规定为一旦启动该程序,则当用户拨动K1~K8这8个纽子开关时,与其对应的DL1~DL8这8只LED就会按
照上述规则产生相应的变化,再根据前面制订的控制策略,才能编写出如下的程序代码。
ORG 0
LJMP START ;进入主程序
ORG 30H
KIN EQU 80H ;定义输入设备地址的高8位数值
LOUT EQU 81H ;定义输出设备地址的高8位数值
START: MOV P2, #KIN ;从输入设备上获得K信号
MOVX A, @R0
MOV P2, #LOUT ;并将其作为DL传送到输出设备上去
MOVX @R0, A
SJMP START ;重复上述操作
END
注意:若你是个“合格的计算机工程人员”,则编写上述代码所花费的时间就不超过前3个步骤所花费时间的1/3。
故初学者千万不要将自己的主要精力都花费在“程序代码设计”上了,这可是犯了计算机工程学上的大忌讳。
习题:
1.根据厂家提供的装置设备译码器的图纸,用16位2进制数的形式(请回答为什么要使用这种形式的数据而不是使用其它形式的数据),写出使该译码器各输出端输出“有效信号”的“设备地址”,即给出使这些输出端输出“有效信号”的“充分必要”条件。
2.根据厂家提供的用钮子开关作为数字信号输入的“输入驱动”电路和用74LS244三态门构成的数字信号输入接口电路的图纸,说明为什么在使用“将K1~K8接74LS244的PI0~PI7,其设备选择端‘CS*’接编号为8000H的译码器输出端”这个连线方法的前提下,执行MOV P2, #80H
MOVX A, @R0
的指令序列后,能够“读取”输入开关的“状态”(即确定出每个输入开关所处的“0/1”位置)?
3.根据厂家提供的用74LS240作为输出驱动器,驱动LED1—LED8的“输出驱动”电路和
用74LS273 8D触发器构成的数字信号输出接口电路的图纸,说明为什么在使用“将DL1~DL8接74LS273的PO0~PO7,其设备选择端‘CS*’接编号为8100H的译码器输出端”这个连线方法的前提下,执行
MOV P2, #81H
MOV A, <点灯数据>
MOVX @R0, A
的指令序列后,能够按照“点灯数据”中的“0灭1亮”规则来确定每个输出LED的“发光/熄灭”状态?
4.使用制作电路板的CAD软件,绘制出本接口实验“设备侧”的原理图纸。
5.若不是使用74LS273 8D触发器作为输出(或不用74LS244三态门作为输入),而是使用系统P1口的P1.0~P1.7来作为相应的输出(或输入)接口,但仍然使用与实验中同样的“处理策略”,请给出相应的连线方法并编写出相应的程序代码。
6.若要求实现“Ki为0=>LEDi发光,Ki为1=>LEDi熄灭”的功能(i=1~8),请制订出相应的控制策略并编写出相应的程序代码。
7.若要求实现“K1为0=>LED8发光,...,K8为0=>LED1发光”和“K1为1=>LED8熄灭,...,K8为1=>LED1熄灭”的功能,请制订出相应的控制策略并编写出相应的程序代码。
第二节顺序控制方式的实现
所谓顺序控制,就是将整个控制过程划分成多个不同的时间间隔(术语称为时段),然后在每个时段中只做1个特定的动作,如十字路口的定时交通灯就是1个典型的例子,我们的实验要求就是利用装置上的双色发光二极管来模拟“定时交通信号灯控制(带专用车)”,为达到这个目的,将整个过程划分成以下的4个阶段。
阶段1. 对所要达到目的做出“形式化描述”
在进行该任务之前,应先形式化地说明定时交通红绿灯的运行规则,现设想有一个十字路口,东西方向为主线,南北方向为支线,主线上绿灯的持续时间为T1秒,支线上绿灯的持续时间为T4秒,当主线或支线上的绿灯转换为红灯前,使用闪烁黄灯的方法过渡,且黄灯的闪烁方式为T2秒亮,T3秒灭,次数为N次,故可将一个点灯周期分成4个时段,详情见下表:
时段编号: 1 2 3 4
主线状态:
支线状态:红灯红灯绿灯过渡(N2×(T2+T3)) 以上只是对于“正常情况”时所使用的规则,如果遇到“异常情况”(如十字路口要通过载有急救病人的救护车或去执行救火任务的消防车等专用车辆),就需要暂时停止主线与支线两个方向的车辆运行,其方法是同时在主线和支线上亮红灯(持续时间为T5),等专用车辆通过十字路口后,再恢复原来的运行规则。
阶段2. 模拟部件设计和部件特性介绍
由于我们是在做模拟实验,故不可能也没必要使用真正的交通灯来进行实验,现使用装置上的4只双色发光二极管(以下简称DLED)分别模拟安装在东、西、南、北4个路口上的4只交通灯,用一个纽子开关来模拟“有专用车通过”的“请求信号”,这就是所谓的“模拟部件设计”工作,即使用与真实部件“说明效果等价”的“模拟部件”来达到同样的“效果说
明”目的。
装置上每只DLED驱动器对应有2个输入控制端DR和DG,控制功能如下:
阶段3. 制订处理策略并确定处理对象,将实际问题转化为能用计算机来做的工作,即进行数据设计
我们用一个并行输出口的D0~D3位的数据控制代表支线信号的2只DLED,D4~D7位的数据控制代表主线信号的2只DLED,控制策略为“偶绿奇红”和“0有1无”,这就将问题转化成了在规定的时段内向I/O接口输出特定数据的问题了,由此可得出以下的“点灯数据”表(在括号中的数据表示与该2进制数值所对应的16进制数据)
时段1的数据只有1个,其数值为10100101(A5),保持时间为T1秒。
时段2的数据有N1组,每组2个,第1个为00000101(05),保持时间为T2秒;第2个为11110101(F5),保持时间为T3秒。
时段3的数据也只有1个,其数值为01011010(5A),保持时间为T4秒。
时段4的数据有N2组,每组2个,第1个为01010000(50),保持时间为T2秒;第2个为01011111(5F),保持时间为T3秒。
对于“专用车通过”这个问题,可使用“中断”的方式来解决,即将“有专用车通过"作为系统的“中断信号”,系统一旦收到该“中断请求”,就在主线和支线上均“点亮红灯”,并在持续T5时间后,再恢复“原来的点灯顺序”。
下一个问题是如何保证每个时段的“定时精度”,我们可给出一个确定的数值T,它是上述5个持续时间T1~T5的公约数,再编写一个延时时间为T的子程序DELAY,用Di=Ti/T(i=1~5)作为“引用次数”去调用DELAY子程序,就可达到相应的“延时效果”。
我们将“获取”上述4个时段所用的“点灯数据”和T、D1~D5这些“延时数据”的过
程,称为“数据设计”工作,即根据所希望解决问题的规模和特性,确定在计算机中应使用什么样的“处理对象”(即数据)。
它是以下的程序代码编写工作的出发点。
阶段4. 设备连线和程序代码的编写
如果将所要解决的问题视为“完成某项任务”,则上述的阶段1是使人明确自己要“做什么”,阶段2和阶段3是使人明确自己“应该如何做”,而本阶段就是“做具体工作”。
显然如果没有前3个阶段做为前提条件,就想“做具体工作”,是不可能“完成任务”的。
这就是每个希望成为“设计人”的读者所必须遵守的“黄金原则”。
1) 连线方法
装置上有4只DLED,其名称为HL1~HL4,根据阶段3(即数据设计阶段)所制订的策略,将74LS273 8D触发器的PO2、PO0接到作为南、北路口的4#和1# DLED驱动器的DG控制端,PO3、PO1接DR控制端;将PO6、PO4接到作为东、西路口的3#和2# DLED驱动器的DG控制端,PO7、PO5接DR控制端,将74LS273的“CS*选择端”接编号为8100H的译码输出;将8031的P3.2(即INT0*)接到K1纽子开关的信号输出端上,并将其拨到“1”位置。
2) 由于我们编写的是具有独立执行功能的程序,故在编写它之前,首先要确定该程序执行时所出现的现象和用户所做的操作。
现规定为一旦启动该程序,4只DLED将按照上述的规律发光,若希望产生“专用车通过”条件,只要将K1开关拨一个来回,4只DLED就均变成红色,并在持续T5时间后恢复原来的状态。
为完成代码编写工作,应确定上述的T、T1~T5、N1、N2这些数值,现规定T1=T4=T5=10S,T2=T3=0.5S,N1=N2=5,注意这并不完全模拟“实际情况”,主要考虑到人的“耐性”,然后就可编写出如下的程序代码
ORG 0
LJMP START ;进入主程序
LJMP INTOP ;进入0#外部中断服务程序
ORG 30H
ODAT EQU 81H ;定义输出设备地址的高8位
VR5 EQU 1DH ;定义点灯数据暂存单元
DELAY: MOV R6, #0 ;100ms延时子程序
DE1: MOV R7, #179
DJNZ R7, $
DJNZ R6, DE1
RET
INTOP: PUSH ACC ;0#外部中断服务程序,保存所用寄存器
PUSH PSW
PUSH DPH
ORL PSW, #18H ;选择3#工作寄存器组
MOV DPH, #ODAT ;将主线和支线均设置为红灯
MOV A, #55H
MOVX @DPTR, A
MOV R4, #100 ;延时10S
IT01: ACALL DELAY
DJNZ R4, IT01
MOV A, R5 ;恢复原来灯色
MOVX @DPTR, A
POP DPH ;恢复所用寄存器
POP PSW
POP ACC
RETI ;返回中断点
DAT DB 0A5H ;时段1的1个点灯数据
DB 05H, 0F5H, 05H, 0F5H, 05H, 0F5H, 05H, 0F5H, 05H, 0F5H ;时段2的10个点灯数据
DB 5AH ;时段3的1个点灯数据
DB 50H, 5FH, 50H, 5FH, 50H, 5FH, 50H, 5FH, 50H, 5FH ;时段4的
10个点灯数据
TIM DB 100 ;时段1的1个延时数据
DB 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 ;时段2的10个延时数据
DB 100 ;时段3的1个延时数据
DB 5, 5, 5, 5, 5, 5, 5, 5, 5 ,5 ;时段4的10个延时数据
VMAX EQU 22 ;点灯和延时数据的总组数
START: SETB IT0 ;主程序,将0#外部中断设置为下降沿触发方式MOV IE, #81H ;开放0#外部中断
MOV P2, #ODAT ;加载输出设备地址
ST0: MOV R5, #0 ;初始化数据指针
ST1: MOV DPTR, #DAT ;获得
MOV A, R5
MOVC A, @A+DPTR
MOV VR5, A ;暂存
MOVX @R0, A ;并传送1个点灯数据
MOV DPTR, #TIM ;获得1个延时数据
MOV A, R5
MOVC A, @A+DPTR
MOV R4, A ;延迟相应的时间
ST2: ACALL DELAY
DJNZ R4, ST2
INC R5 ;增量数据指针
CJNE R5, #VMAX,ST1 ;判是否处理完了全部数据,若未完就再处理下一组
SJMP ST0 ;完了,重新再来
END
注意:若你是个“合格的计算机工程人员”,则编写上述代码所花费的时间就不超过前3个阶
段所花费时间的1/3。
附:延时子程序DELAY中“延时参数”的确定方法
执行如下的延时程序段(“;”后面的数值表示执行该条指令所用的时间,以机器周期为单位) MOV Ra, #V1 ; 1
LOP:MOV Rb, #V2 ; 1
DJNZ Rb, $ ; 2
DJNZ Ra, LOP ; 2
所需要的时间T=(2×V2+1+2)V1+1 (1≤V1≤256,1≤V2≤256)。
当V1=V2=256时,最大延迟时间Tmax=131841个机器周期,由于本装置使用的是11.0592MHz的振荡晶体,将Tmax 折算成实际时间=131841×12/11059200≈143ms;类似当V1=V2=1时,最小延迟时间Tmin=6个机器周期。
当需要延迟规定的时间(用符号Tw表示,Tmin≤Tw≤Tmax),可在先确定V2的前提下,用公式
V1=(Tw-1)/(2×V2+3) (1)
算出V1的数值,或在先确定V1的前提下,用公式
V2=((Tw-1)/V1-3)/2 (2)
算出V2的数值,注意这里的Tw必须用机器周期作为单位。
例如若需要100ms的延迟时间,先将100ms折算成机器周期数并确定V1=256,再利用公式(2),就可得出
V2=((100×1000×11.0592/12-1)/256-3)/2≈179
习题:
1.使用制作电路板的CAD软件,绘制出本接口实验“设备侧”的原理图纸。
2.要求使用第一节中所说明的装置上的8只单色发光二极管LED1~LED8,完成以下的4个时段实验
1#时段:分成以下8个子时段1.1~1.8,子时段周期为0.5秒。
在子时段1.1中,LED1发光;…;在子时段1.8中,LED8发光。
2#时段:分成以下4个子时段2.1~2.4,子时段周期为0.8秒。
在子时段2.1中,LED1、2发光;…;在子时段2.4中,LED7、8发光。
3#时段:分成以下2个子时段3.1和3.2,子时段周期为1秒。
在子时段3.1中,LED1、2、3、4发光;在子时段3.2中,LED5、6、7、8发光。
4#时段:分成以下2个子时段4.1和4.2,子时段周期为1.2秒。
在子时段4.1中,LED1、3、5、7发光;在子时段4.2中,LED2、4、6、8发光。
当系统从1#时段开始,到4#时段的任务完成后,重新从1#时段开始工作。
请完成相应的“策略制订”工作,并编写出相应的可执行程序在装置上通过执行。
3.若在习题2中增加以下的“异常情况”
1) 在任务开始时刻,将装置上的1# DLED设置为“不发光”的状态(可利用系统的P1口来完成该工作)。
2) 一旦出现“异常情况”的“中断请求”,系统将执行以下的操作
a. 熄灭全部单色LED。
b. 将1# DLED设置为红色,保持时间为1.5秒。
c. 将1# DLED设置为黄色,保持时间为2.2秒。
d. 将1# DLED设置为绿色,保持时间为3.1秒。
e. 恢复原来单色LED的状态,并重新将1# DLED设置为“不发光”状态。
请完成相应的“策略制订”工作,并编写出相应的可执行程序在装置上通过执行。
第三节使用MCS-51片内定时器的中断来完成延时操作
实验1:中断方式控制LED发光
在第二节的实验中,虽然可使用与DELAY程序类似的“软件方法”来达到延时的效果,但使用该方法所存在的一个问题是此时CPU的绝大多数时间都是用于执行延时程序的“等待操作”,而不能去做其它的事情。
这就象一个人坐在办公室里等着来电话而不做任何其它事情。
显然这不是一个好办法。
为解决这个问题,最方便的方法就是利用“定时器中断”的手段,在这里我们并不讲述它的原理,而只用以下的简单实验来说明如何应用这种方法。
在做实验前,首要条件就是“确定实验任务”,现规定为将系统的一个工作周期分为以下12个时段,每个时段的持续时间为1.5秒,所做的工作为按照以下规则点亮装置上的8只单色发光二极管LED1~LED8
时段1 :点亮LED1和LED2;
时段2 :点亮LED3和LED4;
时段3 :点亮LED5和LED6;
时段4 :点亮LED7和LED8;
时段5 :点亮LED1和LED8;
时段6 :点亮LED2和LED7;
时段7 :点亮LED3和LED6;
时段8 :点亮LED4和LED5;
时段9 :点亮LED1和LED5;
时段10:点亮LED2和LED6;
时段11:点亮LED3和LED7;
时段12:点亮LED4和LED8。
与第二节的实验类似,我们将74LS273的PO0~PO7接DL1~DL8,将它的“选择信号CS*”
接编号为8100H的译码输出端,再根据第二节中讲述的“点灯规则”,就可得出如下的点灯数据
LEDDAT DB 3, 0CH, 30H, 0C0H, 81H, 42H, 24H, 18H, 11H, 22H, 44H, 88H 根据所学过的知识,我们知道当MCS-51的片内定时/计数器以定时器方式工作时,定时间隔T、定时数据D t、机器周期M t三者之间有以下关系式成立
T=D t×M t(1)
而当其按方式1(16位定时器)工作时,最大定时间隔Tmax=65536×M t,由于在本装置上所使用的晶体振荡器的频率为11.0592MHz,故Tmax=65536×12/11059.2≈71ms,而这是不能满足实验要求的,故需要使用“软硬结合”的方法,即在管理定时器中断的中断服务程序中设置“软件计数器”,例如要达到1.5秒的定时效果,可先为系统设置50ms的中断间隔,再定义1个8位的存储单元作为“软件计数器”,在开始时将其清除为0,之后每来一次定时器中断,就将该存储单元的内容加1,当其内容变为1500/50=30的时候,就表示本次定时时间到达。
再根据前面的公式(1),可得出以下计算定时数据D t和编程数据P t (即传送到Thi:Tli (i=0或1)中的数值)的公式
D t=T/M t(2)
P t=65536-D t(3)
如在本实验中T=50ms,M t=12/11059.2ms,故D t=50×11059.2/12=46080,P t=65536-46080=19456,若使用0#定时/计数器作为定时器来使用,则TH0的编程数据=19456/256=76,TL0的编程数据=19456 mod 256=0。
使用上述方法,再利用前面所获得的数据,就可编写出如下的程序代码
ORG 0
LJMP START ;主程序入口
ORG 0BH
LJMP T0INT ;0#定时器中断服务程序入口
ORG 30H
OLED EQU 81H ;定义“点灯数据”的输出设备地址的高8位。