片机实验讲义Word版

上传人:沈*** 文档编号:90596481 上传时间:2022-05-15 格式:DOC 页数:157 大小:311KB
收藏 版权申诉 举报 下载
片机实验讲义Word版_第1页
第1页 / 共157页
片机实验讲义Word版_第2页
第2页 / 共157页
片机实验讲义Word版_第3页
第3页 / 共157页
资源描述:

《片机实验讲义Word版》由会员分享,可在线阅读,更多相关《片机实验讲义Word版(157页珍藏版)》请在装配图网上搜索。

1、微机应用实验课程教学所做的基本实验前 言 需要说明的是,设置本实验课程的目的完全是为了培养读者的“计算机工程概念”,即学习如何用最短的时间和最少的花费,将实际问题转化成使计算机能够“做到并完成”的方法。故读者在做每个实验之前,必须对所做实验的理论依据做出“形式化”的说明,只有在完全理解了这些依据的情况下,再进行实验才有意义。以下是每个合格的计算机工程人员在工作时都必须遵守的五个基本步骤(或称为五条原则)。步骤一. 对所希望解决的问题做出“形式化”的描述(用术语说就是“无二义性”,因为早在微型计算机出现之前,就有人证明过“计算机无法解决二义性的问题”这个定理);若别人已经对该问题做出了这样的描述

2、,则应确实理解它。步骤二. 根据所解决的问题的特性与规模,建立该问题与计算机所能处理的对象(即数据)之间的相互对应关系,用术语说就是进行问题的“数据设计”。需要特别说明的是,前两个步骤基本上与所使用的计算机系统(包括硬件和软件)无关。步骤三. 选择某一种(或几种)相应的程序设计语言(必要时还要选择或设计相应的机器硬件),将步骤一中“人对问题的形式化描述”,转化成“计算机对问题的快速处理”,而计算机的“处理对象”则由步骤二所确定。用术语说就是进行问题的“程序代码设计”。另外需要说明的是在动手编写具体的程序代码之前,应先做“确定设计目标”的工作。即若编写的是子程序,就必须确定该子程序所处理的各种参

3、数的形式和该子程序的“引用条件”;若编写的是程序,就必须确定该程序执行时所产生的现象、用户所做的操作和执行后所产生的结果等等。步骤四. 在各种特定的环境下,调试步骤三所编写的程序代码以保证其正确性。步骤五. 书写相应的“软件(或软件+硬件)使用说明”,注意这其实是步骤三中“确定设计目标”的简述。 值得注意的是,后三个步骤的“正确性”是建立在前两个步骤的“正确性”的基础之上的,没有前两个步骤,后面所做的全部工作都毫无意义(因为你的2 / 157“出发点”就不对,即犯了“南辕北辙”的错误)。设立本实验课程的根本目的,就是培养读者如何来建立和应用前两条原则的思维方法,从而使自己成为真正的“计算机工程

4、人员”。以下是一个在计算机工程行业中“能够有所作为”的工程人员所达到的技术指标(设整个工程的工作量为100%)步骤占用工作量一和二40%三10%15%四和五45%50%设立本实验课程的根本目的,就是培养同学们如何来建立和应用前两条原则的思维方法,通过系列化(由浅入深)的软、硬件综合实验训练来提高自身的计算机硬件与系统应用水平、动手能力以及与硬件相关的软件编程与调试能力、使同学们掌握如下技能:(1)计算机系统典型硬件电路的原理、应用、与基本调成技术。(2)典型计算机应用系统的结构、组成、配置与综合应用技能。(3)典型的计算机系统检测、控制、通信等技术及面向对象的系统设计方法。实验装置的使用方法学

5、习本课程时所做的全部实验,均在上海航虹高科技有限公司所生产的爱迪克(AEDK)教学实验仿真开发系统装置(以下简称为装置)上进行,所仿真的目标CPU为MCS-51系列的单片机,以下就是使用该装置的简要说明。需要特别注意的是它只是前言里五个步骤中的第三和第四个步骤,故它只是“学习手段”而不是“学习目的”。因为只有在“目的正确”的前提条件下,再去讨论“实现手段”才有意义。1) 在每次做实验之前,需要在用户硬盘上建立1个自己的子目录(文件夹),用于保存所做的全部实验结果。需要注意的是必须且只需建立1个这样的子目录,其理由是若没有这样的子目录(或这样的子目录太多),用户将不容易找到自己以前所做的结果以继

6、续工作。注意子目录名称必须由“MS-DOS”操作系统所规定的文件字符所构成,且子目录名的字符个数不得超过8个,子目录扩展名(即子目录类型)的字符个数不得超过3个。否则在执行源文件的“编译”操作时,会出现“The file not found”的错误通知信息。故建议同学们使用自己学号的后3位数码作为子目录的名称,这样既容易记忆又不会重复。另外还应准备一块自己的软盘,每当完成1次实验后,将自己所做的实验结果保存在软盘中做为备份。2) 双击“LCA51ET”图标,启动AEDK仿真控制程序,再单击“文件”图标,并选择自己的子目录。3) 进入自己的子目录后,若是新实验,选择“新建”操作,然后就可开始编写

