单片机软件仿真实验指导书 - 图文 下载本文

编著 蔡骏

安徽电子信息职业技术学院

二00七年九月

前 言

本实验指导书结合单片机实验教学和高职生的学习特点,引入较为先进的单片机与嵌入式系统仿真与开发平台——PROTEUS仿真软件,对传统的单片机实验方法和实验内容进行充实和完善。全书共分5章,各章内容的编排顺序基本上与理论课教材相近。第1章介绍Proteus仿真软件,第2、3章分别介绍单片机硬件、指令系统和程序设计,第4、5章分别介绍单片机定时器/计数器、中断技术和系统扩展。各项实验提供的参考程序均通过ProteusV7.1版调试。

在本书编写过程中,主要突出以下几个特点:

1.以培养应用技术性人才为目标,突出基本技能训练,加强对指令系统的理解和输入输出口控制应用的训练,培养学生的编程能力。

2. 考虑到各系电类及相关专业对单片机课程的要求不同,各专业学生的基础不同,每章安排的实验数量较多,难易程度也有所不同,各专业可以根据各自的专业要求和学生的学习能力选择实验项目。

3. 在各章节的参考程序中,都给出了与汇编语言对应的机器码,使学生对机器码有一定的了解。

4. 实验内容的编排顺序基本上与理论课教学一致,努力做到理论与实践相结合,互相补充。单片机硬件结构学习过程中即可安排实验课程。

由于编者水平有限,书中难免会有错误和不妥之处,恳请广大读者给予批评指正。

蔡 骏

2007年9月

II

目 录

第1章 单片机仿真软件概述?????????????????????????1

1.1 Proteus软件仿真系统的构成与功能????????????????????1 1.2 Proteus软件仿真系统的使用方法?????????????????????4

第2章 单片机硬件和指令系统实验?????????????????????13

2.1 数据存储器实验??????????????????????????? 13 2.2 数据传送指令实验?????????????????????????? 19 2.3 算术运算指令实验?????????????????????????? 21 2.4 逻辑运算指令实验?????????????????????????? 23 2.5 控制转移指令实验?????????????????????????? 25 2.6 位操作指令实验??????????????????????????? 26

第3章 单片机程序设计实验???????????????????????? 29

3.1 流水灯实验????????????????????????????? 21 3.2 步进电机实验???????????????????????????? 35 3.3 汽车转向信号灯控制实验??????????????????????? 40 3.4 步进电机控制实验?????????????????????????? 42

第4章 单片机定时与中断实验??????????????????????? 57

4.1 外部中断实验???????????????????????????? 57 4.2 交通信号灯控制实验????????????????????????? 59 4.3 广告灯实验????????????????????????????? 67 4.4 脉冲计数实验???????????????????????????? 77

4.5 电子音乐实验???????????????????????????? 69 4.6 直流电动机控制实验????????????????????????? 76

第5章 单片机系统扩展实验?????????????????????????79

5.1 简单I/O口扩展实验????????????????????????? 79 5. 2 8255扩展I/O口实验?????????????????????????50

III

第1章 单片机仿真软件概述

PROTEUS是英国Labcenter Electronics公司开发的多功能EDA软件。PROTEUS不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,也是目前较先进的单片机和嵌入式系统的设计与仿真平台。它实现了在计算机上完成从原理图与电路设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整的电子设计、研发过程。

由于PROTEUS丰富的元器件模型、对处理器的支持、多样的虚拟仪器、强大的图表分析功能和与第三方集成开发环境的无缝集成,已被公认为电类教学与实验的巨大资源,得到越来越多的高校的认同,并在教学实践中取得了明显效果。

1.1 Proteus软件仿真系统的构成与功能

1.1.1 Proteus软件的构成

Proteus组合了高级原理布图、混合模式SPICE仿真、PCB设计以及自动布线来实现一个完整的电子设计系统。Proteus包含了VSM(Virtural System Modelling虚拟系统模型)技术,用户可以对基于微控制器的设计连同所有的周围电子器件一起仿真。

Proteus包括Proteus VSM(Proteus虚拟系统模型)和Proteus PCB Design(Proteus印制电路板设计)两大部分。

Proteus VSM包括智能原理图输入系统ISIS(Intelligent Schematic Input System)、带扩展的ProSPICE(Simulation Program With Integrated Circuit Emphasis)混合模型仿真器、动态器件库、高级图表仿真ASF(Advanced Simulation Feature)和微控制器虚拟系统仿真模型VSM。

Proteus PCB Design包括高级布线编辑软件ARES(Advanced Rounting and Editing Software)、智能原理图输入系统ISIS和高级图表仿真ASF。

该软件运行于Windows操作系统上,主要特点是:

? 实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单

片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。

? 支持主流单片机系统的仿真。目前支持的单片机类型有:8051/52系列、

ARM7(LPC21xx)、AVR系列、PIC10/12/16/18系列、HC11系列以及多种外围芯片。 ? 提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时

可以观察各个变量、寄存器等的当前状态。

? 支持第三方的软件编译和调试环境,如Keil C51 uVision2、MPLAB、IAR等软件。 ? 具有强大的原理图绘制功能。

总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。

1.1.2 Proteus软件的功能

本实验指导书主要涉及与单片机课程有关的软件设计与仿真,故只叙述Proteus VSM的功能。Proteus VSM组合了混合模式的ProSPICE电路仿真、动画器件和微控制器模型,实现了完整的基于微控制器设计的协同仿真。使在物理原型出来之前对这类设计的开发和测试成为可能。Proteus VSM的各组成部分的功能简介如下:

一、智能原理图输入系统ISIS

ISIS是Proteus系统的中心,它远不仅是一个图表库。它既是智能原理图设计、绘制和

编辑的环境,又是数字电路、模拟电路和数/模混合电路设计与仿真的环境,更是单片机与外围设备的设计、仿真和协同仿真的环境。

ISIS组合有很多易用的功能强大的编辑工具,是单片机系统的设计与仿真的平台。其主要特点如下:

? 生成出版质量的原理图。

? 风格模板允许提供库部件的用户化。 ? 鼠标驱动和内容关联的用户界面。 ? 自动走线,以及接点的布置和切除。 ? 参数表示子电路元件值的层次设计。

? 包括子电路端口以及总线引脚的总线支持。 ? 挑选元件或建立新库元件可预览PCB 封装。 ? 完全体现多元器件的同性和异性。

? 包括相应对话框用户化的元件特性的精细管理。 ? 超过8000元件的大型元件库,完全适用于仿真模型。

? 网表格式:Labcenter SDF、SPICE、Tango、Boardmaker、EEDeginer、Futurenet等。 ? 电气规则检查以及元件报告清单。

? 可彩色或单色输出到Windows 打印设备。

? 图形输出格式:WMF、BNP、DXF、EPS、HPGL 。

二、ProSPICE混合模型仿真器

ProSPICE是结合ISIS原理图设计环境使用的混合型电路仿真器。它基于工业标准SPICE3F5(美国加州Berkeley大学开发)的模拟内核,加上混合型仿真的扩展以及交互电路动态,提供了开发和测试设计的强大交互式环境。

ProSPICE使用了Berkeley的源代码,包含了最新的整合技术以及原型,保证在数字结果方面和生产商SPICE模型的最好兼容性。

三、微控制器虚拟系统仿真模型VSM

Proteus可以仿真51 系列、AVR、PIC、ARM等常用的MCU 及其外围电路。可仿真的51系列单片机模型如下:

? 通用:80C31、80C32、80C51、80C52、80C54、80C58。 ? Atmel:AT89C51、AT89C52、AT89C55;AT89C51RB2、AT89C51RC2 、AT89C51RD2 (X2

和SPI 没有模型)

? Philips:P87C51FX、P87C51RX+(如 FA、FB、FC、RA+、RB+、RC+、RD等系列)。

通过51系列单片机模型可完成以下仿真: ? 全部 8051指令系统。 ? 所有I/O操作。

? 所有片上外设的各种操作模式。 ? 所有中断模式。

? 内部产生处理器时钟以优化经济结构性能,I/O和其它事件定时器精确至一个时钟相位。 ? 程序和外部数据存储器能被仿真为内部模型,以提高吞吐量,或仿真为外部模型以验证

硬件设计。

? 提供内部一致性代码检查功能。

? 完整集成ISIS的源码级调试和源码管理系统。 ? 支持集成Keil等第三方编译器和调试器。

? 支持的编译器: Keil C51/μVision 2 、MPLAB和IAR。

四、动态器件库

? ? ? ?

VSM包含超过8000种元器件模型:

标准电子元件:电阻、电容、二极管、晶体管、晶闸管、光耦合器、运放、555 定时器等。

74 系列TTL和 4000系列 CMOS器件。

存储器:ROM、RAM、EEPROM、I2C器件等。 微控制器支持的器件:如I/O口、USART等。

Proteus VSM除上述库外,同样包含大量复杂的外设模型,如表1-1所示。

表1-1 Proteus VSM 高级外设模型

交互式 虚拟仪器 虚拟仪器和 分析工具 规程分析仪 交互式电路 激励工具 光电显示模型和驱动模型 电机模型和控制器 存储器模型 温度控制模型 计时模型 IC/SPI规程模型 一线规程模型 2双通道示波器 24通道逻辑分析仪 计数器/计时器 RS232终端 交流电压表/直流电压表 交流电流表/直流电流表 双模式(主/从)IC规程分析仪 双模式(主/从)SPI规程分析仪 模拟信号发生器-可输出方波、锯齿波、三角波、正弦波信号 数字图形发生器-支持1K的标准8-bit数据流 数字式LCD模型、图形LCD模型、LED模型、七段显示模型、光电驱动模型 、光耦模型 电机模型(直流、步进和伺服电机)、电机控制器模型 IC EPROM存储器模型、静态存储器模型、永久性EPROM模型 温度计和温度自动调节器模型、温度传感器模型、热电偶模型 实时时钟模型 IC外设、SPI外设、规程分析仪 一线EEPROM模型、一线温度计模型、一线开关模型、一线按钮模型 222RS-232/RS-485/RS-422规程模型 RS232终端模型 、Maxim外设模型

ADC/DAC转换模型 电源管理模型 脉宽控制模型 拉普拉斯转换模型 热离子管模型 变换器模型 模/数转换模型 、数/模转换模型 正电源标准仪、负电源标准仪 、混合电源标准仪 全桥脉宽放大器 、半桥脉宽放大器、脉宽调节器 操作模型、一阶模型、二阶模型、过程控制 、线性模型、非线性模型 二极管模型、五极真空管模型、四极管模型、三极管模型 压力传感器模型 五、高级图表仿真ASF

基于图形化的仿真是传统的SPICE仿真,包括以下特点:

? 标准SPICE分析包括:模拟瞬态、数字瞬态、混合模式瞬态、频率、傅里叶、噪声、

失真、转换曲线、直流特性、交流特性和工作点。

? 图形显示模拟、数字和总线数据,频谱显示增益和相位。 ? 音频分析可形成波形或在声卡上播放。

? 交互仿真后,捕捉结果到图形上,并进行交互的分析。 ? 数字信号一致性分析,后面会详细介绍该工具。 ? 探针所观测点的电压或电流可以用数字标示出来。 ? 使用图形的图标可以精确度量。