7、自己的程序代码,编写完毕并检查后,选择“另存为”操作,将结果用自己所容易记忆的名称保存起来,注意该文件的命名规则与上述的“子目录命名规则”一样,且必须使用“.ASM”作为所保存文件的“文件类型”;若是以前未完成的实验,应先将保存在软盘上的后备文件复制到自己的子目录中,再选择“打开”该文件并继续编写代码。编写完毕并检查后,选择“保存”操作,将结果保存到到原来的文件之中去。4) 在编辑过程中,使用的是与编写普通文本文件一样的操作方法,故不再说明。编辑完毕后,必须将结果保存在相应的文件中。5) 先根据连线要求,将相应的实验连线全部接好并检查无误后,打开仿真装置的电源,再选择“编译”操作,若系统没有发

8、现用户所编写的代码的“语法错误”,就会将所编写的源代码转换成机器语言代码并直接送入实验装置,之后用户就可开始以下的“运行调试”操作;否则会显示出相应的出错行号,用户可据此进行相应的修改操作,修改完毕后,重新编译自己的源代码。6) 目标代码被装入仿真装置后,系统会自动执行“总清操作,即“复位”仿真装置,将“PC指针”(屏幕显示为绿色的光带,它表示“将被执行的机器指令”)设置为0,之后用户就可用键盘或鼠标来控制相应的程序执行。具体说明如下a) 跟踪型单步(F7):即只执行1条机器指令后,就处于“暂停状态”(即让仿真软件获得“系统控制权”)。若所执行的当前指令是“子程序调用”,就进入相应的子程序中,

9、下一条将被执行的指令就是该子程序的第一条指令。b) 通过型单步(F8):也是只执行1条机器指令,就处于“暂停状态”。若所执行的当前指令是“子程序调用”,也将其作为1条指令对待,即下1条将被执行的就是该调用指令后面的那条机器指令。c) 执行到光标所在处(F4):在使用本功能之前,用户可用键盘或鼠标将光标“定位”到希望“暂停”的位置。启动该功能后,程序将执行到该位置后就“暂停”(注意其前提是该位置确实“能够到达”)。d) 全速(F9):即将“系统控制权”完全交给用户编写的程序,若希望停止它,只能采用以下的“总清”手段。e) 总清:这是停止处于“全速”运行的用户程序,重新使仿真软件获得“系统控制权”

10、的唯一方法,有些资料又将其称为“矢折”处理,其方法是按下装置上的RST(即复位)按键。f) 设置断点和清除断点:所谓“断点”可认为是用户在程序中设置的某种“暂停标志”,本装置所设置的断点用红色的光带表示。当程序执行到该处时,就会处于“暂停状态”(此时光带将变成橙黄色),以便于观察某些特定的结果。值得注意的是,虽然仿真硬件和软件提供了“允许设置多个断点”的功能,但建议用户只在所编写的程序中最多设置1个“断点”(故此时可用前述的“执行到光标所在处”的功能来代替“设置断点”的功能),这样做的目的是为了简化调试手段,避免产生不必要的错误。另外需要注意的是“断点”一定要设置在机器指令的头一个字节的位置上

11、,否则会产生不可预料的结果。g) 设置观察窗口:当用户希望看到程序执行时某些变量单元中数值的变化情况,首要条件就是在屏幕上设置1个“信息观察窗”,然后在该“窗口”中执行以下的“添加观察项”的操作,才能达到相应的目的。h) 添加观察项目:上述的“设置观察窗口”只是使用户具备了观察变量内容的“前提条件”,而只有当用户使用“添加观察项”操作,将自己所希望观察的那些变量的名称“填写”到“观察窗口”中后,系统才会在处于“暂停”状态的时候,在观察窗口中显示出相应变量的内容。7) 当用户希望结束工作时,只要先单击“文件”图标,再单击该图标菜单中的“退出”图标,就可结束该仿真程序,返回Windows操作系统,

12、然后将本次实验所编写的源程序代码复制到后备软盘上作为备份文件,最后删除建立在用户硬盘上的用户子目录。第一节 基本I/O操作1. 设备基本特性介绍和对所要达到目的所做出的“形式化描述” 装置上有8只单色发光二极管(以下简称LED),将其编号为18#,每个LED驱动器对应于1个输入控制端,其名称为DL1DL8,控制功能为“0灭1亮”。还有8个钮子开关,也将其编号为18#,每个开关也对应于1个信号输出端,其名称为K1K8,输出特性为“0下1上”(这里的“下”和“上”是指开关钮的位置)。现要求实现“Ki为0=LEDi熄灭,Ki为1=LEDi发光”的功能(i=18)。2. 控制策略的制订 将8个钮子开关