? 以CSV格式将仿真结果输出给其它软件,如EXECL。

Proteus做为单片机与嵌入式系统仿真与开发平台,支持外围数电/模电与微控制器的协同仿真,真正实现了虚拟物理原型功能。在目标板还没有投产前,就可以对设计的硬件系统的功能、合理性和性能指标进行充分调整,并可以在没有物理目标板的情况下,进行相应软件的开发和调试,进行完全的虚拟开发,明显提高企业的开发效率,降低开发风险。

无论是51 系列、AVR、还是PIC 系列,他们各有各的特点,学习者也是逐年增加,但是在学习开发过程中,我们往往在确定方案后做试验的开支比较大,尤其是对于一些学生或者初学者这就可能成为他们学习的障碍。使用Proteus 软件可大大节省时间和开发费,在校学生只要配备一台电脑就可以在宿舍用Proteus构建成单片机与嵌入式系统仿真与设计实验室,同时也是数电/模电仿真实验室。

1. 2 Proteus软件仿真系统的使用方法

单片机的软件设计与仿真主要在智能原理图输入系统ISIS中进行,本书只介绍ISIS的使用,并以Proteus 7.1SP2 Professional(汉化版)版本为平台。双击桌面上的ISIS 7 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 7 Professional” →“ISIS 7 Professional”,进入Proteus ISIS集成环境,如图1-1所示。

菜单栏

标题栏

命令 工具栏 预览 窗口 器件选 择按钮 库管理 按钮 标签 模式 选择 工具栏 对象 选择器 窗口

方向工具栏 状态栏 仿真工具栏 编辑区

图1-1 ISIS窗口

1.2.1 ISIS窗口简介

一、菜单栏

菜单栏中的每项都有下一级菜单,许多命令左方的图标表明该命令在工具栏中有相应的按钮,有部分命令的右方标有该命令的快捷键。

二、编辑区

编辑区用来绘制原理图。蓝色方框内为可编辑区,元件要放到可编辑区的里面。这个窗口没有滚动条,可用预览窗口来改变原理图的可视范围。

三、工具栏

工具栏分为命令工具栏、模式选择工具栏、方向工具栏和仿真工具栏四类。许多操作既可通过菜单栏有可通过工具栏来执行,一般来说使用工具栏要方便快捷。常用命令的名称和功能说明如下:

1、命令工具栏 ? 文件操作按钮

新建设计――在默认的模板上新建一个设计文件。 加载设计――装载一个新的设计文件。 保存设计――保存当前设计文件。

导入――将一个局部文件导入ISIS中。 导出――将当前对象导出为一个局部文件。 打印――打印当前设计文件。 设置区域――打印选中的区域。

? 显示操作按钮

刷新屏幕

网格――显示/不显示网格点。 原点――显示/不显示原点。 平移――使可编辑区充满整个编辑区。 放大――放大可编辑区,也可通过中键放大。 缩小――缩小可编辑区,也可通过中键放大。 全部显示――使可编辑区充满整个编辑区。 放大到区域――放大选中的区域充满整个编辑区。

? 编辑操作按钮

撤销――撤销最后的操作。 重做――恢复最后的操作。 剪切――剪切选中的对象。 复制――复制选中的对象到剪贴板。 粘贴――从剪贴板粘贴。

块复制――复制选中的块对象到剪贴板。 块移动――移动选中的块对象。 块旋转――旋转选中的块对象。 块删除――删除选中的块对象。

选择元件/符号――从元器件库中选取元件。 制作器件――将原理图符号封装成元件。 器件封装工具――定义PCB封装。 分解――打散选中的元件成原始组件。。

? 设计操作按钮

实时Snap(捕捉) 搜索并标记 属性分配工具 设计管理器 添加一张图纸 移除一张图纸

电气规则检查 网表到AREA

(2)模式选择工具栏 ? 主模式选择按钮

用于即时编辑元件参数 (先单击该按钮再单击要修改的元件) 元件――选择元器件(默认选择)。 点――放置连接点(电线的交点)。

网路标号――放置电线标签(总线标记时用)。 文本――放置文本。 总线――用于绘制总线。 子电路――用于放置子电路。 ? 工具箱

终端――有VCC、地、输出、输入等接口终端。 器件引脚――用于绘制各种引脚。

仿真图表――用于各种分析(如Frequency、Analogue)。 录音机 信号发生器

电压探针――图表仿真分析时用。 电流探针――图表仿真分析时用。 虚拟仪表――有示波器、逻辑分析仪等。

? 2D绘图按钮

画各种直线 画各种多边形

(3)方向工具栏

画各种方框 画各种文本

画各种圆 画符号

画各种圆弧 画原点

右旋转:旋转角度只能是90的整数倍。 左旋转:旋转角度只能是90的整数倍。

(4)仿真工具栏

水平翻转:完成水平翻转。 垂直翻转:完成垂直翻转。

停止

运行 单步运行 暂停

四、预览窗口

预览窗口可显示如下内容:

? 当在对象选择器窗口中单击某一个元器件时,该元器件会显示在预览窗口。此时可通过

方向工具栏中的按钮对该元器件进行旋转和翻转操作。

? 当鼠标指针在编辑区窗口操作时,预览窗口会显示可编辑区的缩略图,并显示一个绿

色方框,绿色方框内的内容就是当前编辑区窗口中显示的可编辑区的内容。

? 当单击预览窗口的绿色方框后,移动鼠标可改变绿色方框的位置,从而改变可编辑

区的可视区域,再次单击预览窗口的绿色方框退出移动绿色方框。

五、对象选择器窗口

对象选择器用来选择绘图用各类元器件、仪器等,可执行以下操作:

? 当单击模式选择工具栏某一按钮时,标签显示对象选择器窗口所列对象的类型。

? 当单击器件选择按钮“P”时,可从打开的“Pick Devices”对话框中选取元器件。

Proteus有30多个元器件库,选取元器件对话框如图1-2所示。 ? 当单击库管理按钮“L” 时,可从打开的“Devices Libraries Manager”对话框中整

理元器件库。用户器件库USERDVC可由用户自己添加元器件,也可单击建库按钮“Create

Library”建立自己的库。

关键字 元器件列表 元器件预览 类别 元器件名称 所属库 元器件描述 元器件PCB预览 子类别 生产厂家 元器件封装

图1-2 选取元器件对话框

1.2.2 单片机应用系统的Proteus设计与仿真步骤

一、Proteus使用中的操作步骤

Proteus设计与仿真以ISIS为平台,用于单片机应用系统的开发,主要可分为三大步骤。

1. Proteus电路设计

该步骤主要包括电路设计、选取元器件、接插件、连接电路和电气检测等。 绘制原理图要在可编辑区的蓝色方框内完成。具体步骤如下: (1)新建设计文件:单击“文件”→“新建设计”,在弹出的“Create New Deign”对话框中选择模板后单击“OK”。

(2)设置图纸尺寸:单击“系统”→“设置图纸尺寸”,在弹出的“Sheet Size Configueration”对话框中选择图纸尺寸或自定义尺寸后单击“OK”。

(3)保存设计文件:单击“文件”→“保存设计”,在弹出的“Save ISIS Design File”对话框中指定文件夹、输入文件名并选择保存类型为“Design File”后单击“保存”。 (4)选取元器件:单击模式选择工具栏“元件”按钮,单击器件选择按钮“P”,在弹出的 “Pick Devices”( 选取元器件)对话框的“Keywords”(关键字)栏中输入元器件名称(也可以是分类、小类、属性值),与关键字匹配的元器件显示在元器件列表(Results)中。双击选中的元器件,便将所选元器件加入到对象选择器窗口。同样方法选取其他元器件,单击“OK”完成元器件选取。

(5)设置网格:单击“查看”→“网格”,网格显示;再次单击,网格不显示(也可单击命令工具栏的“网格”按钮)。单击“查看”→“Snap xxth”(或Snap x.xin),改变网格单位。

(6)放置元器件:单击对象选择器窗口的元器件,该元器件名背景变为蓝色,预览窗口显示该元器件;将鼠标指针移到编辑区某一位置,单击一次就可放置一个元器件。

(7)编辑元器件:

右击(或单击)编辑区的元器件,该元器件变为红色表明被选中,鼠标指针放到被选中的元器件上,按住左键拖动,将鼠标移到编辑区某一位置松开,即完成元器件的移动。

鼠标指针放到被选中的元器件上右击,单击弹出的快捷菜单中的方向工具命令可实现元器件的旋转和翻转。

右击编辑区中被选中的元器件,可删除该元器件。 (8)放置终端:单击模式选择工具栏“终端”按钮,单击对象选择器窗口的终端(如POWER为电源、GROUND为地),该终端名背景变为蓝色,预览窗口显示该终端;将鼠标指针移到编辑区某一位置,单击一次就可放置一个终端。

(9)连线:单击命令工具栏“实时Snap(捕捉)”按钮,实时捕捉有效,当鼠标指针接近引脚末端时,该处会自动出现一个小方框“□”,表明可以自动连接到该点,

2. Proteus源程序设计与编译

该步骤主要包括源程序设计、编辑、汇编编译、生成目标代码文件(HEX格式)。

3. Proteus仿真

该步骤主要包括加载目标代码文件、仿真。

4.常用的操作要点

? 左键放置元件;右键选择元件;双击右键删除元件;右键拖选多个元件。

? 先右键后左键编辑元件属性;先右键后左键拖动可移动元件。

? 连线用左键;删除用右键;先右击连线再左键拖动可改连接线。 ? 中键缩放原理图。

? 使用的Proteus软件版本不一样,操作上会有点差异,较新的版本在保留原有操作

方法的基础上会有一些扩展

二、Proteus使用中的注意事项 1. 设置代码产生工具

第一次使用该软件时,要设置代码产生工具。 单击“源文件”→“定义代码产生工具”,在弹出的“Add/Remove Code Generation Tools”对话框中,单击“Code Generation Tool”栏下拉列表框按钮,选择“ASEM51”(51汇编器);在“Make Rules”栏和“Debug Data Extraction”栏按表1-3所示进行设置,单击“OK”。

图1-3 定义代码产生工具对话框

2. 编译出错信息

(1)常见编译出错信息一

Processing ..\\..\\..\\..\\Keil\\dz\\Text1.LST... 源程序名 10

ASEM51 ..\\..\\..\\..\\Keil\\dz\\Text1.LST /INCLUDES:C:\\Program Files\\Labcenter Electronics\\Proteus 7 Professional\\TOOLS\\ASEM51 源程序路径 Invalid keyboard code specified MCS-51 Family Cross Assembler ASEM-51 V1.2 汇编器 @@@@@ too many parameters: 7 @@@@@ usage: ASEM [ []] [/INCLUDES:p] [/DEFINE:s:v:t] [/COLUMNS] ERROR: ASEM.EXE reported error code (2L). Extracting debug data from ..\\..\\..\\..\\Keil\\dz\\Text1.LST... 从列表提取调试数据 Processed 15 lines. 处理行数 15行 Build FAILED with 1 error(s). 代码建立失败 原因:命令参数不正确。 解决办法:单击“源文件”→“定义代码产生工具”,在弹出的“Add/Remove Code Generation Tools”对话框中,删除“Command Line”栏中的内容,重新输入“%1,%2,%3”。

(2)常见编译出错信息二

第2行 未定义符号 第6行 非法字符 MAIN为未定义符号(应检查标号为MAIN的指令) “:”为非法字符(应改为英文输入法下的“:”) L2为未定义符号(应检查标号为L2的指令) “,”为非法字符(应改为英文输入法下的“,”) 图1-4 源程序编译窗口

单击“源文件”→“构建所有”(编译源程序),弹出源程序编译窗口如图1-4所示。若

编译不出错,则自动生成目标代码文件(HEX格式);若编译出错,根据提示修改源程序并保

11

存,直至编译成功。

原因:图1-4中有未定义符号(symbol not defined)和非法字符(illegal character)。 解决办法:根据源程序编译窗口提示的信息修改源程序并保存,然后重新编译。 提示:程序输入要在英文输入法下进行,否则会造成编译出错。

3. 8051 CPU Source Code源代码调试窗口信息

使用Proteus自带汇编器(如ASEM51),它将产生SDI文件。当单步调试程序时,源代码窗口将出现SDI文件。8051 CPU Source Code源代码调试窗口按钮说明:

全速运行 跳出子程序

单步执行,跳过子程序内部 运行到选中指令行

12

单步执行,进入子程序内部 设置断点

第2章 单片机硬件和指令系统实验

2.1 数据存储器实验

一、实验目的

1.掌握片内数据存储器的地址分配。

2.掌握对片内数据存储器进行数据读写的方法。 3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

8051的片内数据存储器共有256个单元,按其功能划分为两个部分:低128单元(单元地址00H~7FH)和高128单元(单元地址80H~FFH)。

低128单元按其用途划分为工作寄存器区(单元地址00H~1FH)、位寻址区(单元地址20H~2FH)、用户RAM区(单元地址30H~7FH)三个区域。如图2-1所示。

高128单元是分配给特殊功能寄存器使用的,其中部分单元(单元地址能被8整除的)可以进行位寻址。如表2-1、2-2所示。

三、实验内容

通过执行程序中的相关指令,将有关数据写入工作寄存器区、位寻址区、数据缓冲区和特殊功能寄存器区各存储单元,观察当前在用工作寄存器组的选择与数据传送目标的对应关系、字节地址与位地址的区别、特殊功能寄存器的字节地址、程序计数器PC在执行指令中的作用。

表2-1 8051单片机特殊功能寄存器表

符 号 B ACC PSW IP P3 IE P2 SCON P1 TCON P0 名 称 B寄存器 累加器 程序状态字 中断优先级控制寄存器 P3口锁存寄存器 中断允许控制寄存器 P2口锁存寄存器 串行口控制寄存器 P1口锁存寄存器 定时/计数器控制寄存器 P0口锁存寄存器 字节地址 符 号 F0H E0H D0H B8H B0H A8H A0H 98H 90H 88H 80H SBUF TH1 TH0 TL1 TL0 TMOD PCON DPH DPL SP 名 称 串行数据缓冲寄存器 定时/计数器1(高字节) 定时/计数器0(高字节) 定时/计数器1(低字节) 定时/计数器0(低字节) 定时/计数器方式寄存器 电源控制寄存器 数据指针高8位 数据指针低8位 堆栈指针 字节地址 99H 8DH 8CH 8BH 8AH 89H 87H 83H 82H 81H

13

7FH 30H 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 27H 26H 25H 24H 23H 22H 21H 20H 1FH 18H 17H 10H 0FH 08H 07H 00H

7F 77 6F 67 5F 57 4F 47 3F 37 2F 27 1F 17 0F 07 7E 76 6E 66 5E 56 4E 46 3E 36 2E 26 1E 16 0E 06 7D 75 6D 65 5D 55 4D 45 3D 35 2D 25 1D 15 0D 05 7C 74 6C 64 5C 54 4C 44 3C 34 2C 24 1C 14 0C 04 R7 R0 第3组工作寄存器 (R0~R7) R7 R0 第2组工作寄存器 (R0~R7) R7 R0 第1组工作寄存器 (R0~R7) R7 R0 第0组工作寄存器 (R0~R7)

图2-1 片内RAM地址空间

表2-2 SFR中位地址分布表

SFR MSB F7 B.7 E7 ACC.7 F6 B.6 E6 ACC.6 F5 B.5 E5 ACC.5 位地址/位定义 F4 B.4 E4 F3 B.3 E3 F2 B.2 E2 ACC.2 F1 B.1 E1 ACC.1 LSB F0 B.0 E0 ACC.0 字节 地址 F0H 工作寄存器区

7B 73 6B 63 5B 53 4B 43 3B 33 2B 23 1B 13 0B 03 7A 72 6A 62 5A 52 4A 42 3A 32 2A 22 1A 12 0A 02 79 71 69 61 59 51 49 41 39 31 29 21 19 11 09 01 78 70 68 60 58 50 48 40 38 30 28 20 18 10 08 00 位寻址区

用户RAM区

(堆栈、数据缓冲区)

B ACC

ACC.4 ACC.3 14 E0H PSW D7 CY BF - B7 P3.7 AF EA A7 P2.7 9F SM0 97 P1.7 8F TF1 87 P0.7 D6 AC BE - B6 P3.6 AE - A6 P2.6 9E SM1 96 P1.6 8E TR1 86 P0.6 D5 F0 BD - B5 P3.5 AD - A5 P2.5 9D SM2 95 P1.5 8D TF0 85 P0.5 D4 RS1 BC PS B4 P3.4 AC ES A4 P2.4 9C REN 94 P1.4 8C TR0 84 P0.4 D3 RS0 BB PT1 B3 P3.3 AB ET1 A3 P2.3 9B TB8 93 P1.3 8B IE1 83 P0.3 D2 OV BA PX1 B2 P3.2 AA EX1 A2 P2.2 9A RB8 92 P1.2 8A IT1 82 P0.2 D1 - B9 PT0 B1 P3.1 A9 ET0 A1 P2.1 99 TI 91 P1.1 89 IE0 81 P0.1 D0 P B8 PX0 B0 P3.0 A8 EX0 A0 P2.0 98 RI 90 P1.0 88 IT0 80 P0.0 D0H IP B8H P3 B0H IE A8H P2 A0H SCON 98H P1 90H TCON 88H P0 80H 四、实验参考程序

参考程序1:工作寄存器区的数据传送 地址 0000H 0002H 0004H 0006H 0008H 000BH 000DH 000FH 0011H 地址 0100H 0103H 0105H 0107H 0109H 010BH 010DH

机器码 78 11 79 22 7A 33 7B 44 75 D0 10 78 55 79 66 7A 77 7B 88 机器码 75 20 F0 D2 00 D2 01 D2 02 D2 03 C2 04 C2 05 源程序 ORG 0000H MOV R0,#11H MOV R1,#22H MOV R2,#33H MOV R3,#44H MOV PSW,#10H MOV R0,#55H MOV R1,#66H MOV R2,#77H MOV R3,#88H END 源程序 ORG 0100H MOV 20H,#0F0H SETB 00H SETB 01H SETB 02H SETB 03H CLR 04H CLR 05H 注释 ;表示程序从地址0000H存放 ;将立即数11H送到寄存器R0中 ;将立即数22H送到寄存器R1中 ;将立即数33H送到寄存器R2中 ;将立即数44H送到寄存器R3中 ;使工作寄存器工作于2区 ;将立即数55H送到寄存器R0中 ;将立即数66H送到寄存器R1中 ;将立即数77H送到寄存器R2中 ;将立即数88H送到寄存器R3中 ;程序结束 注释 ;表示程序从地址0100H存放 ;将字节地址20H单元中的内容置F0H ;将位地址00H单元中的内容置1 ;将位地址01H单元中的内容置1 ;将位地址02H单元中的内容置1 ;将位地址03H单元中的内容置1 ;将位地址04H单元中的内容置0 ;将位地址05H单元中的内容置0 15

检查数据 ( H)=11H ( H)=22H ( H)=33H ( H)=44H ( H)=10H ( H)=55H ( H)=66H ( H)=77H ( H)=88H 检查数据 (20H)= ( H)=1 ( H)=1 ( H)=1 ( H)=1 ( H)=0 ( H)=0 参考程序2:位寻址区的数据传送 010FH C2 06 0111H C2 07 0113H 0116H 0118H 011AH 011CH 75 90 FF C2 90 D2 90 C2 91 D2 91 CLR 06H CLR 07H MOV P1,#0FFH CLR 90H SETB 90H CLR 91H SETB 91H END 源程序 ORG 0200H MOV 30H,#99H MOV 45H,#0AAH MOV SP,#50H MOV A,#60H MOV P1,#55H MOV PSW,#90H MOV DPTR,#1234H END ;将位地址06H单元中的内容置0 ;将位地址07H单元中的内容置0 ( H)=0 ( H)=0 (20H)= ;将字节地址90H单元中的内容置FFH (90H)= ;将P1.0置0 ( H)=0 ;将P1.0置1 ( H)=1 ;将P1.1置0 ( H)=0 ;将P1.1置1 ( H)=1 ;程序结束 注释 ;表示程序从地址0200H存放 ;将立即数99H送到30H中 ;将立即数AAH送到45H中 ;将立即数50H送到堆栈指针SP中 ;将立即数60H送到累加器A中 ;将立即数55H送到P1口中 ;使工作寄存器工作于2区、进位位CY置1 ;将立即数1234H送到数据指针DPTR中 ;程序结束 检查数据 (30H)= (PC)= (45H)= (PC)= ( H)=50H (PC)= ( H)=60H (PC)= ( H)=55H (PC)= ( H)=90H (PC)= ( H)=12H ( H)=34H 参考程序3:数据缓冲区和特殊功能寄存器区的数据传送 地址 机器码 0200H 75 30 99 0203H 0206H 0209H 020BH 020EH 0211H 75 45 AA 75 81 50 74 60 75 90 55 75 D0 90 90 12 34 五、实验步骤

1. 新建设计文件。单击“文件”→“新建设计”,在弹出的“Create New Deign”对话框中选择“DEFAULT”模板后单击“OK”。

2. 设置图纸尺寸。单击“系统”→“设置图纸尺寸”,在弹出的“Sheet Size Configuration”对话框中选择“A4”图纸尺寸或自定义尺寸后单击“OK”。

3. 设置网格。单击“查看”→“网格”,网格显示(再次单击,网格不显示)。单击“查看”→“Snap xxth”(或Snap x.xin),可改变网格单位,默认为“Snap 0.1in”。

4. 保存设计文件。单击“文件”→“保存设计”,在弹出的“Save ISIS Design File”对话框中指定文件夹(如D盘 电信061××文件夹)、输入文件名“reg”并选择保存类型为“Design Files”后单击“保存”。

5. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。单击模式选择工具栏“元件”按钮,单击器件选择按钮“P”,在弹出的 “Pick Devices”(选取元器件)对话框的“Keywords”(关键字)栏中输入元器件名称“AT89C51”(也可以是分类、小类、属性值),与关键字匹配的元器件“AT89C51”显示在元器件列表(Results)中。双击选中的元器件“AT89C51”,便将所选元器件“AT89C51”加入到对象选择器窗口。单击“OK”完成元器件选取。参见图1-2选取元器件对话框。

6. 放置元器件。单击对象选择器窗口的元器件“AT89C51”,元器件名“AT89C51”变为