13、的输出信号K1K8作为自变量(用符号K表示),再将8只LED驱动器的输入信号DL1DL8作为K的函数(用符号DL表示),在确定了Ki与DLi(i=18)相互对应这个前提条件后,根据开关的输出特性和LED驱动器的输入特性,就可获得DL=K(注意这里的DL和K均为逻辑变量)的数学描述公式。3. K信号的输入和DL信号的输出 根据所学过的知识,我们使用装置上的74LS244三态门来输入K1K8信号,对应的设备地址为KIN;用装置上的74LS273 8D触发器来输出DL1DL8信号,对应的设备地址为LOUT。再根据所要达到的目的,确定出使用以下的连线方法。1) K1K8接74LS244的PI0PI7,

14、其设备选择端“CS*”接编号为8000H的译码器输出端。2) DL1DL8接74LS273的PO0PO7,其设备选择端“CS*”接编号为8100H的译码器输出端。4. 程序代码的编写 由于需要编写具有独立执行功能的程序,故首要前提是确定出该程序执行时所出现的现象和用户所做的操作(即确定设计目标),否则一切都是“无的放矢”,现规定为一旦启动该程序, 则当用户拨动K1K8这8个纽子开关时,与其对应的DL1DL8这8只LED就会按照上述规则产生相应的变化,再根据前面制订的控制策略,才能编写出如下的程序代码。ORG0LJMP START ;进入主程序ORG30HKINEQU80H;定义输入设备地址的高

15、8位数值LOUT EQU81H ;定义输出设备地址的高8位数值START:MOVP2, #KIN;从输入设备上获得K信号MOVX A, R0MOV P2, #LOUT;并将其作为DL传送到输出设备上去MOVX R0, ASJMP START;重复上述操作END注意:若你是个“合格的计算机工程人员”,则编写上述代码所花费的时间就不超过前3个步骤所花费时间的1/3。故初学者千万不要将自己的主要精力都花费在“程序代码设计”上了,这可是犯了计算机工程学上的大忌讳。习题:1. 根据厂家提供的装置设备译码器的图纸,用16位2进制数的形式(请回答为什么要使用这种形式的数据而不是使用其它形式的数据),写出使该

16、译码器各输出端输出“有效信号”的“设备地址”,即给出使这些输出端输出“有效信号”的“充分必要”条件。2. 根据厂家提供的用钮子开关作为数字信号输入的“输入驱动”电路和用74LS244三态门构成的数字信号输入接口电路的图纸,说明为什么在使用“将K1K8接74LS244的PI0PI7,其设备选择端CS*接编号为8000H的译码器输出端”这个连线方法的前提下,执行MOVP2, #80HMOVX A, R0的指令序列后,能够“读取”输入开关的“状态”(即确定出每个输入开关所处的“0/1”位置)?3. 根据厂家提供的用74LS240作为输出驱动器,驱动LED1LED8的“输出驱动”电路和用74LS273

17、 8D触发器构成的数字信号输出接口电路的图纸,说明为什么在使用“将DL1DL8接74LS273的PO0PO7,其设备选择端CS*接编号为8100H的译码器输出端”这个连线方法的前提下,执行MOVP2, #81HMOVA, MOVX R0, A的指令序列后,能够按照“点灯数据”中的“0灭1亮”规则来确定每个输出LED的“发光/熄灭”状态?4. 使用制作电路板的CAD软件,绘制出本接口实验“设备侧”的原理图纸。5. 若不是使用74LS273 8D触发器作为输出(或不用74LS244三态门作为输入),而是使用系统P1口的P1.0P1.7来作为相应的输出(或输入)接口,但仍然使用与实验中同样的“处理策

18、略”,请给出相应的连线方法并编写出相应的程序代码。6. 若要求实现“Ki为0=LEDi发光,Ki为1=LEDi熄灭”的功能(i=18),请制订出相应的控制策略并编写出相应的程序代码。7. 若要求实现“K1为0=LED8发光,.,K8为0=LED1发光”和“K1为1=LED8熄灭,.,K8为1=LED1熄灭”的功能,请制订出相应的控制策略并编写出相应的程序代码。第二节顺序控制方式的实现所谓顺序控制,就是将整个控制过程划分成多个不同的时间间隔(术语称为时段),然后在每个时段中只做1个特定的动作,如十字路口的定时交通灯就是1个典型的例子,我们的实验要求就是利用装置上的双色发光二极管来模拟“定时交通信