16

蓝底白字,预览窗口显示“AT89C51”元器件;单击方向工具栏按钮可实现元器件的左旋、右旋、水平和垂直翻转,以调整元器件的摆放方向;将鼠标指针移到编辑区某一位置,单击一次就可放置元器件“AT89C51”。按图2-3所示放置元器件。 7. 编辑元器件。单击模式选择工具栏“编辑”按钮,进入编辑状态。右击(或单击)元器件,该元器件变为红色表明被选中,鼠标指针放到被选中的元器件上,按住左键拖动,将鼠标移到编辑区某一位置松开,即完成元器件的移动。鼠标指针放到被选中的元器件上右击,单击弹出的快捷菜单中的方向工具栏按钮可实现元器件的旋转和翻转。右击被选中的元器件,可删除该元器件。被选中的元器件外单击,可撤销选中。

8. 放置终端。单击模式选择工具栏“终端”按钮,单击对象选择器窗口的电源终端“POWER”,该终端名背景变为蓝色,预览窗口显示该终端;单击方向工具栏“左旋转”按钮,电源终端逆时针旋转90°;将鼠标指针移到编辑区某一位置,单击一次就可放置一个终端。

9. 连线。单击命令工具栏“实时Snap(捕捉)”按钮,实时捕捉有效(再次单击,实

时捕捉无效),当鼠标指针接近引脚末端时,该处会自动出现一个小方框“□”,表明可以自动连接到该点。按图2-3所示单击要连线的元器件起点和终点,完成连线。

10. 添加源程序。单击“源文件”→“增加/移除源文件”,在弹出的“Add/Remove Source Code Files”对话框中单击“Code Generation Tool”栏下拉列表框按钮,选择“ASEM51”(51汇编器);单击新建源文件按钮“NEW”,在弹出的“New Source File”对话框中指定文件存放的文件夹,输入文件名“reg.asm”,单击“打开”,在单击打开的对话框中的按钮“是”;确认“Source Code Filename”栏下拉列表框中显示文件名为“reg.asm”,单击“OK”。

第一次使用该软件时,要按1.2.2节介绍的方法设置代码产生工具。 11. 编辑源程序。单击“源文件”→“reg.asm”,在“Source Editor”源文件编辑器中输入并编辑源程序,确认无误后,单击保存按钮。

12. 编译源程序。单击“源文件”→“构建所有”,弹出源程序编译窗口如图2-2所示。若编译不出错,则自动生成目标代码文件(格式为HEX);若编译出错,根据提示修改源程序并保存,直至编译成功。参见1.2.2节介绍的编译出错的解决办法。

图2-2 源程序编译窗口

13. 加载目标代码文件。先右击后单击单片机“AT89C51”,在弹出的“Edit Component”对话框中单击“Program File”栏的打开按钮,在弹出的“Select File Name”对话框找到刚才编译生成的HEX文件,单击“打开“按钮,完成HEX文件加载;同时将“Clock Frequency”

17

栏中的频率设为12MHz,单击“OK”,完成加载目标代码文件。

14. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。单击“调试”→“8051 CPU Registers”,单击“调试”→“8051 CPU SFR Memory”,单击“调试”→“8051 CPU Internal (IDATA) Memory”,单击“调试”→“8051 CPU Source Code”,分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,可执行一条指令;通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。程序调试窗口如图2-3所示。

图2-3 程序调试窗口

六、实验分析与总结

1. 在实验过程中,要注意选取元器件、编辑元器件、连接电路、源程序编辑、汇编编译和加载目标代码文件的操作步骤。

2. 单步运行程序过程中,要随时查看相关单元的内容,并与理论分析结果对比;发现错误,应及时查找原因。

七、实验思考

1. 程序计数器PC在专用寄存器区有无地址?

18

2. 位寻址区(单元地址20H~2FH)能否作一般RAM区使用?

2.2 数据传送指令实验

一、实验目的

1.掌握内部RAM和外部RAM数据传送指令的用法。 2.掌握数据交换和堆栈指令的特点。

3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

三、实验内容

将数据传送类指令分成四类,分别编写四个小程序,以完成数据在不同区域内的传送、交换。

1.参考程序1----内部RAM数据传送

(1)将立即数#12H、#34H、#56H分别传送至内部RAM区40H、R2、A中。

(2)将内部RAM区40H、R2、A中的内容分别传送至R0、内部RAM区50H和12H中。 2. 参考程序2----外部RAM数据传送

(1)将立即数#2000H、#30H、#55H分别传送至DPTR、R1、A中。 (2)将A中的内容分别传送至外部RAM区2000H、30H中。 3. 参考程序3----数据交换

(1)将立即数#65H、#60H、#24H分别传送至内部RAM区60H、R0、A中。 (2)将A中高低半字节交换。

(3)将A中的内容与内部RAM区60H中的内容交换。 (4)将A中的内容与R0中的内容交换。 4. 参考程序4----堆栈操作

(1)将栈底指针调至30H,并将立即数#20H、#40H分别传送至内部RAM区70H、A中。 (2)将内部RAM区70H、A中的内容分别压入堆栈区中。 (3)将堆栈区中的内容分别弹出至A、内部RAM区50H中。

四、实验参考程序

参考程序1:内部RAM数据传送 地址 0000H 0003H 0005H 0007H

机器码 75 40 12 7A 34 74 56 A8 40 源程序 ORG 0000H MOV 40H,#12H MOV R2,#34H MOV A,#56H MOV R0,40H 19

检查数据 (40H)= (R2)= (A)= (P)= (R0)= 0009H 000BH 地址 0100H 0103H 0105H 0107H 0108H 地址 0200H 0203H 0205H 0207H 0208H 0209H 地址 0300H 0303H 0306H 0308H 030AH 030CH 030EH 8A 50 F6 机器码 90 20 00 79 30 74 55 FO F3 机器码 75 60 65 78 60 74 24 C4 C6 C8 机器码 75 81 30 75 70 20 74 40 C0 70 C0 EO D0 70 D0 EO MOV 50H,R2 MOV @R0,A END 源程序 ORG 0100H MOV DPTR,#2000H MOV R1,#30H MOV A,#55H MOVX @DPTR,A MOVX @R1,A END 源程序 ORG 0200H MOV 60H,#65H MOV R0,#60H MOV A,#24H SWAP A XCH A,@R0 XCH A,R0 END 源程序 ORG 0300H MOV SP,#30H MOV 70H,#20H MOV A,#40H PUSH 70H PUSH ACC POP 70H POP ACC END (50H)= (12H)= (R0)= 检查数据 (DPTR)= (R1)= (A)= (P)= (2000H)= (DPTR)= (30H)= (R1)= 检查数据 (60H)= (R0)= (A)= (A)= (60H)= (A)= (R0)= (A)= (R0)= 检查数据 (SP)= (70H)= (A)= (SP)= (31H)= (SP)= (32H)= (SP)= (70H)= (SP)= (A)= 参考程序2:外部RAM数据传送 参考程序3:数据交换 参考程序4:堆栈操作 五、实验步骤

步骤与2.1节相似,本章以后各节只列出几大步骤和每个步骤与2.1节不同的要求,不再详细叙述具体操作过程。

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“mov”。 2. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。

3. 放置元器件、编辑元器件、放置终端、连线。按图2-3所示放置元器件并连线。 4. 添加源程序、编辑源程序、编译源程序。源文件名为“mov.asm”。 5. 加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。 6. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,可执行一条指令,通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。

20

六、实验分析与总结

1. 将每执行一条指令后的理论分析结果与实验中检查的数据进行比较,若不一致,请查找原因。

2. 分析堆栈指针SP内容和堆栈区内的内容与压入或弹出指令的对应关系。

七、实验思考

1. MOV、MOVX和MOVC三类指令有什么区别?

2.编写一个将内部RAM区40H中的内容传送至外部RAM区3000H中的程序。

2.3 算术运算指令实验

一、实验目的

1.掌握单字节的加减法指令的使用。 2.掌握单字节的乘除法指令的使用。

3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

三、实验内容

将算术运算指令分成两类,分别编写两个小程序,以完成数据的加减法、乘除法运算。 1.参考程序1----加减法运算

(1)将立即数#B5H、#36H、#89H分别传送至内部RAM区40H、R2、A中。

(2)将内部RAM区40H中的内容与A中的内容相加,然后再与R2中的内容相加,结果存放至内部RAM区50H中。

(3)将A中的内容与内部RAM区40H中的内容相减,结果存放至内部RAM区60H中。 2. 参考程序2----乘除法运算

(1)将立即数#75H、#31H分别传送至内部RAM区15H、33H中。 (2)将内部RAM区15H单元的内容与33H单元的内容相乘。

(3)将乘积的高8位和低8位分别传送至内部RAM区31H、30H中。 (4)将内部RAM区15H单元的内容除以33H单元的内容。 (5)将商和余数分别传送至内部RAM区41H、40H中。

四、实验参考程序

参考程序1:加减法运算 地址

机器码 源程序 ORG 0050H 21

检查数据 0050H 0053H 0055H 0057H 0059H 005AH 005CH 005EH 地址 0150H 0153H 0156H 0158H 015BH 015CH 015EH 0161H 0163H 0166H 0167H 0169H 75 40 B5 7A 36 74 89 25 40 3A F5 50 95 40 F5 60 机器码 75 15 75 75 33 31 E5 15 85 33 FO A4 F5 30 85 F0 31 E5 15 85 33 FO 84 F5 41 85 F0 40 MOV 40H,#0B5H MOV R2,#36H MOV A,#89H ADD A,40H ADDC A,R2 MOV 50H,A SUBB A,40H MOV 60H,A END 源程序 ORG 0150H MOV 15H,#75H MOV 33H,#31H MOV A,15H MOV B,33H MUL AB MOV 30H,A MOV 31H,B MOV A,15H MOV B,33H DIV AB MOV 41H,A MOV 40H,B END (40H)= (R2)= (A)= (P)= (A)= (CY)= (AC)= (40H)= (A)= (CY)= (AC)= (R2)= (50H)= (A)= (A)= (CY)= (AC)= (40H)= (60H)= (A)= 检查数据 (15H)= (33H)= (A)= (B)= (A)= (B)= (OV)= (30H)= (31H)= (A)= (B)= (A)= (B)= (OV)= (41H)= (40H)= 参考程序2:乘除法运算 五、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“add”。 2. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。

3. 放置元器件、编辑元器件、放置终端、连线。按图2-3所示放置元器件并连线。 4. 添加源程序、编辑源程序、编译源程序。源文件名为“mov.asm”。 5. 加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。 6. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,可执行一条指令;通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。

六、实验分析与总结

1. 将每执行一条指令后的理论分析结果与实验中检查的数据进行比较,若不一致,请查找原因。

2. 分析不带进位的加法指令和带进位的加法指令的区别。

七、实验思考

1. BCD码调整指令能否直接用于减法指令后面?

22

2.执行除法指令时,若寄存器B的内容为0,结果会如何?

2.4 逻辑运算指令实验

一、实验目的

1.掌握逻辑“与”、“或”、“异或”指令的使用。 2.掌握移位指令的使用。

3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

三、实验内容

将逻辑运算指令分成两类,分别编写两个小程序,以完成数据的逻辑运算、移位。 1.参考程序1----逻辑“与”、“或”、“异或”运算 (1)将立即数#E6H、#82H分别传送至P0、A中。

(2)将P0的高4位保留、低4位屏蔽,A的高4位屏蔽、低4位保留。 (3)将P0与A进行逻辑“或”运算。

(4)将P0与立即数#AAH进行逻辑“异或”运算。 2. 参考程序2----移位操作

(1)将立即数#88H、#03H分别传送至内部RAM区60H、70H中。

(2)将内部RAM区60H单元的内容除以4, 结果传送至内部RAM区61H。 (3)将内部RAM区70H单元的内容乘4, 结果传送至内部RAM区71H。

(4)将内部RAM区60H单元的内容带进位右移两次, 结果传送至内部RAM区62H。 (5)将内部RAM区70H单元的内容带进位左移两次, 结果传送至内部RAM区72H。

四、实验参考程序

参考程序1:逻辑“与”、“或”、“异或”运算 地址 0030H 0033H 0035H 0038H 003AH 003CH 地址

机器码 75 90 E6 74 82 53 90 F0 54 0F 42 90 63 90 AA 机器码 源程序 ORG 0030H MOV P1,#0E6H MOV A,#82H ANL P1,#0FOH ANL A,#0FH ORL P1,A XRL P1,#0AAH END 源程序 ORG 0130H 23

检查数据 (P1)= (A)= (PSW.0)= (P1)= (A)= (PSW.0)= (P1)= (P1)= 检查数据 参考程序2:移位操作 0130H 0133H 0136H 0138H 0139H 013AH 013CH 013EH 013FH 0140H 0142H 0144H 0145H 0146H 0147H 0149H 014BH 014CH 014DH 014EH 75 60 88 75 70 03 E5 60 03 03 F5 61 E5 70 23 23 F5 71 E5 60 D3 13 13 F5 62 E5 70 D3 33 33 F5 72 MOV 60H,#88H MOV 70H,#03H MOV A,60H RR A RR A MOV 61H,A MOV A,70H RL A RL A MOV 71H,A MOV A,60H SETB C RRC A RRC A MOV 62H,A MOV A,70H SETB C RLC A RLC A MOV 72H,A END (60H)= (70H)= (A)= (A)= (A)= (61H)= (A)= (A)= (A)= (71H)= (A)= (CY)= (A)= (A)= (62H)= (A)= (CY)= (A)= (A)= (72H)= 五、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“logic”。 2. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。

3. 放置元器件、编辑元器件、放置终端、连线。按图2-3所示放置元器件并连线。 4. 添加源程序、编辑源程序、编译源程序。源文件名为“logic.asm”。 5. 加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。 6. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,可执行一条指令;通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。

六、实验分析与总结

1. 将每执行一条指令后的理论分析结果与实验中检查的数据进行比较,若不一致,请查找原因。

2. 分析不带进位的移位指令和带进位的移位指令的区别。

七、实验思考

1. 执行求反指令CPL A后,程序状态寄存器的奇偶标志位P有无变化? 2.P3口作为输入口时,要想保留高4位数据到累加器A中,应如何编程?

24

2.5 控制转移指令实验

一、实验目的

1.掌握无条件转移指令和条件转移指令的使用。 2.掌握调用指令和返回指令的使用。

3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

三、实验内容

根据控制转移类指令的不同用途,分别编写二个小程序,以完成程序在不同条件下的转移、调用。

1.参考程序1----累加器A判零转移指令和无条件转移指令 (1)将立即数#01H传送至A中。

(2)判断A中的内容,若(A)=00H,则顺序执行MOV A,#02H指令;若(A)≠00H,则转移执行DEC A指令;循环往复。

2. 参考程序2----减1非零转移指令、调用指令和返回指令 (1)将片内RAM20H~22H单元全部送入立即数#11H。

(2)调用子程序将立即数#55H传送至片内RAM22H单元中。

(3)返回主程序将立即数#55H分别传送至片内RAM20H、21H单元中。

四、实验参考程序

参考程序1:累加器A判零转移指令和无条件转移指令 地址 0000H 0230H 0232H 0234H 0236H 0237H 0238H 地址 0000H 0320H 0323H 0325H

机器码 41 30 74 01 70 03 74 02 OO 14 80 F8 机器码 02 03 20 75 81 30 78 20 7A 03 源程序 ORG 0000H AJMP MAIN ORG 0230H MAIN: MOV A,#01H L1: JNZ L2 MOV A,#02H NOP L2: DEC A SJMP L1 END 源程序 ORG 0000H LJMP MAIN ORG 0320H MAIN: MOV SP,#30H MOV R0,#20H MOV R2,#03H 25

检查数据 (A)= (A)= (A)= (A)= 检查数据 (SP)= (R0)= (R2)= 参考程序2:减1非零转移指令、调用指令和返回指令 0327H 0329H 032AH 032BH 032DH 032EH 0331H 0334H 0337H 0340H 0343H 74 11 F6 08 DA FC 00 12 03 40 75 20 55 75 21 55 80 FE 75 22 55 22 MOV A,#11H LP: MOV @R0,A INC R0 DJNZ R2,LP NOP LCALL L1 MOV 20H,#55H MOV 21H,#55H SJMP $ ORG 0340H L1: MOV 22H,#55H RET END (A)= (20H)= (21H)= (22H)= (R0)= (R2)= (SP)= (31H)= (32H)= (20H)= (21H)= (22H)= (20H)= (21H)= (22H)= (20H)= (21H)= (22H)= 五、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“jump”。 2. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。

3. 放置元器件、编辑元器件、放置终端、连线。按图2-3所示放置元器件并连线。 4. 添加源程序、编辑源程序、编译源程序。源文件名为“jump.asm”。 5. 加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。 6. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,可执行一条指令;通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。

六、实验分析与总结

1. 将每执行一条指令后的理论分析结果与实验中检查的数据进行比较,若不一致,请查找原因。

2. 分析累加器A判零转移指令和减1非零转移指令的偏移量的区别。

七、实验思考

1.若将参考程序1中的指令JNZ L2改为CJNE A,#00H,L2,参考程序1的执行结果如何?

2.若将参考程序2中的指令LCALL L1改为 ACALL L1,该指令的机器码如何翻译?

2.6 位操作指令实验

一、实验目的

1.掌握位传送、运算、置位、清零指令的使用。 2.掌握位转移指令的使用。

26

3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

三、实验内容

根据位操作类指令的不同用途,分别编写二个小程序,以完成程序在不同情况下的位传送、运算、置位、清零、转移。

1.参考程序1----位传送、运算、置位、清零指令 (1)将ACC.0、B.0置1,P2.1、P3.2置0。

(2)编程计算逻辑方程P1.7=ACC.0∧(B.0∨P2.1)∧/P3.2。 2. 参考程序2----位转移指令

(1)将立即数#87H、#5BH、#11H分别传送至P1、A、内部RAM区20H和24H中。

(2)判断P1中的内容,若(P1.3)=0,则顺序执行JBC ACC.3,L2指令;若(P1.3)≠0,则转移执行MOV 20H,P1指令。

(3)判断A中的内容,若(ACC.3)=0,则顺序执行MOV 20H,P1指令;若(ACC.3)≠0,则转移并把ACC.3位置0,然后执行MOV 20H,A指令。

四、实验参考程序

参考程序1:位传送、运算、置位、清零指令 地址 0000H 0002H 0004H 0006H 0008H 000AH 000CH 000EH 0010H 地址 0000H 0130H 0133H 0135H 0138H 013BH 013EH 0141H 0143H

机器码 D2 E0 D2 F0 C2 A1 C2 B2 A2 F0 72 A1 82 E0 A0 B2 92 97 机器码 21 30 75 90 87 74 5B 75 20 11 20 93 03 10 E3 03 85 90 20 F5 20 A2 E3 源程序 ORG 0000H SETB ACC.0 SETB B.0 CLR P2.1 CLR P3.2 MOV C,B.0 ORL C,P2.1 ANL C,ACC.0 ORL C,/P3.2 MOV P1.7,C END 源程序 ORG 0000H AJMP MAIN ORG 0130H MAIN: MOV P1,#87H MOV A,#5BH MOV 20H,#11H JB P1.3,L1 JBC ACC.3,L2 L1: MOV 20H,P1 L2: MOV 20H,A MOV C,ACC.3 27

检查数据 (ACC.0)= (B.0)= (P2.1)= (P3.2)= (CY)= (CY)= (CY)= (CY)= (P1.7)= 检查数据 (P1)= (A)= (P1.3)= (ACC.3)= (20H)= (20H)= (ACC.3)= (CY)= 参考程序2:位转移指令 0145H 0148H 75 24 11 92 20 MOV 24H,#11H MOV 20H,C END (24H)= (24H)= 五、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“bit”。 2. 选取元器件。从Proteus元器件库中选取元器件AT89C51(单片机)。 3. 放置元器件、编辑元器件、放置终端、连线。按图2-3所示放置元器件并连线。 4. 添加源程序、编辑源程序、编译源程序。源文件名为“bit.asm”。 5. 加载目标代码文件。“Clock Frequency”栏中的频率要设为12MHz。 6. 仿真。单击仿真工具栏“单步运行”按钮,进入单步运行状态。分别打开工作寄存器窗口、特殊功能寄存器窗口、片内数据存储器窗口和源代码调试窗口。

单击源代码调试窗口“单步执行”按钮一次,执行一条指令;通过各调试窗口观察每条指令执行后数据处理的结果,以加深对硬件结构和指令的理解。

六、实验分析与总结

1. 将每执行一条指令后的理论分析结果与实验中检查的数据进行比较,若不一致,请查找原因。

2. 分析参考程序2的MOV 20H,A 和MOV 20H,C两条指令中的20H的区别。

七、实验思考

1.若将参考程序2的JBC ACC.3,L2指令改为JNB ACC.3,L2指令,结果是否一样? 2.若将参考程序2的JB P1.3,L1指令改为JNB P1.3,L1指令,结果是否一样?

28

第3章 单片机程序设计实验

3.1 流水灯实验

一、实验目的

1.了解单片机I/O口的基本输出功能。 2.掌握用P1口实现简单控制的方法。

3. 掌握用Proteus实现单片机系统仿真的方法。

二、实验预备知识

循环程序是最常见的程序之一。在程序设计时,对需要多次重复执行的某段程序使用循环程序设计,这样不仅可优化程序结构,而且可以简化程序。循环程序的结构一般包括以下几部分。

1. 循环初始化

循环初始化是进入循环处理前必须要有的一个环节,用于完成循环前的准备工作。循环初始化包括给工作寄存器(或其他存储单元)设置计数初值、地址指针、数据块长度等。

2. 循环处理

循环处理是需要多次重复执行的程序段。循环处理是循环程序的核心,用于完成主要的计算和操作任务。

3. 循环控制

循环控制是用条件转移指令控制循环是否继续。每循环一次,根据循环结束条件进行一次判断;当满足条件时,停止循环,继续执行其他程序;否则,再作循环。

4. 循环结束

循环结束用于存放循环程序的执行结果,同时恢复相关工作单元的初值。

循环程序一般有两种编写方法。一种是先循环控制后循环处理(即先判断后处理),其流程如图3-1(a)所示;另一种是先循环处理后循环控制(即先处理后判断),其流程如图3-1(b)所示。