19、号灯控制(带专用车)”,为达到这个目的,将整个过程划分成以下的4个阶段。阶段1. 对所要达到目的做出“形式化描述” 在进行该任务之前,应先形式化地说明定时交通红绿灯的运行规则,现设想有一个十字路口,东西方向为主线,南北方向为支线,主线上绿灯的持续时间为T1秒,支线上绿灯的持续时间为T4秒,当主线或支线上的绿灯转换为红灯前,使用闪烁黄灯的方法过渡,且黄灯的闪烁方式为T2秒亮,T3秒灭,次数为N次,故可将一个点灯周期分成4个时段,详情见下表:时段编号: 1 2 3 4主线状态: 绿灯(T1) 过渡(N1(T2+T3) 红灯(T4) 红灯支线状态: 红灯 红灯 绿灯 过渡(N2(T2+T3) 以上只

20、是对于“正常情况”时所使用的规则,如果遇到“异常情况”(如十字路口要通过载有急救病人的救护车或去执行救火任务的消防车等专用车辆),就需要暂时停止主线与支线两个方向的车辆运行,其方法是同时在主线和支线上亮红灯(持续时间为T5),等专用车辆通过十字路口后,再恢复原来的运行规则。阶段2. 模拟部件设计和部件特性介绍 由于我们是在做模拟实验,故不可能也没必要使用真正的交通灯来进行实验,现使用装置上的4只双色发光二极管(以下简称DLED)分别模拟安装在东、西、南、北4个路口上的4只交通灯,用一个纽子开关来模拟“有专用车通过”的“请求信号”,这就是所谓的“模拟部件设计”工作,即使用与真实部件“说明效果等价

21、”的“模拟部件”来达到同样的“效果说明”目的。 装置上每只DLED驱动器对应有2个输入控制端DR和DG,控制功能如下:DRDG显示颜色00红+绿=黄01红10绿11不发光阶段3. 制订处理策略并确定处理对象,将实际问题转化为能用计算机来做的工作,即进行数据设计 我们用一个并行输出口的D0D3位的数据控制代表支线信号的2只DLED,D4D7位的数据控制代表主线信号的2只DLED,控制策略为“偶绿奇红”和“0有1无”,这就将问题转化成了在规定的时段内向I/O接口输出特定数据的问题了,由此可得出以下的“点灯数据”表(在括号中的数据表示与该2进制数值所对应的16进制数据)时段1的数据只有1个,其数值为

22、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时间后,再恢复“原来的点灯顺序”。

23、下一个问题是如何保证每个时段的“定时精度”,我们可给出一个确定的数值T,它是上述5个持续时间T1T5的公约数,再编写一个延时时间为T的子程序DELAY,用Di=Ti/T(i=15)作为“引用次数”去调用DELAY子程序,就可达到相应的“延时效果”。 我们将“获取”上述4个时段所用的“点灯数据”和T、D1D5这些“延时数据”的过程,称为“数据设计”工作,即根据所希望解决问题的规模和特性,确定在计算机中应使用什么样的“处理对象”(即数据)。它是以下的程序代码编写工作的出发点。阶段4. 设备连线和程序代码的编写 如果将所要解决的问题视为“完成某项任务”,则上述的阶段1是使人明确自己要“做什么”,阶段

24、2和阶段3是使人明确自己“应该如何做”,而本阶段就是“做具体工作”。显然如果没有前3个阶段做为前提条件,就想“做具体工作”,是不可能“完成任务”的。这就是每个希望成为“设计人”的读者所必须遵守的“黄金原则”。1) 连线方法 装置上有4只DLED,其名称为HL1HL4,根据阶段3(即数据设计阶段)所制订的策略,将74LS273 8D触发器的PO2、PO0接到作为南、北路口的4#和1# DLED驱动器的DG控制端,PO3、PO1接DR控制端;将PO6、PO4接到作为东、西路口的3#和2# DLED驱动器的DG控制端,PO7、PO5接DR控制端,将74LS273的“CS*选择端”接编号为8100H的

25、译码输出;将8031的P3.2(即INT0*)接到K1纽子开关的信号输出端上,并将其拨到“1”位置。2) 由于我们编写的是具有独立执行功能的程序,故在编写它之前,首先要确定该程序执行时所出现的现象和用户所做的操作。现规定为一旦启动该程序,4只DLED将按照上述的规律发光,若希望产生“专用车通过”条件,只要将K1开关拨一个来回,4只DLED就均变成红色,并在持续T5时间后恢复原来的状态。 为完成代码编写工作,应确定上述的T、T1T5、N1、N2这些数值,现规定T1=T4=T5=10S,T2=T3=0.5S,N1=N2=5,注意这并不完全模拟“实际情况”,主要考虑到人的“耐性”,然后就可编写出如下

26、的程序代码 ORG0 LJMP START;进入主程序 LJMPINTOP;进入0#外部中断服务程序 ORG30HODAT EQU 81H;定义输出设备地址的高8位VR5 EQU 1DH;定义点灯数据暂存单元DELAY:MOV R6, #0;100ms延时子程序DE1: MOV R7,#179 DJNZR7,$ DJNZR6,DE1 RETINTOP: PUSHACC;0#外部中断服务程序,保存所用寄存器 PUSHPSW PUSHDPH ORLPSW,#18H;选择3#工作寄存器组 MOV DPH,#ODAT;将主线和支线均设置为红灯 MOV A,#55H MOVX DPTR, A MOV R

27、4,#100;延时10SIT01: ACALL DELAY DJNZR4,IT01 MOV A, R5;恢复原来灯色 MOVX DPTR, A POP DPH;恢复所用寄存器 POP PSW POP ACC RETI;返回中断点DATDB 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个点灯数据TIMDB 100;时段1的