循环程序的循环体内包含有其他循环程序,称为多重循环程序,又称为循环嵌套。 多重循环程序中的各重循环不能有交叉,不能从外循环跳入内循环,只能外循环内嵌套内循环。两重循环程序流程如图3-2所示。

本实验中参考程序1的延时子程序采用两重循环结构,延时0.36秒。若晶振频率为6MHz,则机器周期为2?s,延时程序的延时时间计算方法如下:

[1+(1+(1+2)×249+2)×240+2]×2?s=360006?s=0.360006s

三、实验内容

利用P1口的通用I/O口功能, P1口做输出口,通过程序向P1口传送数据,用八只发光

29

二极管分别显示P1.7~P1.0各管脚的电平状态。编写程序,控制八只发光二极管按一定的规律循环点亮。晶振频率6MHz。

开始 循环初始化1 循环处理1 循环初始化2 循环处理2 开始 循环初始化 循环控制 N 循环处理 循环控制2 N 条件满足? Y 循环控制1 条件满足? Y 循环结束 结束 条件满足? 循环结束 结束 N

(a) (b)

图3-1 循环程序流程图 图3-2 两重循环程序流程图

四、实验参考电路

P1口接发光二极管的阴极,P1口的管脚输出低电平时对应的发光二极管点亮,实验电路图如图3-3所示。

30

C130pFX1C230pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C310uFR9CRYSTAL10k18XTAL29RSTR1330R2330R3330R4330R5330R6330R7330R8330293031PSENALEEAD1D2D3D4D5D6D7D8LED-RED12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 图3-3 流水灯实验电路

五、实验参考程序

参考程序1:八只发光二极管同时交替亮灭。

地址 0000H 0003H 0005H 0008H 000AH 000CH 000EH 0010H 0011H 0013H 0015H 地址 0000H 1000H 1002H 1004H 1007H 1008H 100AH 100CH 100EH 1010H

机器码 75 90 00 11 0C 75 90 FF 11 0C 80 F4 7B F0 7C F9 00 DC FD DB F9 22 机器码 02 10 00 74 7F F5 90 12 10 0A 03 80 F8 78 80 79 00 D9 FE D8 FA 源程序 ORG 0000H START: MOV P1,#00H ACALL DELAY MOV P1,#0FFH ACALL DELAY SJMP START DELAY: MOV R3,#240 DEL2: MOV R4,#249 DEL1: NOP DJNZ R4,DEL1 DJNZ R3,DEL2 RET END 源程序 ORG 0000H LJMP MAIN ORG 1000H MAIN: MOV A,#7FH L1: MOV P1,A LCALL DELAY RR A SJMP L1 DELAY: MOV R0,#80H DELAY1: MOV R1,#00H DELAY2: DJNZ R1,DELAY2 DJNZ R0,DELAY1 31

注释 ;表示程序从地址0000H存放 ;将P1口8个管脚置0 ;调用延时子程序 ;将P1口8个管脚置1 ;调用延时子程序 ;返回,从START开始重复 ;延时子程序 ;子程序返回 ;程序结束 注释 ;表示程序从地址0000H存放 ;表示程序从地址1000H存放 ;将A的内容通过P1口输出 ;调用延时子程序 ;A右移一位 ;延时子程序 参考程序2:八只发光二极管循环点亮。 1012H 22 RET END ;子程序返回 ;程序结束 六、实验步骤

步骤与2.1节相似,以后各章节只列出几大步骤和每个步骤与2.1节不同的要求,不再详细叙述具体操作过程。

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“lamp”。 2. 选取元器件。从Proteus元器件库中选取元器件:AT89C51(单片机)、CRYSTAL(晶振)、CAP(电容)、CAP-ELEC(电解电容)、RES(电阻)、LED-RED(红色发光二极管)。

3. 放置元器件、编辑元器件、放置终端、连线。按图3-3所示放置元器件并连线。 4. 属性设置。先右击后单击元器件电容C1,在弹出的“Edit Component”对话框中将电容量改为30pF, 单击“OK”完成元器件电容C1属性编辑。同样方法编辑其他元器件属性。

5. 电气规则检测。单击“工具”→“电气规则检查”,弹出检查结果窗口,完成电气检测。若检测出错,根据提示修改电路图并保存,直至检测成功。电气规则检查窗口如图3-4所示。

图3-4 电气规则检查窗口 图3-5 添加项目对话框

6. 添加源程序、编辑源程序、编译源程序。源文件名为“lamp.asm”。 7. 加载目标代码文件。 “Clock Frequency”栏中的频率要设为6MHz。

8. 仿真。单击仿真工具栏“运行”按钮,单片机全速运行程序。单击“调试”→“Watch Windows”,单击“调试”→“8051 CPU Source Code”,分别打开观察窗口和源代码调试窗口。

在观察窗口右击弹出快捷菜单,单击“添加项目(By地址)”弹出“Add Memory Item”对话框,在“Name”栏输入R3,“Address”栏输入0x03,单击“Add”将工作寄存器R3添加到在观察窗口中;同样将R4也添加到在观察窗口中。添加项目对话框如图3-5所示。

通过编辑区电路图观察并记录八只信号灯的控制规律与设计是否相符。同时通过观察窗口观察延时子程序中所用的工作寄存器的值在调试过程中的变化规律。程序仿真窗口如图3-6所示。

32

图3-6 程序仿真窗口

七、实验分析与总结

1. 分析P1口8个管脚电平状态与对应的发光二极管亮灭状态之间的关系。 2. 找出控制P1口管脚电平状态的指令。 3. 找出控制时间长短的指令。

八、思考题

1. 如何改变发光二极管亮灭的间隔时间,使闪亮速度更快或更慢一些? 2. 你能再设计出几种不同的控制状态吗?

3.2 步进电机实验

一、实验目的

1.了解步进电机的基本原理。 2.掌握控制步进电机的编程方法。

3. 掌握用Proteus实现单片机系统仿真的方法。

二、实验预备知识

步进电动机是“一步一步”的转动的一种电动机,电源输入的电信号是脉冲信号(脉冲电压),每输入一个电脉冲,电动机就转过一个固定角度,故而,也称为脉冲电动机。

1. 基本概念

拍----从一种通电状态转换到另一种通电状态,叫一拍。

33

步距角θb----每一拍转子转过的角度。 2. 步进电动机的通电方式 例如:四相双四拍

四相:表示电动机有四相绕组,双:表示每一种通电状态都有两相绕组通电, 四拍:四种通电状态为一个循环

正转时通电顺序: AB→BC→CD→DA→AB→BC→CD→DA→AB ?? 反转时通电顺序: AB→DA→CD→BC→AB→DA→CD→BC→AB ??

3. 计算公式

步距角θb=360/mZ (度)

电机转速n=60f/mZ (转/分钟)

上式中 f为脉冲频率(Hz) ,m为拍数,Z为转子齿数 4. 步进电动机的特性

(1) 静态运行状态----步进电动机不改变通电的状态,一般用矩角特性M=f(θ)来表示。

(2)步进运行状态----脉冲频率较低,下一个脉冲到来之前,转子已完成一步,并且运动已经停止。

(3)高频恒速运行状态----脉冲频率较高, 电机作匀速运动,频率越高、速度越快。一般用矩频特性来表示。 5.步进电动机的特点

(1)步进电动机的步距(或转速)与脉冲频率成正比,它能按照控制脉冲的要求,立即启动、停止、正反转及变速,响应性好。

(2)位移与输入脉冲信号数相对应,在不丢步的情况下运行时,角位移的误差不会长期积累,可以组成结构较为简单的开环控制系统,也可在要求更高精度时组成闭环控制系统。 (3)步进电动机无刷,本体部件少,可靠性高,停止时可有自锁能力;步距角选择范围大,可在几十分至180°大范围内选择。

(4)速度可在相当宽的范围内平滑调节,用一台控制器控制几台步进电动机可使它们完全同步运行。

(5)步进电动机带惯性负载的能力较差,不能直接使用普通的交直流电源驱动。

步进电动机的应用范围广泛,除数控、工业控制和计算机外部设备中大量使用外,在工业自动线、印刷机、遥控指示装置、航空系统中,都在使用步进电动机。

三、实验内容

P1口做输出口控制四相步进电动机的四相绕组,编写程序,控制步进电动机每2s正向转动一步。晶振6MHz。

假设步进电动机的通电方式为四相双四拍,正转时的通电顺序是AB→BC→CD→DA;反转时的通电顺序是AB→DA→CD→BC。

因拍数m=4,假设使用的步进电动机转子齿数Z为5,则步距角θb=18°。实验要求步进电动机每2s正向转动一步,即脉冲周期T=2s,则f=0.5Hz,电机转速n=1.5r/min。

可采用三重循环结构设计2s的延时子程序。晶振频率为6MHz时,机器周期为2?s,延时程序的延时时间计算方法如下:

34

{1+[1+(1+1+2×123+2)×200+2]×20+2}×2?s=2000126?s=2.000126s

四、实验参考电路

假设用P1.0~P1.3口作为输出口分别控制步进电动机的四相绕组,控制电路图如图

3-7所示;根据硬件接线可推导出控制状态与P1口的控制码的对应关系,如表3-1所示。

C130pFX1C230pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C310uFR5CRYSTAL10k18XTAL29AB+88.8DCRSTU3:A21293031R1R2R3R410kU2ABCD916151413121110COM1C2C3C4C5C6C7CULN2003A1B2B3B4B5B6B7B1234567U3:B4PSENALEEA312345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51U3:C65U3:D1274LS0413 图3-7 步进电机实验电路

表3-1 控制状态与P1口的控制码的对应关系

控制状态 A相、B相绕组通电 B相、C相绕组通电 C相、D相绕组通电 D相、A相绕组通电 P1口 控制码 03H 06H 0CH 09H P1.7 0 0 0 0 P1.6 0 0 0 0 P1.5 0 0 0 0 P1.4 0 0 0 0 P1.3 D相 0 0 1 1 P1.2 C相 0 1 1 0 P1.1 B相 1 1 0 0 P1.0 A相 1 0 0 1 五、实验参考程序

地址 0000H

机器码 02 00 30 程序 ORG 0000H LJMP MAIN ORG 0030H 35

注释 ;表示程序从地址0000H存放 ;表示程序从地址0030H存放 0030H 0033H 0036H 0039H 003CH 003FH 0042H 0045H 0048H 0100H 0102H 0104H 0106H 0107H 0109H 010BH 010DH 75 90 03 12 01 00 75 90 06 12 01 00 75 90 0C 12 01 00 75 90 09 12 01 00 80 E6 7B 14 7F C8 7E 7B 00 DE FE DF F9 DB F5 22 MAIN:MOV P1,#03H LCALL DELAY MOV P1, #06H LCALL DELAY MOV P1, #0CH LCALL DELAY MOV P1, #09H LCALL DELAY SJMP MAIN ORG 0100H DELAY:MOV R3,#20 LP1:MOV R7,#200 LP2:MOV R6,#123 NOP LP3:DJNZ R6,LP3 DJNZ R7,LP2 DJNZ R3,LP1 RET END ;AB相通电 ;BC相通电 ;CD相通电 ;DA相通电 ;重复循环 ;表示程序从地址0100H存放 ;延时2s的循环次数 ;延时100ms的循环次数 ;延时0.5ms的循环次数 ;程序结束 六、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“step”。 2. 选取元器件。从Proteus元器件库中选取元器件:AT89C51(单片机)、CRYSTAL(晶振)、CAP(电容)、CAP-ELEC(电解电容)、RES(电阻)、MOTOR-STEPPER(步进电机)、ULN2003A(运放)、74LS04(反相器)。