28、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 EQU22;点灯和延时数据的总组数START: SETBIT0;主程序,将0#外部中断设置为下降沿触发方式 MOVIE,#81H;开放0#外部中断 MOVP2,#ODAT;加载输出设备地址ST0: MOV R5,#0;初始化数据指针ST1: MOV DPTR,#DAT;获得 MOVA,R5 MOVC A,A+DPTR MOV VR5, A;暂存 MOVX R0,

29、A;并传送1个点灯数据 MOV DPTR,#TIM;获得1个延时数据 MOV A,R5 MOVCA,A+DPTR MOV R4,A;延迟相应的时间ST2: ACALL DELAY DJNZR4,ST2 INC R5;增量数据指针 CJNER5,#VMAX,ST1;判是否处理完了全部数据,若未完就再处理下一组 SJMPST0;完了,重新再来 END注意:若你是个“合格的计算机工程人员”,则编写上述代码所花费的时间就不超过前3个阶段所花费时间的1/3。附:延时子程序DELAY中“延时参数”的确定方法 执行如下的延时程序段(“;”后面的数值表示执行该条指令所用的时间,以机器周期为单位) MOVRa,

30、#V1; 1LOP: MOVRb,#V2; 1 DJNZ Rb,$; 2 DJNZ Ra,LOP; 2所需要的时间T=(2V2+1+2)V1+1 (1V1256,1V2256)。当V1=V2=256时,最大延迟时间Tmax=131841个机器周期,由于本装置使用的是11.0592MHz的振荡晶体,将Tmax折算成实际时间=13184112/11059200143ms;类似当V1=V2=1时,最小延迟时间Tmin=6个机器周期。当需要延迟规定的时间(用符号Tw表示,TminTwTmax),可在先确定V2的前提下,用公式V1=(Tw-1)/(2V2+3)(1)算出V1的数值,或在先确定V1的前提下

31、,用公式V2=(Tw-1)/V1-3)/2(2)算出V2的数值,注意这里的Tw必须用机器周期作为单位。例如若需要100ms的延迟时间,先将100ms折算成机器周期数并确定V1=256,再利用公式(2),就可得出V2=(100100011.0592/12-1)/256-3)/2179习题:1. 使用制作电路板的CAD软件,绘制出本接口实验“设备侧”的原理图纸。2. 要求使用第一节中所说明的装置上的8只单色发光二极管LED1LED8,完成以下的4个时段实验1#时段:分成以下8个子时段1.11.8,子时段周期为0.5秒。在子时段1.1中,LED1发光;在子时段1.8中,LED8发光。2#时段:分成以

32、下4个子时段2.12.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中增加以下的“异常情

33、况”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发光 在第二节的

34、实验中,虽然可使用与DELAY程序类似的“软件方法”来达到延时的效果,但使用该方法所存在的一个问题是此时CPU的绝大多数时间都是用于执行延时程序的“等待操作”,而不能去做其它的事情。这就象一个人坐在办公室里等着来电话而不做任何其它事情。显然这不是一个好办法。 为解决这个问题,最方便的方法就是利用“定时器中断”的手段,在这里我们并不讲述它的原理,而只用以下的简单实验来说明如何应用这种方法。 在做实验前,首要条件就是“确定实验任务”,现规定为将系统的一个工作周期分为以下12个时段,每个时段的持续时间为1.5秒,所做的工作为按照以下规则点亮装置上的8只单色发光二极管LED1LED8时段1 :点亮LE

35、D1和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的PO0PO7接DL1DL8,将它的“选择信号CS*”接编号为8100H的译码输出端,再根据第二节中讲述的“点灯规则”,就可得出如下的点灯数据LEDDATDB3, 0CH

36、, 30H, 0C0H, 81H, 42H, 24H, 18H, 11H, 22H, 44H, 88H 根据所学过的知识,我们知道当MCS-51的片内定时/计数器以定时器方式工作时,定时间隔T、定时数据Dt、机器周期Mt三者之间有以下关系式成立T=DtMt(1)而当其按方式1(16位定时器)工作时,最大定时间隔Tmax=65536Mt,由于在本装置上所使用的晶体振荡器的频率为11.0592MHz,故Tmax=6553612/11059.271ms,而这是不能满足实验要求的,故需要使用“软硬结合”的方法,即在管理定时器中断的中断服务程序中设置“软件计数器”,例如要达到1.5秒的定时效果,可先为系

37、统设置50ms的中断间隔,再定义1个8位的存储单元作为“软件计数器”,在开始时将其清除为0,之后每来一次定时器中断,就将该存储单元的内容加1,当其内容变为1500/50=30的时候,就表示本次定时时间到达。再根据前面的公式(1),可得出以下计算定时数据Dt和编程数据Pt (即传送到Thi:Tli (i=0或1)中的数值)的公式Dt=T/Mt(2)Pt=65536-Dt(3)如在本实验中T=50ms,Mt=12/11059.2ms,故Dt=5011059.2/12=46080,Pt=6553646080=19456,若使用0#定时/计数器作为定时器来使用,则TH0的编程数据=19456/256=

38、76,TL0的编程数据=19456 mod 256=0。 使用上述方法,再利用前面所获得的数据,就可编写出如下的程序代码 ORG0LJMP START;主程序入口 ORG 0BH LJMP T0INT;0#定时器中断服务程序入口 ORG30HOLED EQU 81H;定义“点灯数据”的输出设备地址的高8位T0INT:PUSH ACC;0#定时器中断服务程序,先保存所用寄存器 PUSH PSW PUSH DPHMOVTH0,#76;重新为0#定时器设置50ms的定时间隔MOVA,#2;使用“水涨船高”的策略ADDA,TL0;“2”是执行本条和下一条指令所用的机器周期数MOVTL0,AORLPSW

39、,#18H;选择3#工作寄存器组INCR7;增量50ms计数器CJNE R7,#30,T02;判断是否到了规定时间,若未到就结束中断处理MOVR7,0;到了,清除50ms计数器MOVA,R6;获得MOVC A,A+PCT01:MOVDPH,#OLED;并输出1个点灯数据MOVX DPTR, AINCR6;调整输出数据指针CJNE R6,#VEOF,T02;判是否已处理完了全部点灯数据,若未完就直接结束中断处理MOVR6,#VBEG;完了,重新初始化输出数据指针T02:POPDPH;恢复所用寄存器POPPSWPOPACCRETI;返回中断点LEDDATDB3, 0CH, 30H, 0C0H, 8

40、1H, 42H, 24H, 18H, 11H, 22H, 44H, 88H;12个点灯数据VBEGEQULEDDAT-T01;定义点灯数据的开始VEOFEQUVBEG+12;和结束的“相对地址”VR7EQU1FH;定义作为50ms计数器VR6EQU1EH;和输出数据指针的存储单元START:MOVVR7, #0;初始化50ms计数器MOVVR6, #VBEG;和输出数据指针MOVTMOD,#11H;将0#定时/计数器设置为16位的定时器MOVTH0, #76;为0#定时器设置50ms的中断间隔MOVTL0, #0MOVIE,#82H;开放0#定时器的中断SETB TR0;启动0#定时器开始记时

41、SJMP $;等中断END实验2:电子音调实验 在讨论这个问题之前,首先要明白如何由电来产生出声音,这通常是使用扬声器(即喇叭)来实现。根据声学知识,我们得知只要使喇叭通过一个按规定频率所变化的电流(当然它必须达到一定的幅度,否则我们听不见它所发出的声音),喇叭就会发出与该电流相同频率的声音。 要做这个实验,首要条件是要知道各种音调所对应的频率,这一点由下表所示:基本音符所对应的频率列表(表中的频率值以Hz为单位)音符名C(1)D(2)E(3)F(4)G(5)A(6)B(7)频率值261.7293.7329.9349.2392.0440.0493.9注:若某个音符比基本音符高8度(或低8度),

42、则它所对应的频率为相应基本音符的2倍(或一半)。 下一个问题是如何使计算机具备发声的“环境”和产生具有上述频率值的振荡信号,这只要将装置的SP控制端连接到计算机的P1口上的任何一根I/O线(我们选P1.0),再在J11上连接一个阻抗为8欧姆的喇叭,然后使P1.0在每1/2f秒钟改变一次输出信号(即由“0”变为“1”或由“1”变为“0”),这就会使喇叭通过频率为f的方波电流,从而产生出频率为f的声音。同样使用片内定时器的中断,利用实验1中的公式(2)和(3),再将T=1000/2f和Mt=12/11059.2代入,就可得到以下的计算公式Pt=65536-460800/f用它就可计算出使用实验装置

43、产生如下频率时所使用的编程数据Pt音符名C(1)D(2)E(3)F(4)G(5)A(6)B(7)频率值261.7293.7329.9349.2392.0440.0493.9编程数据Pt63775639676413964216643606448964603 最后是确定程序执行时所出现的现象和用户所做的操作,我们规定为一旦启动实验程序后,用户将使用K3K1这3个纽子开关来选择系统所发出的音调,详细情况见以下列表K3K2K1系统状态000不发声001发C调010发D调011发E调100发F调101发G调110发A调111发B调 显然为了达到上述目的,系统必须能“随时了解”K3K1 这3个开关的位置,

44、为此还要将K1K3连接在74LS244的PI0PI2上,其设备选择端“CS*”接编号为8000H的译码器输出端。只有在具备了上述所有这些前提条件的情况后,才能动手编写出以下的程序代码ORG0LJMPSTART;主程序入口ORG0BHLJMPT0INT;0#定时器中断服务程序入口ORG30HT0INT:PUSH PSW;0#定时器中断服务程序,先保存所用寄存器ORLPSW, #18H;选择3#工作寄存器组MOVTH0, R6;重新为0#定时器设置相应的定时间隔MOVTL0, R7CPLP1.0;改变输出信号POPPSW ;恢复所用寄存器RETI;返回中断点KINEQU80H ;定义输入“纽子开关