3. 放置元器件、编辑元器件、放置终端、连线。按图3-7所示放置元器件并连线。 4. 设置元器件属性并进行电气规则检测。先右击再单击各元器件,按图3-7所示设置元器件的属性值。单击 “工具”→“电气规则检查”,完成电气检测。

5. 添加源程序、编辑源程序、编译源程序。源文件名为“step.asm”。 6. 加载目标代码文件。 “Clock Frequency”栏中的频率要设为6MHz。 7. 仿真。单击仿真工具栏“运行”按钮,单片机全速运行程序。单击“调试”→“Watch Windows”,单击“调试”→“8051 CPU Source Code”,分别打开观察窗口和源代码调试窗口。

在观察窗口右击弹出快捷菜单,单击“添加项目(By地址)”弹出“Add Memory Item”对话框,在“Name”栏输入R7,“Address”栏输入0x07,单击“Add”将工作寄存器R7添加到在观察窗口中;同样方法将R3、R6也添加到在观察窗口中。

通过编辑区电路图观察并记录步进电机旋转的方向和速度与设计是否相符。同时通过观察窗口观察延时子程序中所用的工作寄存器的值在调试过程中的变化规律。程序仿真窗口参见图3-6。

单击仿真工具栏“停止”按钮,先右击再单击步进电机,在弹出的“Edit Component”对话框中将“Step Angle”中的步距角修改后,单击“OK”完成修改。单击仿真工具栏“运行”按钮,单片机全速运行程序,观察步进电机的旋转速度的变化并与修改前比较。

36

七、实验分析与总结

1. 分析延时子程序与脉冲频率的关系。 2. 分析电机转速与脉冲频率的关系。

八、实验思考

1. 要使步进电动机每2s反转18°,应如何修改程序?

2. 要使步进电动机的正向转速为30r/min,应如何修改程序?

3.3 汽车转向信号灯控制实验

一、实验目的

1.掌握多分支程序的设计方法。

2.掌握用分支程序编程控制汽车转向信号灯的方法。 3. 掌握用Proteus调试汇编源程序的方法。

二、实验内容

P1口做输出口控制汽车转向信号灯,用P3口做输入口接五只控制开关,设计一个汽车转向信号灯控制系统。晶振频率6MHz。具体要求如下:

(1) 正常驾驶时,接通左转弯开关,左转弯灯、左头灯、左尾灯同时闪烁;接通右转弯开关,右转弯灯、右头灯、右尾灯同时闪烁,闪烁频率为1Hz。

(2) 刹车时,接通刹车开关,左尾灯、右尾灯同时亮。

(3) 停靠站时,接通停靠开关,左头灯、右头灯、左尾灯、右尾灯同时闪烁,闪烁频率为1Hz。

(4) 出现紧急情况时,接通紧急开关,左转弯灯、右转弯灯、左头灯、右头灯、左尾灯、右尾灯同时闪烁,闪烁频率为5Hz。

三、实验参考电路

假设P1口输出低电平时灯被点亮,实验时可用发光二极管替代灯;假设控制开关输出低电平有效,控制开关的信号通过P3口送入单片机,控制开关与P3口各管脚的对应关系如表3-2所示。汽车转向信号灯控制电路图如图3-8所示。根据硬件接线可推导出控制状态与P1口的控制码的对应关系,如表3-3所示。

3-2 控制开关与P3口各管脚的对应关系表 P3口管脚 控制状态 P3.7 P3.6 P3.5 P3.4 紧急 P3.3 停靠 P3.2 刹车 P3.1 右转弯 P3.0 左转弯

3-3 控制状态与P1口控制码的信号灯的对应关系表

37

控制 状态 左转弯 右转弯 刹车 停靠 紧急 P1口 控制码 57H ABH F3H C3H 03H P1.7 左转弯灯 0 1 1 1 0 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 1 1 1 1 1 1 1 1 1 1 右转弯灯 左头灯 右头灯 1 0 1 1 0 0 1 1 0 0 1 0 1 0 0 左尾灯 右尾灯 0 1 0 0 0 1 0 0 0 0 C130pFX1C230pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617SW-SPSTC310uFR7CRYSTAL10k18XTAL29RSTR1330R2330R3330R4330R5330R6330293031PSENALEEAD5LED-REDD6LED-REDR810kR910kR1010kR1110kR1210kD3LED-GREEND4LED-GREEN12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51SW1SW2SW3SW4SW5D1LED-YELLOWD2LED-YELLOW 图3-8 汽车转向信号灯控制实验电路

四、实验参考程序

地址 0000H 0030H 0033H 0035H 0038H 003BH 003EH 0041H 0044H 0046H 0049H 004CH 004FH

机器码 02 00 30 75 B0 FF E5 B0 30 E4 0E 30 E3 19 30 E2 24 30 E1 2C 30 E0 37 80 EA 75 90 03 12 01 00 75 90 FF 12 01 00 程序 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV P3,#0FFH MOV A,P3 JNB ACC.4,JJ JNB ACC.3,TK JNB ACC.2,SC JNB ACC.1,YZW JNB ACC.0,ZZW SJMP MAIN JJ: MOV P1,#03H LCALL DELAY1 MOV P1,#0FFH LCALL DELAY1 38

注释 ;读P3口输入数据 ;ACC.4=0,转移到紧急状态 ;ACC.3=0,转移到停靠状态 ;ACC.2=0,转移到刹车状态 ;ACC.1=0,转移到右转弯状态 ;ACC.0=0,转移到左转弯状态 ;紧急状态 ;0.1s延时 ;信号灯全灭 0052H 0054H 0057H 005AH 005DH 0060H 0062H 0065H 0068H 006BH 006DH 0070H 0073H 0076H 0079H 007BH 007EH 0081H 0084H 0087H 0100H 0102H 0104H 0105H 0107H 0109H 0200H 0202H 0204H 0206H 0207H 0209H 020BH 020DH 80 DC 75 90 C3 12 02 00 75 90 FF 12 02 00 80 CE 75 90 F3 12 02 00 75 90 FF 80 C0 75 90 AB 12 02 00 75 90 FF 12 02 00 80 B5 75 90 57 12 02 00 75 90 FF 12 02 00 80 A7 7B 64 7A F8 00 DA FE DB F9 22 7C 05 7B 64 7A F8 00 DA FE DB F9 DC F5 22 TK: SC: YZW: ZZW: DELAY1: DEL1: DEL2: DELAY2: DEL3: DEL4: DEL5: SJMP MAIN MOV P1,#0C3H LCALL DELAY2 MOV P1,#0FFH LCALL DELAY2 SJMP MAIN MOV P1,#0F3H LCALL DELAY2 MOV P1,#0FFH SJMP MAIN MOV P1,#0ABH LCALL DELAY2 MOV P1,#0FFH LCALL DELAY2 SJMP MAIN MOV P1,#57H LCALL DELAY2 MOV P1,#0FFH LCALL DELAY2 SJMP MAIN ORG 0100H MOV R3,#100 MOV R2,#248 NOP DJNZ R2,DEL2 DJNZ R3,DEL1 RET ORG 0200H MOV R4,#5 MOV R3,#100 MOV R2,#248 NOP DJNZ R2,DEL5 DJNZ R3,DEL4 DJNZ R4,DEL3 RET END ;停靠状态 ;0.5s延时 ;信号灯全灭 ;刹车状态 ;0.5s延时 ;信号灯全灭 ;右转弯状态 ;0.5s延时 ;信号灯全灭 ;左转弯状态 ;0.5s延时 ;信号灯全灭 ;0.1s延时子程序 ;0.1s循环次数 ;1ms循环次数 ;子程序返回 ;0.5s延时子程序 ;0.5s循环次数 ;100ms循环次数 ;1ms循环次数 ;子程序返回 五、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“bus”。 2. 选取元器件。从Proteus元器件库中选取元器件:AT89C51(单片机)、CRYSTAL(晶振)、CAP(电容)、CAP-ELEC(电解电容)、RES(电阻)、LED-YELLOW(黄色发光二极管)、LED-GREEN(绿色发光二极管)、LED-RED(红色发光二极管)、SW-SPST(单刀单掷开关)。

3. 放置元器件、编辑元器件、放置终端、连线。按图3-8所示放置元器件并连线。 4. 设置元器件属性并进行电气规则检测。先右击再单击各元器件,按图3-8所示设置元器件的属性值。单击 “工具”→“电气规则检查”,完成电气检测。

39

5. 添加源程序、编辑源程序、编译源程序。源文件名为“bus.asm”。 6. 加载目标代码文件。 “Clock Frequency”栏中的频率要设为6MHz。 7. 仿真。单击仿真工具栏“运行”按钮SW5,观察并记录六只信号灯的控制规律。

,单片机全速运行程序。拨动控制开关SW1~

六、实验分析与总结

1. 分析主程序中JNB指令的作用。

2. 分析控制开关与汽车信号灯的对应关系。若同时有两个或两个以上开关输出信号有效,此时程序应执行哪一个分支程序?

七、思考题

1. 若用JB指令代替JNB指令,应如何修改程序?

3.4 步进电机控制实验

一、实验目的

1.掌握散转程序的四种设计方法。

2.掌握用散转程序编程控制步进电机的方法。 3. 掌握用Proteus调试汇编源程序的方法。

二、实验预备知识

分支的出口有两个以上时,形成散转程序,一般用散转指令来实现,设计方法有4种。分别是转移指令表法、地址偏移量表法、转向地址表法和利用RET指令法。

三、实验内容

用P3口做输入口接两只控制开关SW1~SW2,SW1控制电机的速度,SW2控制电机的方向, P1口做输出口控制四相步进电动机;利用RET指令编写程序,使两只控制开关控制步进电动机以不同的方向和速度转动。晶振6MHz。控制要求如下:

P3.5=0 P3.4=0 时 步进电动机低速正转,转速n=60转/分 P3.5=0 P3.4=1 时 步进电动机低速反转,转速n=60转/分 P3.5=1 P3.4=0 时 步进电动机高速正转,转速n=300转/分 P3.5=1 P3.4=1 时 步进电动机高速反转,转速n=300转/分 转速n=60 r/min时,利用公式计算得f =20Hz,T=1/f =1/20=50ms 转速n=300 r/min时,利用公式计算得f =100Hz,T=1/f =1/100=10ms

四、实验参考电路

假设用P1.0~P1.3口作为输出口分别控制步进电动机的四相绕组,控制开关SW1~SW2分别接P3.5和P3.4,控制电路图如图3-9所示;根据硬件接线可推导出控制状态与P1口

40

的控制码的对应关系,如表3-1所示。

C130pFX1C230pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C310uFR5CRYSTAL10k18XTAL29ADRSTB+88.8CU3:A21293031R1R2R3R410kU2ABCD916151413121110COM1C2C3C4C5C6C7CULN2003A1B2B3B4B5B6B7B1234567U3:B4PSENALEEAR610kR710k312345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51U3:C65U3:D1274LS0413SW-SPSTSW1SW2 图3-9 步进电机控制实验电路