45、位置数据”的设备地址的高8位VR6EQU1EH;定义保存当前所使用的音调编程数据高8位VR7EQU1FH;和低8位的存储单元START:MOVTMOD,#11H;将0#定时/计数器设置为16位的定时器S01:MOVR6,#0;初始化开关位置数据MOVIE, #0;关闭全部中断CLRTR0;停止0#定时器SETB P1.0;使喇叭处于“不通电”的状态S02:MOVP2,#KIN;获得纽子开关的位置数据MOVX A,R0ANLA,#7JZS01;用户选择为“不发声”,执行相应动作MOVR7,A;用户选择为“发声”,先暂存开关位置数据XRLA, R6;判断开关位置是否发生过改变?JZS02;未发生过

46、,继续使用原来的编程数据MOVA, R7;发生过,用新的开关位置数据替换旧值MOVR6,AMOVIE,#0;关闭全部中断CLRTR0;停止0#定时器ADDA,R6;先获得ADDA, #VBEG1-2MOVC A,A+PCS03:MOVVR6, A ;并保存新编程数据的高8位MOVA, R6;再获得ADDA, R6ADDA, #VBEG2-1MOVC A, A+PCS04:MOVVR7, A;并保存新编程数据的低8位MOVTH0, VR6;设置新的定时间隔MOVTL0, VR7MOVIE,#82H;开放0#定时器的中断SETB TR0;启动0#定时器开始记时SJMP S02;重复上述操作SDAT

47、DW 63775, 63967, 64139, 64216, 64360, 64489, 64603;7个音调编程数据VBEG1EQUSDAT-S03;定义获取音调编程数据VBEG2EQUSDAT-S04;的“相对地址”END习题:1.计算出本仿真装置上的CPU对将其片内定时/计数器作为定时器使用时,若分别将其设置为方式0、方式1和方式2,所对应的最大中断间隔Tmax各为多少?(系统使用11059200Hz的振荡频率)2.在实验1中,“定时间隔”和LED的“发光顺序”都是固定不变的,若希望在程序执行的过程中应用户的要求而动态地变化,例如规定总共可使用M种“定时间隔”和N种“发光顺序”,则系统中

48、就有MN种不同的“组合现象”。请制订出相应的处理策略,使用户能在系统工作的时间内,可任意选择相应所执行的“组合现象”。要求写出步骤1、步骤2的“设计过程”和本实验程序执行时所出现的现象和用户所做的操作(即确定该实验程序的“设计目标”)。第四节键盘的管理策略4.1 独立式按键接口 它的特点是每个按键独立地占用一根输入口线,故在按键数少(不超过8个)时使用设备简单,其对应接口已经在第一节中讲述过了,这里不再重复。4.2 矩阵式键盘的工作原理 在按键数多时,若还使用独立式的按键接口,就会因所占用的输入口线太多而导致管理复杂,这时就采用将多个按键排列成一个称为键盘的m行n列的“按键矩阵”的方法,这种方

49、式只要使用m+n根I/O口线,而使用独立式则要使用mn根输入口线,故当按键数较多(超过8个,即m和n较大)时,键盘接口所使用的资源比独立式按键接口要少得多,所以键盘在计算机系统中的应用是非常广泛的,在介绍键盘接口的软件之前,首先讲述如下基本概念。行编号和列编号:即将键盘的全部行顺序编号为0到m-1,全部列顺序编号为0到n-1,这样就可用一个数据的有序对(L,C)来表示键盘上任意一个按键的位置,L和C分别为该按键所对应的行和列编号,注意此时有0Lm-1和0Cn-1成立。键值:为了处理方便,通常不用行编号和列编号,而是用“键值”来表示某个按键在键盘矩阵中的位置的,设键盘中的某个按键的行号为L,列号

50、为C,则它的键值Kv与L、C有以下的关系式成立Kv=Ln+C(0Lm-1,0Cn-1)L=Kv/n(0Kvmn-1)C=Kv mod n有了上述基本概念后,就可初步形式化地描述出CPU在管理键盘接口时,应做如下工作(我们规定在一次按键的“按下/松开”操作中只产生一个“有效键值”)S1:预先设置“无效键值”。S2:判断用户是否按了键,若未按做S6,按了则做S3。S3:进行按下键时的去抖动处理。S4:获取与该按键所对应的键值,必要时进行重键处理。S5:等待用户松开按键,再进行松开键时的去抖动处理。S6:结束处理过程。 上面使用了“去抖动”这个术语,所谓“抖动”是指两个机械电气触点在闭合或断开的瞬间

51、时所产生的颤动,由于抖动的时间不超过20毫秒(也就是说,20毫秒是抖动的“时间上限”),这比按键的“良好接触”和“完全断开”要短很多,所以通常都是使用“延时”的方法来消除它,即一旦检测到按键有“状态改变”的现象,就延时20毫秒后,再去检测该现象是否仍然存在,若是就表示用户确实按下(或松开)了按键,否则表示该现象只是一个干扰信号。为了判断用户是否按下了按键和获取所按键的键值,可采用“行扫描”或“线反转”的方法。首先讲述行扫描法,它的特点是固定行线作为输出,列线作为输入(注意这里的“行”和“列”均为相对概念),CPU只要向行接口输出一个为“全0”的数据(以后将输出到行接口的数据简称为行码),再读入