五、实验参考程序

地址 0000H 0030H 0033H 0035H 0037H 0038H 0039H 003AH 003BH 003EH 003FH 0041H 0042H 0043H 0045H 0050H 0052H

机器码 02 00 30 75 B0 FF E5 B0 54 30 C4 23 F9 04 90 00 50 93 C0 E0 E9 93 C0 EO 22 00 60 00 80 程序 ORG 0000H LJMP START ORG 0030H START: MOV P3,#0FFH MOV A,P3 ANL A,#30H SWAP A RL A MOV R1,A INC A MOV DPTR,#TABLE MOVC A,@A+DPTR PUSH ACC MOV A,R1 MOVC A,@A+DPTR PUSH ACC RET ORG 0050H TABLE: DW BR0 DW BR1 41

注释 ;程序从地址0000H存放 ;程序从地址0030H存放 ;读输入数据 ;屏蔽掉无关位 ;转移地址表的基地址送DPTR ;查表并取出转移地址的低8位 ;转移地址的低8位压入堆栈区 ;恢复A ;查表并取出转移地址的高8位 ;转移地址的高8位压入堆栈区 ;从堆栈区弹出转移地址送PC ;程序从地址0050H存放 ;转移地址表 0054H 0056H 0060H 0063H 0066H 0069H 006CH 006FH 0072H 0075H 0078H 0080H 0083H 0086H 0089H 008CH 008FH 0092H 0095H 0098H 00A0H 00A3H 00A6H 00A9H 00ACH 00AFH 00B2H 00B5H 00B8H 00C0H 00C3H 00C6H 00C9H 00CCH 00CFH 00D2H 00D5H 00D8H

00 A0 00 C0 75 90 03 12 01 00 75 90 06 12 01 00 75 90 0C 12 01 00 75 90 09 12 01 00 80 B6 75 90 03 12 01 00 75 90 09 12 01 00 75 90 0C 12 01 00 75 90 06 12 01 00 80 96 75 90 03 12 01 50 75 90 06 12 01 50 75 90 0C 12 01 50 75 90 09 12 01 50 02 00 30 75 90 03 12 01 50 75 90 09 12 01 50 75 90 0C 12 01 50 75 90 06 12 01 50 02 00 30 DW BR2 DW BR3 ORG 0060H BR0:MOV P1,#03H LCALL DELAY1 MOV P1, #06H LCALL DELAY1 MOV P1, #0CH LCALL DELAY1 MOV P1, #09H LCALL DELAY1 SJMP START ORG 0080H BR1:MOV P1,#03H LCALL DELAY1 MOV P1, #09H LCALL DELAY1 MOV P1, #0CH LCALL DELAY1 MOV P1, #06H LCALL DELAY1 SJMP START ORG 00A0H BR2:MOV P1,#03H LCALL DELAY2 MOV P1, #06H LCALL DELAY2 MOV P1, #0CH LCALL DELAY2 MOV P1, #09H LCALL DELAY2 LJMP START ORG 00C0H BR3:MOV P1,#03H LCALL DELAY2 MOV P1, #09H LCALL DELAY2 MOV P1, #0CH LCALL DELAY2 MOV P1, #06H LCALL DELAY2 LJMP START ORG 0100H 42

;程序从地址0060H存放 ;AB相通电 ;BC相通电 ;CD相通电 ;DA相通电 ;重复循环 ;程序从地址0080H存放 ;AB相通电 ;DA相通电 ;CD相通电 ;BC相通电 ;重复循环 ;程序从地址00A0H存放 ;AB相通电 ;BC相通电 ;CD相通电 ;DA相通电 ;重复循环 ;程序从地址00C0H存放 ;AB相通电 ;DA相通电 ;CD相通电 ;BC相通电 ;重复循环 ;表示程序从地址0100H存放 0100H 0102H 0104H 0105H 0107H 0109H 0150H 0152H 0154H 0155H 0157H 0159H 7F 64 7E 7B 00 DE FE DF F9 22 7F 14 7E 7B 00 DE FE DF F9 22 DELAY1:MOV R7,#100 LP1:MOV R6,#123 NOP LP2:DJNZ R6,LP2 DJNZ R7,LP1 RET ORG 0150H DELAY2:MOV R7,#20 L1:MOV R6,#123 NOP L2:DJNZ R6,L2 DJNZ R7,L1 RET END ;延时50ms的循环次数 ;延时0.5ms的循环次数 ;表示程序从地址0150H存放 ;延时10ms的循环次数 ;延时0.5ms的循环次数 六、实验步骤

1. 新建设计文件、设置图纸尺寸、设置网格、保存设计文件。文件名为“jmp”。 2. 选取元器件。从Proteus元器件库中选取元器件:AT89C51(单片机)、CRYSTAL(晶振)、CAP(电容)、CAP-ELEC(电解电容)、RES(电阻)、MOTOR-STEPPER(步进电机)、SW-SPST(单刀单掷开关)、ULN2003A(运放)、 74LS04(反相器)。

3. 放置元器件、编辑元器件、放置终端、连线。按图3-9所示放置元器件并连线。 4. 设置元器件属性并进行电气规则检测。先右击再单击各元器件,按图3-9所示设置元器件的属性值。单击 “工具”→“电气规则检查”,完成电气检测。

5. 添加源程序、编辑源程序、编译源程序。源文件名为“jmp.asm”。 6. 加载目标代码文件。 “Clock Frequency”栏中的频率要设为6MHz。 7. 仿真。单击仿真工具栏“运行”按钮,单片机全速运行程序。拨动控制开关SW1~SW2,观察并记录步进电机旋转的方向和速度。

单击仿真工具栏“停止”按钮,先右击再单击步进电机,在弹出的“Edit Component”对话框中将“Step Angle”中的步距角修改后,单击“OK”完成修改。单击仿真工具栏“运行”按钮,单片机全速运行程序,观察步进电机的旋转速度的变化并与修改前比较。

七、实验分析与总结

1. 分析控制开关与电机转速和方向的关系。 2. 分析主程序中的PUSH和RET指令的作用。

3. 分析4个分支程序最后一条指令SJMP、LJMP的使用区别。

八、实验思考

请用散转程序的另外三种设计方法(转移指令表法、地址偏移量表法、转移地址表法)设计程序。

转移指令表法参考程序如下: 程序 START: MOV P3,#0FFH MOV A,P3

注释 ;读输入数据 43 ANL A,#30H SWAP A RL A MOV DPTR,#TABLE JMP @A+DPTR TABLE: AJMP ONE AJMP TWO AJMP THREE AJMP FOUR ONE: ?? TWO: ?? THREE: ?? FOUR: ?? ;屏蔽掉无关位 ;A*2→A ;转移指令表的基地址送DPTR ;散转指令 ;转移指令表 ;第一种控制方式 ;第二种控制方式 ;第三种控制方式 ;第四种控制方式

地址偏移量表法参考程序如下:

程序 START: MOV P3,#0FFH MOV A,P3 ANL A,#30H SWAP A MOV DPTR,#TABLE MOVC A,@A+DPTR JMP @A+DPTR TABLE: ONE-TABLE TWO-TABLE THREE-TABLE FOUR-TABLE ONE: ?? TWO: ?? THREE: ?? FOUR: ?? 注释 ;读输入数据 ;屏蔽掉无关位 ;地址偏移量表的基地址送DPTR ;查表并取出地址偏移量 ;散转指令 ;地址偏移量表 ;第一种控制方式 ;第二种控制方式 ;第三种控制方式 ;第四种控制方式

转移地址表法参考程序如下:

程序 START: MOV P3,#0FFH MOV A,P3 ANL A,#30H SWAP A MOV R7,A ADD A,R7 MOV DPTR,#TABLE JNC LP INC DPH

注释 ;读输入数据 ;屏蔽掉无关位 ;转移地址表的基地址送DPTR 44

LP: MOV R3,A MOVC A,@A+DPTR XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TABLE: DW ONE DW TWO DW THREE DW FOUR ONE: ?? TWO: ?? THREE: ?? FOUR: ?? ;查表并取出转移地址的高8位 ;查表并取出转移地址的低8位 ;散转指令 ;转移地址表 ;第一种控制方式 ;第二种控制方式 ;第三种控制方式 ;第四种控制方式

45

第4章 单片机定时与中断实验

4.1 外部中断实验

一、实验目的

1.掌握用外部中断方式实现控制的方法。 2.掌握中断优先级的使用方法。

3. 掌握用Proteus实现单片机系统仿真的方法。

二、实验预备知识

外部中断信号由P3.2(P3.3)管脚输入,当中断触发方式控制位ITO(IT1)为1时,CPU在每个机器周期的S5P2采样P3.2(P3.3)管脚,如果连续两次采样,前一次采样为高电平,后一次采样为低电平,则认为有中断申请,随即使中断标志位IE0(IE1)置1,向CPU申请中断,直到该中断被CPU响应。

当定时器以计数方式工作,计数初值为满量程,在计数输入端T0(T1)输入负跳变信号时,计数器将加1并产生溢出,随即使溢出标志位TF0(TF1)置1,向CPU申请中断,直到该中断被CPU响应。

三、实验内容

P1口做输出口,接八只发光二极管,利用手控单脉冲信号作为外部中断信号,编写控制程序,使八只发光二极管按一定的规律循环点亮。

1.程序1: 从外部中断0请求输入端(P3.2)输入脉冲信号 2.程序2: 从定时器0的外部输入端(P3.4)输入脉冲信号

四、实验参考电路

P1口接发光二极管的阴极,P1口的管脚输出低电平时对应的发光二极管点亮,实验电路图如图4-1所示。

46

C130pFX1C230pF19U1XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617C310uFR9CRYSTAL10k18XTAL29RSTR1330R2330R3330R4330R5330R6330R7330R8330293031PSENALEEAD1D2D3D4D5D6D7D8LED-REDR1010kR1110k12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 图4-1 外部中断实验电路

五、实验参考程序

地址 0000H 0003H 0013H 0050H 0052H 0054H 0056H 0058H 005AH 005CH 005EH 0060H 0063H 0064H 0100H 0102H 0104H 0106H 0108H 机器码 01 50 21 00 21 50 D2 AF D2 A8 D2 AA D2 BA D2 88 D2 8A 74 FE F5 90 12 02 00 23 80 F8 C0 E0 74 FC 79 07 F5 90 12 02 00 源程序 ORG 0000H AJMP MAIN ORG 0003H AJMP INT00 ORG 0013H AJMP INT11 ORG 0050H MAIN:SETB EA SETB EX0 SETB EX1 SETB PX1 SETB IT0 SETB IT1 MOV A,#0FEH LP1:MOV P1,A LCALL DELAY RL A SJMP LP1 ORG 0100H INT00:PUSH ACC MOV A,#0FCH MOV R1,#7 LP2:MOV P1,A LCALL DELAY 47 注释 ;程序入口 ;指向主程序 ;外部中断0的入口地址 ;指向中断服务程序 ;外部中断1的入口地址 ;指向中断服务程序 ;允许中断 ;外部中断1为高优先级 ;中断触发方式为边沿触发 ;中断服务程序 ;中断服务程序