52、列接口的数据(以后将其简称为列码)并判其是否为“全1”,若是就表示键盘中没有键被按下,否则表示有键被按下了,且列码中“0”的位置就是所按按键的列号。为了获得用户按下的按键所对应的键值,可先向行接口输出一个第0行为“0”,其它行均为“1”的行码,然后读入列码并判其是否为“全1”,若不是就表示在第0行中有键被按下了,且读入的列码中出现“0”的位置就是该按键所处的列编号,而输出行码中“0”的位置就代表了行编号,据此就可用前面讲过的公式计算出相应的键值;若读入的列码等于“全1”,就再对第1行进行类似的处理,如此类推。即采用“逐行扫描”的方法来获得相应的键值,这就是行扫描法名称的由来。注意若确实是按照上

53、面的讲述做的,则在 “当用户同时按下了键盘上的两个或多个按键,且所按下的按键均不处于键盘的同一列”这个前提条件下,相应的重键处理策略(即系统将选择哪一个按键作为“有效按键”)规定如下,简称为“小行、列号优先”。(1) 若用户按下的键处于不同的行,则认为处于小行号上的按键有效;(2) 若用户按下的键处于同一行的不同列,则认为处于小列号上的按键有效(注意这只是个“人为规定”)。 再来讲述线反转法,它的特点是将键盘的行线和列线均连接在一个“可编程并行I/O接口”上,则在“当用户只按下了键盘上的一个按键”的前提条件下,使用以下的“处理策略”:(1)先将行接口设置为“输出接口”,列接口设置为“输入接口”

54、,然后向行接口输出一个数值为“全0”的“输出行码”并从列接口读入相应的“输入列码”,若该“输入列码”不等于“全1”,就表示键盘上“有键被按下”了,且其中“0”的位置就是所按按键的列号。(2)在确定“有键被按下”的情况下,将行接口设置为“输入接口”,列接口设置为“输出接口”(即执行将“输入线变输出线”和将“输出线变输入线”的“线反转”操作,这就是“线反转法”名称的由来),然后向列接口输出一个数值为“全0”的“输出列码”并从行接口读入相应的“输入行码”,则此时“输入行码”中“0”的位置就是所按按键的行号。(3)根据“输入行码”和“输入列码”中“0”出现的位置,获得“被按下的按键”所对应的行、列编号

55、,最后得到该按键的键值。4.3 查询方式键盘接口子程序KEYIN 所谓按查询方式工作的子程序,就是当引用该子程序的时候若用户按下了键盘上的按键,就会获得一个“有效键值”,否则将获得一个“无效键值”,对于m行n列的键盘来说,根据前面讲过的公式,可人为规定有效键值的取值范围为0mn-1,无效键值的数值为mn。 本装置上有一个2行8列的键盘,它的2根行线接在8255A并行I/O接口的PB0和PB1上,8根列线接在PA0PA7上,若将8255A的片选信号CS*接在编号为8700H的译码输出端,则下面就是使用行扫描法管理该键盘的子程序。注意由于该键盘的行线上没有连接上拉电阻(这就是说系统不能对行接口进行

56、“读取操作”),故不能使用线反转法来管理该键盘。以下是相应的“子程序说明”和指令代码。;KEYIN子程序用于读入2行8列键盘的键值,使用“小行、列号优先”的重键处理策略,引用前应将8255A的A口设置为按方式0工作的输入口,B口设置为按方式0工作的输出口,引用形式为CALL KEYIN返回后(A)、(DPTR)和(R3)(R6)无定义,且若(R7)=015,就表示在调用该子程序的过程中,用户按下了具有该键值的按键;若(R7)=16,就表示用户没有按键。MS20:MOVR3, #128;延时20ms子程序MS1:MOVR4, #70DJNZR4, $DJNZ R3, MS1RETLOUTEQU8

57、702H;定义行输出接口CINEQU8700H;和列输入接口的设备地址KEYIN:MOVR7, #16;28键盘处理子程序,预设置无效键值MOVDPTR, #LOUT;先向行接口输出“全0”数据MOVA, #0FCHMOVX DPTR, AMOVDPTR,#CIN;再读入列接口数据MOVX A,DPTRCPLA;判是否有键被按下?JZK05;没有,执行返回操作ACALL MS20;可能有,执行延时去抖动MOVX A,DPTR;重新读入列接口数据CPLA;判是否确实有键被按下JZK05;没有,执行返回操作MOVR6,#0;有,初始化行计数器MOVR5,#0FEH;设置行扫描初值K01:MOVDPTR,#LOUT;输出行扫描数据MOVA, R5MOVX DPTR, AMOVDPTR, #CIN;并读入列数据MOVX A, DPTR

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!