找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4953|回复: 0
打印 上一主题 下一主题
收起左侧

单片机原理及应用实验指导书(Word文档下载)

[复制链接]
跳转到指定楼层
楼主
ID:399329 发表于 2018-9-18 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机原理及应用
实验指导书


工业大学    信息学院
二零零

目录
第一章 MPC100B-I型单片机实验箱简介
1.1系统组成
1.2实验箱
1.2.1单片机最小系统
1.2.2基础板
1.3专用开发工具
第二章 集成开发环境介绍
2.1 MedWin概述
2.1.1 MedWin集成开发环境的特点
2.1.2快速入门适用范围
2.1.3 MedWin对系统的要求
2.2安装MedWin的步骤
2.3 设置MedWin
2.4 MedWin开发入门
2.4.1 不使用MedWin集成开发环境项目管理方式
2.4.2 使用MedWin集成开发环境项目管理方式
2.5 MedWin断点功能
2.6 MedWin菜单命令
2.7常见问题
第三章 单片机最小系统
实验一、单片机最小系统的熟悉
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
第四章 实验指导
实验一 多字节、多进制加减运算实验
一、实验目的
二、实验要求
三、实验原理
四、实验步骤
五、实验报告
实验二、中断实验――中断优先级控制及中断保护
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
实验三、定时器实验――低频脉冲计数器
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
实验四、双机串行通讯实验
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
实验五、SRAM外部数据存储器扩展实验
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
实验六、矩阵式键盘输入实验
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
实验七、8255可编程并行I/O扩展接口实验
一、实验目的
二、实验设备
三、实验要求
四、实验原理
五、实验步骤
六、实验报告
1


单片机原理及应用实验指导书
第一章 MPC100B-I型单片机实验箱简介1.1系统组成
整个单片机实验系统由实验箱、功能扩展模块、单片机专用开发工具、实验指导书以及配套软件光盘等部分组成。
1.2实验箱
实验系统的基础平台采用箱式结构,外形美观大方、便于携带、利于教学,操作方便。
1.2.1单片机最小系统
最小系统板是本实验装置的核心模块,它提供了51单片机的一个最小工作系统,并充分地扩展了单片机总线和I/O口以便于与其他模块的电路连接。最小系统板包括的外围电路有:时钟电路、复位电路、P0口锁存电路、拨码开关电路。最小系统板上扩展的I/O口,包括P0、P1、P2、P3口的每个管脚独立都引出,作为数据总线(P0口),地址总线低8位(P0口经锁存后的输出),地址总线高8位用8针的双排插针座引出;控制总线(WR, RD, ALE等)独立引出。
由于最小系统板的独立式可更换设计,使得本实验装置可通过改变这个最小系统板来进行不同家族单片机的实验教学,如AVR,PIC,96家族单片机等,非常灵活和方便。
1.2.2基础板
基础板是本实验装置的实验基础,其内容围绕单片机教学大纲。
它由以下21个模块组成:
(1)发光二极管阵列模块;
(2)键盘模块(独立式与矩阵式两用键盘);
(3)动态数码管扫描显示模块;
(4)静态串行显示模块;
(5)8155扩展实验模块;
(6)8255扩展实验模块;
(7)RS232接口实验模块;
(8)波形信号发生器模块;
(9)外部SRAM实验模块(62256);
(10)外部扩展EEPROM实验模块(W27C512);
(11)FlashROM实验模块(W29C011A);
(12)ADC0809转换实验模块;
(13)V/F转换实验模块;
(14)DAC0832转换实验模块;
(15)F/V转换实验模块;
(16)时钟源模块;
(17)总线驱动与总线锁存模块(74HC245/74HC573);
(18)微处理器监控模块;
(19)电源模块(±12V/±5V);
(20)芯片自由扩展实验模块(2组);
(21)电位器调节模块(2组);
(22)接口转换模块。
1.3专用开发工具
(1)  51系列单片机仿真器;
(2)  汇编、C51编译器(KEIL C7.0试用版);

第二章 集成开发环境介绍
2.1 MedWin概述
MedWin是万利电子有限公司Insight~系列仿真开发系统的高性能集成开发环境。集编辑、编译/汇编、在线及模拟调试为一体,VC风格的用户界面,内嵌自主版权的宏汇编器和连接器,并完全支持Franklin/KeilC扩展OMF格式文件,支持所有变量类型及表达式,配合Insight系列仿真器,是您开发80C51系列单片机的理想开发工具。
2.1.1 MedWin集成开发环境的特点
1.完美的Windows版集成开发环境MedWin
2.内嵌自主版权的宏汇编器A51和连接器L51,并支持Keil/Franklin编译、连接工具
3.具有分别独立控制项目文件的工程项目管理器
4.在工程项目管理下,实现多模块和混合语言编程调试
5.VC风格的窗口停驻、窗口切分和工作簿模式界面
6.在线编辑、编译/汇编、连接下载运行和错误关联定位
7.符合编程语言语法的彩色文本显示
8.完全的表达式分析,支持所有数据类型变量的观察
9.无须点击的感应式鼠标提示功能
10.外部功能部件编程向导
11.不限制打开数据区观察窗口的数目
12.调试状态下用户程序自动重装功能
13.提供真实的软件模拟仿真开发环境
2.1.2快速入门适用范围
1.MedWin集成开发环境V2.3x
2. 80C51系列仿真器SE-52/SE-52P/SE-52S,ME-52/ME52NME52P/ME52S,AE-52/AE-52E/AE-52P,ME-52H,PE-52
3.PHILIPS51LPC系列仿真器SE-764/ME-764
2.1.3 MedWin对系统的要求
为使MedWin集成开发环境能够正常地运行,您必须提供以下软硬件环境:
1.586以上的PC及兼容机
2.100M以上的剩余硬盘空间
3.分辨率为800x600以上的显示器
4.具有SPP功能的打印机接口
5.中文或英文Windows95/98,Windows Me,Windows 2000/NT,Windows XP
6.尽量减少DOS自动批处理中关于系统路径及环境变量的设置,或删除DOS下的批处理文件Autoexec.bat文件
2.2安装MedWin的步骤
以下分别是安装MedWin集成开发环境的方法:

第一步:从光盘上安装或从因特网下载安装
从光盘上安装
1.安装中文MedWin,进入文件夹Manley\MedWin\Chinese
2.安装英文MedWin,进入文件夹Manley\MedWin\English
3.在文件夹内,点击setup。
从因特网上下载安装
1.下载所需的MedWin中文版Chinese.zip或MedWin英文版English.zip文件
2.双击鼠标左键,释放文件Chinese.zip或English.zip
3.将文件释放到C:\Windows\Temp或其它文件夹
4.进入C:\Windows\Temp\Chinese或C:\Windows\Temp\English文件夹
5.在文件夹内点击setup,安装MedWin集成开发环境。

第二步:安装文件路径设置
为了便于管理和服务,建议安装MedWin集成开发环境时,使用以下缺省路径安装:
1.中文版缺省安装目标路径:C:\Manley\PMedWin
2.英文版缺省安装目标路径:C:\Manley\MedWin
注意安装MedWin集成开发环境路径选择。
2.3 设置MedWin
MedWin集成开发环境完成安装后,如果是第一次安装,请您务必注意:必须根据系统提示,设置工作目录、编译/汇编器、连接器的路径、环境以及注册仿真器,如果是升级安装,则MedWin集成开发环境启动后出现启动向导菜单或直接打开项目文件。
第一步;启动MedWin
1由安装MedWin集成开发环境,直接启动MedWin
2.或点击Windows[开始/程序/Manley/MedWin中文版]启动中文版MedWin
3.或点击Windows[开始/程序/Manley/MedWin]启动英文版MedWin
4.如果已经连接仿真器,屏幕上出现MedWin的初始画面,进入启动MedWin的第三步
5.如果没有连接仿真器,屏幕上出现端口选择画面,进入启动MedWin的第二步
第二步:选择进入在线仿真或模拟仿真
1.由于仿真器供电电源,通讯电缆连接问题,请检查并使仿真器工作正常后,点击对话框中[仿真器]按钮,进入在线仿真状态。
2.如果确认需要进行模拟仿真,点击[模拟仿真]按钮,进入模拟仿真状态。
经过以上步骤,屏幕上出现MedWin集成开发环境的初始画面,并渐渐消失,出现MedWin集成开发环境的系统画面。
第三步:设置工作目录
进入MedWin集成开发环境后,系统首先提示默认的工作目录为C:\MedWin。我们建议用户根据需要选择合适的工作目录,例如将工作目录改为D:\WorkDir(用户可自行定义目录名称)。注意:不得使用长文件名作为工作目录!
在MedWin集成开发环境工作目录提示对话框中,更改MedWin集成开发环境工作目录的步骤,必须在Windows环境下进行:
1.打开Windows的资源管理器
2.选择本地磁盘(D:)
3.单击鼠标右键,选择新建文件夹,命名为WorkDir
当建立WorkDir文件夹后,在MedWin集成开发环境点中,点击当前工作目录左侧按钮。在开发环境工作目录对话框中选择驱动器D盘后,打开文件夹(目录)WorkDir,确认后,工作目录设置即告完成。系统将提示进行下一步设置:编译/汇编/连接器的配置。
第四步:配置编译/汇编/连接器及环境
MedWin集成开发环境初始默认编译/汇编/连接环境为使用万利电子自主版权的宏汇编和连接器,使用默认设置,汇编连接信息和错误关联均为中文提示。
当选择用户设置编译/汇编/连接环境时,必须注意选择合适的路径和程序,如
1.编译器路径为C:\C51\BIN\C51.exe
2.汇编器路径为C:\C51\BIN\51.exe
3.连接器路径为C:\C51\BIN\BL51.exe
系统头文件、库文件的环境为:
1.编译器系统头文件路径为C:\C51\INC
2.编译器系统库文件路径为C:\C51\LIB
MedWin集成开发环境默认源程序的扩展名为:
1.C源程序文件的扩展名为.C
2.汇编源程序文件的扩展名为.ASM
当您已经存在编译器/汇编器/连接器时,建议按照下列目录存放:
1.C:\C51\BIN     存放C51.exe,A51.exe,L51.exe或BL51.exe
2.C:C51\INC     存放C程序的头文件
3.C:\C51\ASM    存放汇编程序的嵌入文件
4.C:\C51\LIB     存放C程序连接所需的库文件
用户可按照上面提示的路径设置编译器/汇编器/连接器及环境,如编译器/汇编器/连接器存放在其它目录,则必须在输入框中设置合适的路径或点击按钮选择相应的文件及路径。
当您使用Keil编译器时,其连接器应设为BL51.exe,当您使用Franklinl编译器时,其连接器应设为L51.exe。
第五步:设置文本编辑器
设置文本编辑器可以用于设置文本窗口的前景字符的颜色、背景颜色、字体和编辑文件类型。
2.4 MedWin开发入门
MedWin集成开发环境提供了以下两种方式开发用户应用程序,:
1.不使用MedWin集成开发环境项目管理方式——对源程序文件直接进行汇编/连接,兼容传统开发习惯。
2.使用MedWin集成开发环境项目管理方式——可进行多模块、混合语言编程的,同样也适合单模块程序的开发。
用户无论是单模块或多模块的程序开发,我们都建议使用项目管理方式管理应用程序。
2.4.1 不使用MedWin集成开发环境项目管理方式
不使用MedWin集成开发环境项目管理方式,只能对单模块方式下的应用程序开发,具有很大的局限性。以下是不使用MedWin集成开发环境项目管理方式开发应用程序的步骤:
第一步:关闭当前项目文件
命令[项目管理/关闭当前项]
不使用MedWin集成开发环境项目管理方式开发应用程序,用户必须关闭已经打开的项目,此时MedWin集成开发环境关闭界面上所有的窗口。因为当打开项目文件后,MedWin集成开发环境默认所有编译/汇编、产生代码的过程都是对项目或项目所包含的文件进行的。
第二步:在文件莱单下打开应用程序
命令[文件/新建][文件/打开]
单模块方式下的文件调试可以按照以下方法新建或打开文件:
1.点击[文件/新建],输入文件名和扩展名,新建文件
2.点击[文件/打开],选择文件捡取框中的文件将其打开
第三步:编译/汇编
命令[项目管理/编译/汇编]
MedWin集成开发环境根据文件的扩展名,自动对当前激活的文件选择调用外部编译器或汇编器:
1.如果当前文件的扩展名为ASM或系统定义的扩展名,编译/汇编命令调用外部汇编命令对当前文件汇编
2.如果当前文件的扩展名为C或系统定义的扩展名,编译/汇编命令调用外部C编译命令对当前文件编译执行[项目管理|编译/汇编]命令后产生的结果显示在消息框中。
如果需要设置文件编译/汇编的命令行参数,可以选择[项目管理1文件属性]命令设置。
第四步:错误信息关联
MedWin集成开发环境调用外部命令编译/汇编后产生的结果,显示在消息窗口中,消息窗口可由热键Ctrl+9激活。当编译/汇编发生错误时,消息窗口中的错误信息自动与源文件关联,提示出错的位置。在消息窗口中错误提示处双击鼠标左键或键入回车,可将错误信息与源文件的错误位置关联:
1.如果编译/汇编没有错误,可进入第五步操作
2.如果编译/汇编出现错误,在修改源文件后重复进行第三步操作
第五步:产生代码并装入仿真器调试
命令[项目管理/产生代码][项目管理/产生代码并装入]
产生代码或产生代码并装入命令对经过编译/汇编无误后产生的OBJ文件进行连接产生用于下载的代码。此命令自动地对修改过的源程序进行编译或汇编,对没有修改过的程序将越过编译或汇编过程,然后连接所有的OBJ,LIB文件,再装载代码到仿真器,完成调试程序所需的准备工作。装载完成后,出现“Loadingprogram“(项目名)”…Completed'’的字样。
2.4.2 使用MedWin集成开发环境项目管理方式
使用MedWin集成开发环境项目管理方式开发程序,适用于各种方式下的单模块和多模块方式应用程序。以下是使用MedWin集成开发环境项目管理方式开发应用程序的步骤:
1.建立一个新的项目进入第一步——新建项目文件
2.打开已经存在的项目文件进入第三步——打开项目文件
第一步:新建项目文件
命令[项目管理/新建项目文件]
项目名称
MedWin集成开发环境的项目器是按项目名称管理的,项目管理器内的项目名称不可以相同。在项目名称输入栏内,用户必须输入项目名称,并且项目名不得超过8个字符,不可以使用汉字以及“-,?,*,/”等DOS文件名所不可以使用的字符,也不可以输入盘符和路径!
高级设置
高级设置是用户程序所处路径与当前工作目录不同时,选择存放项目文件路径的过程。通常,当用户源程序文件存放在当前工作目录时,不需要进行高级设置。如果源程序文件不在当前工作目录时,用户必须选择高级设置,将项目文件存放到用户源程序所处的目录。
如果源文件与项目文件不在同一目录时,将会出现不能进行源文件调试的情况发生。
添加文件
选择添加文件选项,表示在项目建立后会自动打开文件捡取框,供用户选择文件添加到项目管理器中。
存储器属性
存储器属性Small/Compact/Large,此属性为C编译器所需,如果项目文件中包含C程序,用户必须设置存储器属性。
RAM尺寸:128/256,此属性为连接器所需的控制项。系统默认128字节。
系统默认标准80C51汇编选项,此选项为汇编器所需的控制项。选中时,汇编器默认SFR为80C51。
如果项目所使用的不足标准的80C51,用户必须定义其使用的SFR,例:
    PO    DATA    80H
    E    DATA    0A8H
    TR0    BIT    8CH
项目环境设置
项目头文件路径为该项目所定义的头文件所处的路径。该路径与系统定义的头文件路径在DOS环境设置的关系是:
set c51inc=(系统定义的头文件路径)(项目定义的头文件路径)
项目库文件路径为该项目所定义的库文件所处的路径,该路径与系统定义的库文件路径在DOS环境设置的关系是:
setc51lib=(系统定义的库文件路径)(项目定义的库文件路径)
在项目的编译和连接过程中,MedWin自动加入以上环境变量的设置。通常用户不需要设置项目定义的头文件和库文件路径,只有在高级应用时才需设置。
调试信息
建立新的项目后,系统默认为产生调试信息,能够进行源文件调试。
更多的文件属性
关于编译/汇编程序的更多的文件属性,可在[项目管理I文件属性]中设置。如果在多模块调试中需要关闭一个或多个文件的源文件调试,可在文件属性对话框中,分别关闭产生调试信息选项。
第二步:添加文件
命令[项目管理/添加文件项]
添加文件命令用于将各类文件添加至项目管理器,新建项目文件后集成环境会自动打开添加文件对话框,提供选择。请根据:
1.如果文件存在,在文件捡取框中选择并打开文件添加
2.如果文件不存在,必须输入文件名(包含扩展名),建立新文件
新建文件后,键入命令[项目管理|添加文件项],将新建文件添加到项目中。
第三步:打开项目文件
命令:[项目管理/打开项目文件]
对于已经存在的项目文件,可以直接打开项目文件进入第四步操作。
第四步:编辑,编译/汇编/连接
命令:[项目管理/编译/汇编]
MedWin集成开发环境根据文件的扩展名,自动对激活的文件选择调用外部编译器或汇编器:
1.如果当前文件的扩展名为ASM或系统定义的扩展名,编译/汇编命令调用外部汇编命令对当前文件汇编
2.如果当前文件的扩展名为C或系统定义的扩展名,编译/汇编命令调用外部C编译命令对当前文件编译文件编译/汇编的命令行参数由[项目管理1文件属性]确定。
第五步:错误信息关联
文件经过编译/汇编后的结果显示于消息窗口,出现错误后错误信息与文件关联。在消息窗口中错误之处双击鼠标左键或键入回车,即可将错误与文件关联:
1.如果没有错误,进入第六步操作
2.如果出现错误,修改文件后重复进行第四步操作
第六步产生代码并装人仿真器
命令[项目管理/产生代码]
命令[项目管理/产生代码并装入]
命令[项目管理/重新产生全部代码]
产生代码或产生代码并装入命令,对经过编译/汇编无误后产生的OBJ文件进行连接,产生用于下载的代码。此命令对修改过的源程序自动进行编译或汇编,否则将越过编译或汇编过程进行连接,并装载代码到仿真器,完成调试文件所需的准备工作。
1.使用产生代码命令,项目管理器会自动判别文件是否需要重新编译/汇编,提高调试效率
2.使用产生代码并装入命令,项目管理器会自动判别文件是否需要重新编译/汇编,并将连接产生的代码下载到仿真器,提供调试运行
使用重新产生全部代码命令,项目管理器会对所有文件重新编译/汇编,并将连接产生的代码下载到仿真器,提供调试运行
2.5 MedWin断点功能
MedWin集成开发环境配合|nsight系列仿真器,具有强大的断点功能:可以在编辑和调试状态下设置或清除断点,并且在退出集成开发环境时自动保存断点信息。
1.断点标记
MedWin集成开发环境的断点标记,根据系统状态和所处窗口类型,标记如下:
1.在编辑状态下,源程序文本窗口内的白色箭头——预设断点,退出时保存,
2.在调试状态下,源程序文本窗口内的白色箭头——无效断点,退出时保存
3.在调试状态下,源程序文本窗口内的黄色箭头——有效地址断点,退出时保存
4.在调试状态下,源程序文本窗口内的蓝绿色箭头——临时断点,退出时不保存
5.在反汇编本窗口内设置的断点,标记为红色光带——地址断点,退出时不保存
2.断点颜色变化规律
根据系统状态和所处窗口类型,MedWin集成开发环境的断点颜色变化规律如下:
编辑状态下,在源程序窗口内设置断点,标记为白色,再次设置断点,白色断点标记被清除。
调试状态下,在源程序窗口内设置断点,标记为黄色,再次设置断点,黄色断点标记被清除。
调试状态下,在源程序窗口内蓝绿色断点处设置断点,标记为黄色,再次设置断点,黄色断点标记被清除。
调试状态下,在与源程序断点关联的反汇编窗口红色光带处设置断点,在反汇编窗口内清除断点,同时将源程序断点标记为白色,再次设置断点,反汇编窗口标记为红色光带,源程序的白色断点再次标记为黄色。
3.源程序文本上设置断点
(1)编辑状态设置断点
当用户在编写源程序的过程中,根据调试需求,可以直接在源程序文本的任何地方设置或清除断点。如果设置了断点,将以白色箭头标记在源程序文本左侧的灰色状态栏内,断点属性为预设断点。对于在源程序文本上设置的断点,系统退出时全部自动保存。
(2)调试状态设置断点
在调试状态下,可以直接在源程序文本的有效行上设置断点(当文本左侧的灰色状态栏内出现小圆点时,表示当前程序为有效行)。设置后,断点以黄色箭头标记在文本左侧的灰色状态栏内,如果没有出现小圆点,则不可以设置断点。在编辑状态下设置的断点,经过编译/汇编,如果预设的断点编译后是有效行,则断点标记为黄色,如果不是有效行,断点标记为白色。对于在源程序文本上设置的断点,系统退出时全部自动保存。
4.反汇编窗口内设置断点
断点在反汇编窗口内以红色光带表示,可以任意设置地址断点,如果设置的断点与源程序有效行地址关联,则与源程序相关联的地址处设置断点,在源程序窗口内出现蓝绿色箭头。
如果在源程序断点相关联的反汇编窗口红色光带处设置断点,将清除窗口内的断点光带,同时将源程序断点标记为白色,再次设置断点,反汇编窗口标记为红色光带,源程序的白色断点再次标记为黄色。
5.断点表
断点列表通过[断点|断点表]激活。断点表列出所有断点所处的地址,文件位置及属性。
在列表框内可以执行添加断点,删除断点等操作。
6.断点使能
当设置了断点或使用外部信号断点时,选择[断点|断点使能]可以允许或禁止相应的断点。当允许外部信号断点后,可以设置外部信号的为上升沿或下降沿作用。
2.6 MedWin菜单命令
1、文件(F)
新建(N):新建文件,在输入文件名时必须输入文件的扩展名。如果是程序文件,汇编语言扩展名必须为(.asm),C语言扩展名必须为(.c)
打开(O):打开用户程序文件,可以在文件捡取框中选择,也可以在文件捡取框中直接输入文件名,当文件名不存在时,系统默认为新建文件。
打开项目文件(P):打开MedWin集成开发环境项目文件,项目文件的扩展名为mpf。打开后,根据需要可以将打开的项目文件添加到项目管理器中。
保存(S)    Ctrl+S:保存当前激活的文件。
另存为(A):将当前激活的文件另存为指定的文件。
退出(X):退出MedWin集成开发环境。
2、编辑(E)
撤销(U):    Ctrl+Z:撤消当前的操作。
剪切(T)    Ctrl+X:将选择的块剪切到剪贴板。
复制(C)    Ctrl+C:将选择的块复制到剪贴板。
粘帖(P)    Ctrl+P:将剪贴板粘贴到文件。
选择整个文档(L)    Ctrl+A:将整个文档作为块。
查找(F)    Ctrl+F:在文件中查找字符串。
查择下一个(D)    F3:查找下一个匹配的字符串。
在文件中查找:在被选定的文件范围内查找字符串。
替换(E)    Ctrl+H:替换匹配的字符串。
设置或清除书签(B)    Ctrl+B:在文档中设置或清除书签,用于快速定位。
定位到前一个书签(R)    Ctrl+Shift+P:与设置或清除书签命令配合,定位到前一个书签。
定位到下一个书签(X)    Ctrl+Shift+N:与设置或清除书签命令配合,定位到后一个书签。
清除所有书签(K):清除所有书签标记。
定位(G)    Ctd+G:定位到指定行或地址。
定位到前一个错误(V):将编译/汇编发生的错误与源程序关联,并定位到前一个错误的位置。
定位到后一个错误(N):将编译/汇编发生的错误与源程序关联,并定位到后一个错误的位置。
3、查看(V)
寄存器(R):寄存器窗口,显示80C51内核基本的寄存器R0-R7,A,B,DPH,DPL,SP和PSW,以16进制方式显示字节寄存器的内容,以位的方式显示PSW的内容。
特殊功能寄存器(S):当前被选择的CPU所包含的特殊功能寄存器窗口,以16进制方式显示字节寄存器的内容。
反汇编窗口(C):反汇编窗口,将程序代码区的内容以反汇编方式及源程序方式显示。反汇编窗口同时支持行汇编方式输入或修改程序代码。
观察窗口第一观察组(1)    Ctrl+l:为了方便用户避免多次添加和删除需要观察的变量,设置的第一组观察窗口。
观察窗口第二观察组(2)    Ctrl+2:为了方便用户避免多次添加和删除需要观察的变量,设置的第二组观察窗口。
观察窗口第三观察组(3)    Ctrl+3:为了方便用户避免多次添加和删除需要观察的变量,设置的第三组观察窗口。
观察窗口第四观察组(4)    Ctrl+4:为了方便用户避免多次添加和删除需要观察的变量,设置的第四组观察窗口。
变量窜口(V):变量窗口。
数据区Idata:片内RAM区域,被MOV @Ri,a或MOV A, @Ri指令间接寻址访问的数据区。
数据区Data:片内RAM和SFR区域,被直接寻址访问的数据区。
数据区Cdata:程序代码空间。
数据区Xdata:外部数据空间。
数据区Bit:片内的位寄存器区域0-127与片内地址为20H-2FH的RAM对应,128-255~SFR相对应。
数据区Pdata:页面存储方式下的外部数据空间,使用MOVX  @Ri,A或MOVX A, @Ri指令。
跟踪存储器(F):跟踪存储器窗口,对含有跟踪存储器功能的仿真器有效。
波形记录器(A):波形记录器窗口,对含有跟踪存储器功能的仿真器有效。
性能分析器窗口(W):性能分析器窗口,对含有性能分析器功能的仿真器有效。
消息窗口(M)    Ctrl+9:消息窗口,显示编译/汇编产生的结果,调试过程中的提示以及在文件中查找的结果。
项目管理器窗口(N)    Ctrl+0:项目管理器窗口。
5、调试(R)
开始调试(B)    Ctrl+M:切换到调试态,如果已经打开了项目文件,舅U进行产生代码并装入操作。
终止调试(D)    Ctrl+D:切换到编辑态。
全速运行(R)   F9:全速运行,调试态有效。
禁止断点并全速运行(E)    Alt+F9:禁止断点并全速运行,调试态有效(此命令只对具有跟踪存储器功能的仿真器有效)。
跟踪(T)    F7:跟踪运行程序,在反汇编窗口下执行一条指令,如果当前是调用指令,则进入所调用的子程序;如果在源程序窗口下,执行当前文本下的一条语句,如果是调用则进入所调用的子程序。调试态有效。
单步(S)    F8:单步运行程序。反汇编窗口下如是调用指令,则越过所调用的子程序:源程序窗口下,如果是调用语句,则越过所调用的子程序。调试态有效。
运行到光标处(G)    F4:程序全速运行到光标处,调试态及源程序文本或反汇编窗口有效。
运行到RETURN指令处(U)    Alt+F8:程序全速运行到RET指令处,调试态有效,对于不同的仿真器,此命令功能有所不同。
交互跟踪(A)    Alt+F7:如果当前激活的是程序文本窗口,执行反汇编窗口的跟踪指令,如果当前激活的是反汇编窗口,执行源程序文本窗口的跟踪指令,调试态有效。
执行到(E):执行到设定的地址,调试态有效。
设置新的程序计数器(N)    Ctrl+N:改变当前的程序计数器值,调试态有效。
自动单步(M):自动以跟踪的方式运行程序,调试态有效。
设置重复计数器(O):设置重复计数值,与断点配合使用,调试态有效。
返回监控(I)    Ctrl+T:终止运行程序,调试态有效。
程序复位(P)    Ctrl+F2:复位仿真器,调试态有效。
显示到一步执行(X)    Ctrl+O:刷新所有窗口,调试态有效。
添加项至观察窗口(W)    Ctrl+W:将光标处的字符或地址作为变量添加到观察窗口,调试态有效。
6、外围部件(S)
中断(I):中断状态窗口,包括INT0,INTl,TO,T1,T2和UART中断状态以及优先级和允许设置。设置或清除相应的标志,可以改变中断的状态,也可以通过相应的值,作为中断初始化的编程。
端口(T):端口设置窗口,显示或改变端口的状态。
定时器/计数器0:定时器/计数器0模式和控制窗口,其TMOD和TCON的值,可以作为定时器0初始化的编程依据。
定时器/计数器1:定时器/计数器1模式和控制窗口,其TMOD和TCON的值,可以作为定时器1初始化的编程依据。
定时器/计数器2:定时器/计数器2模式和控制窗口,其T2CON的值,可以作为定时器2初始化的编程依据。
串行口(S):串行口工作模式和控制窗口,其SMOD和SCON的值,可以作为串行口初始化的编程依据。
7、项目管理(P)
新建项目文件(N):新建项目文件对话框,包含打开已经存在的项目文件、创建一个新项目、新建或打开一个文件以及硬件调试。
打开项目文件(O):打开一个已经存在的项目文件。
关闭当前项目:关闭当前已经打开的项目文件,常用于对单模块文件或硬件的调试。
保存当前项目(S):保存当前项目文件。
另有为(A):将当前项目文件存为其他项目文件名。
添加文件项(F):在已经打开的项目中添加文件。添加文件的类型有源文件、头文件、库文件和其他文件。
移除文件项:在已经打开的项目中删除文件。
设置向导(W):设置编译器/汇编器/连接器路径以及源文件的默认扩展名和C语言的环境变量路径。
设置工作目录(D):设置MedWin集成开发环境的工作目录,建议工作目录设置在D盘,并且不要使用长文件名。
文仟属性(I)    Ctrl+Enter:对于汇编语言程序只能设置是否需要源文件调试;对于C语言程序,还可以设置存储器模式等。
连接属性(L):用于对项目文件的连接控制、段定位、RAM尺寸和头文件、库文件路径的设置。
编译/汇编(T)    Ctrl+F7:根据文件的扩展名,编译/汇编当前文件。
产生代码(M):根据文件的编辑修改状态,确定是否编译/汇编当前文件之后,对产生的OBJ文件连接。
产生代码并装入 (E)    Ctrl+F8:根据文件的编辑修改状态,确定是否编译/汇编当前文件之后,对产生的OBJ文件连接,再将连接产生的代码装载到仿真器。
重新产生全部代码(U)    Ctrl+F9:编译/汇编项目中所有文件,对产生的OBJ文件连接,再将连接产生的代码装载到仿真器。
输出IntelHEX(H):产生IntelHEX格式文件,默认HEX文件的文件名为项目名。
输出Binary(B):产生二进制格式文件,默认B|N文件的文件名为项目名。
项目管理器(P)    Ctrl+0:激活项目管理器窗口。
9、断点(B)
断点(B):断点列表窗口。
设置或清除断点(T)    F2:在源程序或反汇编窗口中设置/清除断点。编辑态的文本窗口以及调试态的源文件和反汇编窗口有效。
设置到(A):在指定的地址处设置断点。
断点使能(E):地址断点或外部断点使能。
禁止所有断点(D):禁止所有地址断点。
清除所有断点(R):清除所有地址断点。
设置跟踪存储器(S):设置跟踪存储器状态
10、设置(O)
设置仿真器(E):设置仿真CPU类型,时钟和存储器结构。
程序程序存踏器映像(C):设置程序存储器映像。
程序数据存踏器映像(O):设置数据存储器映像。
设置通讯口(T):选择通讯口参数或进入模拟调试。
设置文本编辑器(S):设置文本编辑器环境参数,如字体、颜色等。
设置向量(W):设置编译器/汇编器/连接器路径以及源文件的默认扩展名和C语言的环境变量路径的设置。
设置工作目录(D):设置MedWin集成开发环境工作目录。
启动向导:选择进入MedWin集成开发环境启动向导设置。
11、窗口(W)
拆分(S):拆分文本窗口和存储器窗口。
工作簿模式(W):窗口显示模式设定是否使用工作簿模式。
关闭窗口(O)    Ctrl+F4:关闭当前激活的窗口。
关闭所有窗D(L):关闭当前所有激活的窗口。
排列图标(A):排列当前所有激活的窗口。
层叠窗口(C):层叠当前所有激活的窗口。
横向平铺窗口(H):横向平铺当前所有激活的窗口。
纵向平铺窗口(V):纵向平铺当前所有激活的窗口。
刷新所有窗口(R):刷新当前所有激活的窗口和停驻窗口。
12、帮助(H)
关于MedWin(A):关于MedWin对话框中列出了软件和硬件有关版本信息,以及仿真器产品的注册。
2.7常见问题
问题现蒙
原因
解决方法
编译连接时出现短时黑屏或 提示切换到DOS状态
操作系统存在较低版本的执行程序
格式化硬盘,重新安装Windows
程序不能编译/汇编
编译/汇编器路径设置错误
在设置1设置向导中重新设置编
缺少编译/汇编程序
增加编译/汇编程序
源文件名中使用了控制字符“-”
源文件名不得包含字符“-”(减号)
源文件使用了长文件名
源文件名不得超过8个字符
程序不能连接
连接器路径设置错误
在设置1设置向导中重新设置连接
器路径
缺少连接程序
增加连接程序
编译/汇编出错
改正错误
没有正确使用连接器
使用L51.EXE或BL51.EXE
项目名中使用了非法字符如“-”
项目名不得使用字符“。”(减号)
项目文件所处路径包含长文件名
建议更改工作目录
译器和汇编器路径源程序窗口的左侧未出现蓝色的调试小圆点,并且执行所有运行操作,均为全速运
源文件与项目文件不在同一目录
将项目文件建立在源文件的目录内
在文件属性内关闭了调试信息
打开产生调试信息选项
使用了较低版本的汇编器
使用高版本的汇编器,如Franklin/KeilA51.EXEV4.86或以上版本
仿真器代码映像到目标系统
改变正确的代码映像
MedWin不能进入在线仿真
仿真器没有提供电源
接通仿真器电源
仿真器没有准备就绪
点击测试通讯口对话框中按钮[仿真器]
通讯电缆故障
检查通讯电缆和连接
设置PO口总是为低#
缺少上拉电阻
因为PO口的开漏特性,必须加接上拉电阻
PO,P2口的数值与设置不同
开的外部数据窗口或观察外部数据变量,影响了PO,P2口
闭外部数据窗口(XDATA窗口)或观察外部数据变量
提示外部振荡器失败
没有连接仿真头
连接仿真头

没有提供石英晶体
提供石英晶体

仿真器时钟选择错误
重新设置仿真器时钟
不能观察汇编程序变量
存在小写字符
改为大写字符后观察


第三章 单片机最小系统
实验一、单片机最小系统的熟悉一、实验目的
在进行其他实验之前,先熟悉实验装置的核心模块——单片机最小系统模块。掌握该实验模块的电路原理和接口的使用方法。
1.掌握单片机振荡器时钟电路及CPU工作时序;掌握复位状态及复位电路设计;掌握单片机各引脚功能及通用I/O口的使用;掌握单片机基本指令的使用。
2.掌握MedWin集成开发环境,仿真器和烧录器等开发工具的使用。
二、实验设备
1.单片机仿真器,烧录器;
2.单片机最小系统实验模块,键盘实验模块,发光二极管阵列实验模块。
三、实验要求
1.连接实验电路,编写简易单片机汇编程序达到下述工作要求:以任意两个独立式按键作为输入,当第一键按下时,点亮第一行发光二极管;当第二键按下时,点亮第二行发光二极管。
2.将编写的程序调入仿真器中,在MedWin集成开发环境中进行调试;
3.在MedWin中产生机器码文件,用烧录器烧录到单片机芯片中,插在板子上观察工作情况。
四、实验原理
41  AT89C51引脚说明
我们以常用的单片机芯片AT89C51为教学实例,首先对其引脚进行简要介绍
  • P0.0P0.7P0口的8位双向三态I/O口线;
  • P1.0P1.7P1口的8位准双向口线;
  • P2.0P2.7P2口的8位准双向口线;
  • P3.0P3.7P3口的8位具有双重功能的准双向口线;
  • ALE:地址锁存控制信号。
  • /PSEN:外部程序存储器读选通信号,读外部ROMPSEN低电平有效。
  • /EA:访问程序存储器控制信号,当EA为低电平时,对ROM的读操作限制在外部程序存储器;当EA为高电平时,则对ROM的读操作是从内部程序存储器开始,并可延至外部程序存储器。
  • RST    复位信号,复位信号延续2个机器周期以上高电平时即为有效,用以完成单片机的复位初始化操作。
  • XTAL1 XTAL2   外接晶体引线端,当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,XTAL1接地,XTAL2用于接外部时钟振荡器信号。
  • Vss     地线。
  • Vcc     +5V电源。

图1-1  AT89C51引脚图及逻辑符号图
P3口线的第二功能见表1-1,这些特殊功能我们将在以后的实验中进行学习。
表1-1   P3口线的第二功能
口线
第二功能
信  号  名  称
P3.0
RXD
串行数据接收
P3.1
TXD
串行数据发送
P3.2
INT0
外部中断0申请
P3.3
INT1
外部中断1申请
P3.4
T0
定时器/计数器0计数输入
P3.5
T1
定时器/计数器1计数输入
P3.6
WR
外部RAM写选通
P3.7
RD
外部RAM读通

42 振荡电路、时钟电路和CPU时序
(1)振荡电路、时钟电路。如图1- 2所示,外部时钟振荡电路由晶体振荡器和电容C1、C2构成并联谐振电路,连接在XTAL1、XTAL2脚两端。对外部C1、C2的取值虽然没有严格的要求,但电容的大小会影响到振荡器频率的高低、振荡器的稳定性、起振的快速性。C1、C2通常取值C1=C2=30PF左右;8051的晶振最高振荡频率为12M,AT89C51-24PC的外部晶振最高频率可到24M。在单片机最小系统板上已经提供了晶振电路,在使用该电路时,应加上跳线帽,并插入合适的晶振。
图1-2 片内振荡器等效电路和外接元件
AT89C51也可以采用外部时钟方式,外部时钟从XTAL2脚输入,XTAL1脚接地。可以采用我们板子上提供的外部时钟源作为单片机外部时钟输入。
(2)CPU时序
晶振(或外部时钟)的振荡频率的确定,就确定了CPU的工作时序。这里介绍几个重要的时序概念,我们在以后的实验中还会经常涉及到:
◇ 振荡周期:或者称时钟周期,是指为单片机提供定时信号的振荡器的周期。
◇ 机器周期:在8051单片机中,一个机器周期由12个振荡周期组成。
◇ 指令周期:是指执行一条指令所占用的全部时间。一个指令周期通常含有1~4个机器周期。机器周期和指令周期是两个很重要的衡量单片机工作速度的值。
若外接12MHz晶振时,8051的三个周期的值为:
振荡周期=1/12us;
机器周期=1us;
指令周期=1~4us。
在一些应用中,传统的8051的速度显得有些慢,因此,当前很多采用8051内核的新型单片机采用了加速处理器结构,使机器周期提高到振荡周期的6倍、4倍等等,RISC(精简指令集)的采用,更让单片机在单个时钟周期完成一条指令,使得单片机在处理速度上得到大大提高。

43  复位状态和复位电路设计
(1)复位状态
在8051单片机中,只要在单片机的RST引脚上出现2个机器周期以上的高电平,单片机就实现了复位。单片机在复位后,从0000H地址开始执行指令。复位以后单片机的P0~P3口输出高电平,且处于输入状态,SP(堆栈寄存器栈顶指针)的值为07H(因此,往往需要重新赋值,其余特殊功能寄存器和PC(程序计数器)都被清为0。复位不影响内部RAM的状态。
(2)复位电路
单片机可靠地复位是保证单片机正常运行的关键因素。因此,在设计复位电路时,通常要使RST引脚保持10ms以上的高电平。当RST从高电平变为低电平之后,单片机就从0000H地址开始执行程序。
8051单片机通常都采用上电自动复位和开关复位两种方式。实际使用中,有些外围芯片也需要复位,如8255等。这些复位端的复位电平要求与单片机的复位要求一致时,可以把它们连起来。
在最小系统板上,提供了一个通用的复位电路,在使用该板之前,必须将该电路与单片机连接起来。另外,还可以采用主板上的微处理器监控模块来控制复位脚,以便更加可靠地管理单片机的工作。  

44 存储器、特殊功能寄存器及位地址
51单片机的存储器包括5个部分:程序存储器、内部数据存储器、特殊功能寄存器、位地址空间、外部数据存储器。位地址空间、特殊功能寄存器包括在内部数据存储器内。
51单片机的内部数据存储器一般只有128字节或256字节,当空间不够用时也就需要扩展外部数据存储器(参见实验五)。有些单片机不具有内部程序存储器,例如8031,这时就需要扩展外部程序存储器。在单片机系统中,程序存储器和外部数据存储器的编址独立,各可寻址64K字节空间。两者在电路上,可以通过PSEN信号线和RD信号线区别开来。
特殊功能寄存器是非常重要的部分,我们通过对特殊功能寄存器的设置和读写来完成单片机的大部分工作。限于篇幅,这里不对其内容进行罗列,请查阅有关书籍。

45  51系列单片机内部资源概览表

芯片种类
片内存储器
中断源
定时/计数器
串行口
耗电
制造工艺
ROM/EPROM
RAM
8051
4K
128
5
2
1
125mA
HMOS
8052
8K
256
6
3
1
100mA
HMOS
以上列出的是Intel8051、8051的主要资源配置。现在,由于8位51单片机的广泛使用,各个芯片生产厂商推出了具有自身特色的采用51内核的单片机,它们在这些基本资源的基础上进行了进一步的裁减或增强。
五、实验步骤
1连接单片机与复位电路、时钟源(晶振电路或外部时钟源),选择几组I/O口,用导线分别连接发光二极管阵列、及键盘。以下对涉及到的其他实验模块进行简要介绍:
(1)发光二极管阵列模块:
如左图所示,每行为8个发光二极管,共4行。每行与底部的8针排线座相对应。第一行发光二极管与从左数第一个插座对应,第二行发光二极管与左数第二个插座对应……。插座的每个引脚与发光管阴极相连,也就是说,当对应脚为低电平时,发光二极管点亮。

(2)键盘阵列模块:键盘模块是“独立式”和“矩阵式”两用键盘。使用之前,必须连接键盘模块右下角的VCC和GND,为模块提供电源。模块右边的S0~S15锁紧孔,是独立式键盘接口,分别对应着键S0~S15。当某个键按下时,对应的接口将被拉低。
电路示例如下:

图1-3  电路原理图示例
2实验示例程序:
假设P3.1,P3.2口分别连接两个键,P0口连接第一行发光二极管,P1口连接第二行发光二极管,参看电路图1-3。程序实例如下:
ORG 0000H
AJMP START
ORG 0030H
START:       MOV P 3,0FFH
MOV A,P3
MOV 40H,A                            ;暂放于40H
ACALL  DL10MS                            ;去抖延时
MOV A,P3
CJNE A,40H,PASS
CJNE A,#0FEH,LAMP1;是第一键吗?
MOV P1,#0FFH
MOV P0,#00H        ;点亮第一行发光二极管
PASS:         LCALL DL10MS       ;延时
AJMP START
LAMP1:                  CJNE A,#0FDH,PASS;是第二键吗?
              MOV P0,#0FFH
MOV P1,#00H
AJMP PASS
;延时子程序:
DL10MS:       MOV R7,#08h
LOOP1:    MOV R6,#0F9H
LOOP2:    NOP
          NOP
          DJNZ R6,LOOP2
        DJNZ R7,LOOP1
          RET
END

在Medwin集成开发环境中编写单片机程序,步骤如下:点击【文件】菜单,建立新项目(PROJECT),项目命名如 当前文件夹\XXX.prj;建立新文件,命名为XXX.asm;这时就可在文本编辑区输入程序代码了。程序编写完成后(参考示例程序),点击【项目管理】菜单下【编译/汇编】项,进行程序编译,如果程序有错误则系统通过调试项提示。排除所有的错误,直到编译完全成功。
3正确连接仿真器与PC机、仿真头与目标板、仿真器电源。正确连接目标板电源。点击【项目管理】菜单下产生并生成代码项,程序被装入仿真器,点击调试菜单下【全速运行】选项,程序运行,观察程序运行结果。在【项目管理】菜单下点击【输出Intel Hex文件】或【输出binary文件】,输出机器代码文件。
4正确连接烧录器和PC机、烧录器电源。取单片机芯片,放入烧片机芯片座(注意放置位置),夹紧;打开烧录器驱动软件,点击【器件】菜单下选择器件项,选择正确的芯片型号。点击【文件】菜单下打开项,输入刚才生成.hex或.bin文件的路径,点击打开,文件被下载到烧录器。点击【器件】菜单下【运行】项,分别运行erase, blank check, program,verify(或在确定Auto中内容后,运行Auto)。成功后程序便固化到单片机中了。
5除去目标板电源,将单片机取下,插入目标板插座中,注意对齐1脚。正确连接目标板电源。观察程序运行情况。
六、实验报告
1、说明单片机的各个引脚的功能及作用,比较P0,P3脚的异同?
2、时钟周期、机器周期的关系是什么?在单片机外部晶振为12M时,下面的延时子程序延时了多少时间?当晶振为6M时呢?
DELAY:MOV  R5,#08H
DL1:   MOV   R6,#00H
DL2:   MOV   R7,#80H
DJNZ   R7,$
DJNZ   R6,DL2
DJNZ   R5,DL1
RET
3、画出实验原理图。
4、给出单片机程序流程图和程序清单。
3、进行完该项实验后,你对单片机的开发工具和开发过程了解了吗?请画出单片机开发过程流程图。

第四章 实验指导
实验一 多字节、多进制加减运算实验一、实验目的
  • 学习多字节压缩BCD码加减运算的程序设计;
  • 学习单字节有符号数加减运算的程序设计。
二、实验要求
1.编写通用4字节压缩BCD码的加、减法运算程序;
2.编写通用单字节有符号二进制数加、减法运算程序;
三、实验原理
对于简单的8位加减可以直接调用指令就可以了。例如加法可以使用指令ADD以及带进位加ADDC,但单字节加减法只能在256之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。该实验介绍单片机BCD码多字节加、减运算通用程序的设计。
1.多字节无符号压缩BCD码加法运算
假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。
◆ 入口参数:
R0:被加数地址指针;
R1:加数地址指针;
len:字节数。
◆ 出口参数:
@R0:计算结果;
rLen:计算结果字节数。

◆  使用资源:ACC,R0、R1,内部RAM单元len、rlen及存放被加数、加数、计算结果的内存单元。
示例程序如下:
len    DATA  70H
   rlen   DATA  71H

ADDSTART: PUSH  PSW            ;保护标志寄存器内容
             CLR  C                ;进位位清0
             MOV  rlen,#00H       ;和的字节数先清0
LOOP:    MOV  A,@R0         ;取被加数
            ADDC   A,@R1        ;求和
            DA    A                ;十进制调整
            MOV  @R0,A         ;保存
            INC    R0              ;地址增1
INC    R1
            INC    rlen             ;字节数增1
           DJNZ  len,LOOP     ;所有字节未加完继续,否则向下执行
           JNC    ADDEND         ;和的最高字节无进位转ADD20
          MOV   @R0,#01H    ;和的最高字节地址内容为01H
          INC    rlen
ADDEND:      POP    PSW
               RET
                END

多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD码,最大不超过99,而99+99+1(进位)=199,此时可以不需要使用ADDC指令,但当最低两字节相加后,必须使用“DA  A”进行十进制调整,调整后产生进位。而最高两字节相加后应考虑是否有进位。若有进位,应向和的最高位字节地址写入01H,这时和数将比加数或被加数多出一个字节。
2.多字节无符号压缩BCD码减法运算
为了使用“DA A”指令对十进制减法进行调整,必须采用对减数求补相加的方法,以9AH为模减去减数即得到减数的补数。设被减数低字节地址在R1中,减数低字节地址在R0中,字节数在len中;差的低字节地址在R0中,差的字节数在rlen中。
  • 入口参数:
R0:减数地址指针;
R1:被减数地址指针;
len:字节数
  • 出口参数:
R0:差的地址指针
rlen:差的字节数
  • 使用资源: AR0R1,内部RAM单元
范例程序如下:
    SUBSTART:MOV  rlen,#00H       ;差字节单元清0
          CLR  07H               ;07H做符号位标准,符号位清0
           CLR  C                 ;借位位清0
SUB1:     MOV  A,#9AH       ;减数对模100求补
                SUBB  A,@R0
            ADD  A,@R1      ;补码相加
           DA    A
           MOV  @R0,A          ;存结果
            INC   R0   
           INC   R1
            1NC   rlen   
            CPL    C            ;进位求反以形成正确借位
            DJNZ len,SUBl    ;未减完继续,减完向下执行   
          JNC   SUB2        ;无借位去别Ⅸm返回主程序,否则继续
        SETB  07H           ;有借位,置“1”符号位
SUB2:     RET
               END
程序中对减数求补后与被减数相加,用“DA  A”指令进行调整。若二者相加调整后结果无进位(C=0),则表示二者相减有借位;若二者相加调整后有进位(C;1),则表示二者相减无借位。所以必须对进位标志位C进行求反操作,才能得到正确结果。
3.单字节带符号数加法运算(选做)
编程范例:
两个8位二进制带符号数加法,被加数和加数分别存于BLK和BLK+1单元,和超过8位要占两个单元,设为SUM和SUM+1单元。
解:两个带符号数的加法是作为补码加法处理的。由于和超过8位,因此,和就是一个16位带符号数,符号位在16位数的最高位。为此,直接相加进位是不够的,还要做一些处理。例如-65和-65相加,若直接求和产生溢出,即使扩展到16位,结果也不正确。如:
-65    1 0 1 1 1 1 1 l B
+)-65   1 0 1 1 1 1 1 1 B
0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 B
现在这个16位数的最高位为0,两个负数相加变为正数,显然是错误的。
处理的方法是先将8位带符号数扩展成16位带符号数,然后再相加。若是8位正数,则高8位扩展为00H;若是8位负数,则高8位扩展为0FFH。这样处理后,再按双字节相加,就可以得到正确的结果。如上例,由于是负数,高8位应是全1,然后再加:
      -65    1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1B
    +) -65   1 1 1 1 1 1 1 1 1 0 1 l 1 1 1 1B
             1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0B,
最高位的进位丢失不计。换算成真值为—130,结果正确。
在编程时,判别加数和被加数的符号位,再决定是否要将高8位改为0FFH。
程序如下:
   BLK    DATA  30H
    SUM    DATA  40H

    MOV  R0,#BLK        ;R0指向被加数
    MOV  R1,#SUM        ;R1指向和
    MOV  R2,#0          ;高8位先设为0
    MOV  R3,#0
    MOV  A,@R0         ;取出被加数
    JNB  ACC.7,N1       ;若是正数转移到N1
    MOV  R2,#0FFH       ;若是负数高8位为全1
N1:INC  R0               ;修改即指针
    MOV  B,@R0         ;取加数到B
    JNB  B.7,N2           ;若是正数转移N2
    MOV  R3,#0FFH       ;若是负数高8位为全1
N2:ADD  A,B            ;低8位相加  .
    MOV @R1,A          ;存低8位和
    INC    R1              ;修改R1指针
    MOV  A,R2          ;准备加高8位
    ADDC  A,R3          ;高8位相加
    MOV  @R1,A        ;存高8位和
    SJMP    $
    END
四、实验步骤
1.按照实验要求编写程序。
2.在开发环境中运行程序,对通用寄存器进行赋值,看运算结果是否正确。
五、实验报告
1.给出各个程序的清单,要求有注释。
2.分析DA  A指令的作用。
  • 给出实验参数及实验结果,要求对实验现象和结果进行分析。

实验二、中断实验――中断优先级控制及中断保护
一、实验目的
1、掌握单片机中断机制。
2、熟悉中断的应用和编程。
二、实验设备
  • 仿真器;
  • 单片机最小系统;
  • 发光二极管阵列显示模块;
  • 独立式键盘模块。
三、实验要求
连接单片机最小系统和发光二极管阵列的电路并编写程序,学习单片机中断机制,及中断优先级和中断保护的方法:
使用独立式按键1连接(P3.2),按键2连接(P3.3),在平时状态下,发光二极管行以200ms的时间间隔,依次点亮。1键按下时中断处理程序点亮P0.0对应的发光管2秒钟,其他发光管熄灭;2键按下时P0.1对应发光管点亮2秒,其他发光管熄灭。
四、实验原理
通常一个微处理器读取外围设备(如键盘等)的输入信息的方法有轮询(Polling)及中断(Interrupt)两种。轮询的方法是CPU依照某种既定法则,依序询问每一外围设备I/O是否需要服务,此种方法CPU需花费一些时间来做询问服务,当I/O设备增加时,询问服务时间也相对增加,势必浪费许多CPU时间,降低整体运行的效率。使用中断是一个较好的解决方法。使用中断使系统对外部设备的请求响应更加灵敏,并且不需要占用CPU的时间进行轮询。但是,当使用中断,特别是有多个中断嵌套时要特别注意内存单元的保护。
  • 80C51中断结构
当中断发生后,程序将跳至对应中断入口地址去执行中断子程序,或称中断服务程序(Interrupt Service Routine),这些特殊的地址称为中断向量,例如当80C51外部中断INTl发生时,会暂停主程序的执行,跳至地址0013H去执行中断服务程序,直到RETI指令后,才返回主程序继续执行。MCS-51系列的程序内存中有7个矢量地址,叙述如下:
(1)00H复位
当第9脚RESET为高电平,CPU会跳至地址00H处开始执行程序,亦即程序一定要从地址00H开始写起。
(2)03H(外部中断0)
引脚由高电位变至低电位(跳沿触发方式)或采样到是低电位(电平触发方式)时,CPU会接受外部中断0,并跳至地址03H处去执行中断子程序。
(3)0BH(定时器/计数器0中断)
当CPU接受定时器/计数器0中断置位而产生中断要求时,会跳至地址0BH处去执行中断子程序。
(4)13H(外部中断1)
引脚由高电位变至低电位(跳沿触发方式)或采样到是低电位(电平触发方式)时,CPU会接受外部中断1,并跳至地址13H处去执行中断子程序。
(5)1BH(定时器/计数器1中断)
当CPU接受定时器/计数器1中断置位而产生中断要求时,会跳至地址1BH刻去执行中断子程序。
(6)23H(串行中断1)
当串行端口传送数据或接收数据完毕时,CPU会接受串行中断,并跳至地址23H处去执行中断子程序。
(7)2BH(定时器/计数器2中断)
此中断仅8052系列才有。当CPU接受定时器/计数器2产生中断要求时,会跳至地址2BH处去执行中断子程序。


图2.1 MCU内部中断机制

2.中断使能位
8051针对中断提供两层使能,第一层为EA全局使能控制,第二层为分别控制EX0,ET0、EXl、ETl、ES、ET2。当8051在复位状态时,寄存器的各个中断使能位都预设为“0”,即所有中断都禁止,故欲允许中断时,应先使能相对应的中断。当中断产生后,中断状态会记录于定时器/计数器控制寄存器(Timer/CounterControlRigister,TCON)和串口口控制寄存器SCON的中断请求标志(InterruptRequest flag)中,当标志被置位,表示中断已发生。由图2.1可知,当外部中断或定时器0、定时器1中断发生时,CPU都可以判别是哪种中断。因此当这四个中断发生时,中断服务程序被执行后,CPU会主动清除中断请求标志,对于其他的中断,由于CPU无法判别,因此中断请求标志需由程序指令来清除。
欲设定中断使能与否,必须设置中断使能寄存器IE(Interrupt Enable Register),其位地址A8H,是一个可位寻址的寄存器。

3.中断保护
由于各个中断入口间仅有8个字节,一般情况下难以安排下一个完整的中断服务程序。因此,通常总是在重点入口地址处放置一条无条件转移指令,使程序转向在其他地址存放的中断服务程序。当执行新的中断服务程序时,注意不可以破坏旧有的数据和状态,因此在编写时还要注意保护现场,主要是各个寄存器的值。通常会被更改的数据(如ACC、PSW等),可以利用堆栈在执行中断服务程序之前就将其PUSH起来,待执行结束后再将相关寄存器POP即可。另外,因为8051可任意选择四个工作寄存器区中的一组工作寄存器,所以利用选择不同寄存器区的方式亦可达到数据保存的目的。

4.中断优先级
8051对于各种中断优先权采用双层结构,首先对于优先权可由中断优先权寄存器(Interrupt Priority )IP设定该中断为高优先权或低优先权,高优先权可以中断低优先权,反之不行。当同一时间同一级别的多个中断请求是,则按自然优先级顺序相应中断。

IP寄存器:



PS
PT1
PX1
PT0
PX0

(MSB)                                                              (LSB)
PX0,PX1:外部中断0,1的中断优先级控制;1->高优先级,0->低优先级。
PT0,PT1:定时器/计数器0,1的中断优先级控制;
PS:串行口中断优先级控制。
IP中对应位全为零时,CPU按照片自然优先级来顺序响应中断:
中断源
外部中断0                               高
定时器/计数器0
外部中断1
定时器/计数器1
串行口中断                               低

五、实验步骤
本实验将练习使用的中断,利用按键来触发外部中断的发生。并通过两个中断先后到达的方法,来学习中断优先级的意义与控制。
1、电路说明
在图2.2中,主程序执行时,单片机端口P0所接的LED由P0.7至P0.0一次一颗循环点亮。当外部中断0产生后,执行该中断子程序,此时P0.0对应的二极管亮,其他二极管熄灭。2秒钟后,返回主程序的工作。中断子程序则为点亮P0.1对应的二极管,其他二极管熄灭。注意,由于每次在按键按下或放开可能会有抖动现象,因而必须进行必要的处理,以免产生二次以上的相同中断信号。
在程序主循环进行时,当1键按下,相应发光管点亮后,立即再按下2键,看反应如何;在程序主循环进行时,按下2键,相应发光管点亮后,立即按下1键,观察反应。
电路连线如图2.2:


              1

              2

图2.2  实验电路参考
2.程序设计
先按l键执行中断子程序,在此中断子程序未结束前再按2键,或是先按2键执行中断子程序,在此中断子程序未结束前再按l键,或两者同时按,观察lED亮暗的情形即可观察中断优先权执行的情形。
程序范例
;******************************************************************************

          ORG    0000H
          AJMP   MAIN
          ORG    0003H
          AJMP    INT0INT
          ORG    0013H
          AJMP    INT1INT

;**********主程序**********************************
          ORG    0030H
MAIN:   MOV    SP,#60H   
MOV    IE,#10000101B        ;使能INT0,INTl
          MOV    TCON,#00000101B     ;设INT0、INTl跳沿触发。
          MOV    IP,#01H                                     ;外部中断0优先
        MOV    A,#0FEH
LOOP:   RR     A
          MOV    P0,A
          ACALL  DELAY200MS
          AJMP   LOOP

;*****************INT0中断服务程序*****************************
INT0INT:     CLR  EA
ACALL   DELAY10MS       ;去抖动
JNB  INT0, HAVKEY1         ;确实有键,转HAVEKEY1
SETB  EA
RETI
HAVEKEY1:  PUSH  PSW
             PUSH  Acc
SETB  EA
MOV  P0,#0FEH
ACALL  DELAY2S            ;亮2秒钟
POP  Acc
POP  PSW
RETI

;************INT1中断服务程序******************************
INT1INT:
                (…………)
                 RETI
;********************************************************
DELAY200MS:                                    ;延时200ms子程序
                (…………)
                  RET
DELAY10MS:                                      ;延时10ms子程序
                (…………)
                  RET
DELAY2S:                                         ;延时2s子程序  
                (………….)
                 RET
END

程序范例中用“(………)”表示的程序段需学生自己编写。
运行整个程序,观察是否符合理论分析的结果。
六、实验报告
  • 画出电路原理图,并简要分析工作原理;
  • 提供程序流程图和程序清单,适当给出注释;
  • 描述实验现象和结果,要求对实验现象和结果进行分析。

实验三、定时器实验――低频脉冲计数器
一、实验目的
1、掌握定时器/计数器的工作原理。
2、学习单片机定时器/计数器的应用设计和调试。
二、实验设备
1、仿真器;
2、单片机最小系统;
3、波形信号发生器;
4、静态串行方式数码管显示模块。
三、实验要求
连接电路并编写程序,使单片机定时器/计数器测量波形信号发生器输出的低频脉冲信号的频率,并在数码管上显示频率值;
四、实验原理
805l单片机内部有两个16位可编程定时/计数器,记为T0和Tl。8052单片机内除了T0和T1之外,还有第三个16位的定时器/计数器,记为T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。
定时器T0由特殊功能寄存器TL0和TH0组成,定时器Tl由特殊功能寄存器TLl和TH1组成。定时器的工作方式由特殊功能寄存器TMOD编程决定,定时器的运行控制由特殊功能寄存器TCON编程控制。
T0、T1在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU转向中断处理程序,从而完成某种定时控制功能。T0、T1用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由P3口的P3.4(或P3.5)即T0(或T1)引脚输入。
方式控制寄存器TMOD的控制字格式如下:
7
6
5
4
3
2
1
0
GATE
C/-T
M1
M0
GATE
C/-T
M1
M0
\_____________T1_________________/ \_______________T0_________________/
低4位为T0的控制字,高4位为T1的控制字。GATE为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位TRX(X=0,1)=1和外中断引脚()上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由TRX(X=0,1)=1来启动定时器/计数器运行。
C/-T为方式选择位。C/-T=0为定时器方式,采用单片机内部振荡脉冲的12分频信号作为时钟计时脉冲,若采用12MHz的振荡器,则定时器的计数频率为1MHZ,从定时器的计数值便可求得定时的时间。
C/-T=1为计数器方式。采用外部引脚(T0为P3.4,Tl为P3.5)的输入脉冲作为计数脉冲,当T0(或T1)输入信号发生从高到低的负跳变时,计数器加1。最高计数频率为单片机时钟频率的1/24。
M1、M0二位的状态确定了定时器的工作方式,详见表3.1。
表3.1定时器工作模式表:
Ml
M0
功能说明
0
0
方式0,为13位定时器/计数器
0
1
方式1,为16位的定时器/计数器
l
0
方式2,为常数自动重新装入的8位定时器/计数器
1
1
方式3,仅适用于T0,分为二个8位计数器

方式1与方式2的差别是计数器的位数,前者13位,后者16位。定时器内部结构逻辑图如图3.1所示。

图3.1 定时器内部逻辑图

要测量低频信号可以首先产生一个标准时间T闸门信号,然后在该时间内计算进入计数器的脉冲个数。这个时间有时太短,需结合软件定时。如果要求比较高,则需要进行智能地调整T。例如对于500HZ信号,使用65ms闸门时间,则计数器值就非常少。计数器的值超过10000个,才能保证精度不少于0.05%。如果在3秒内还是发现计数器的值少于精度需要,则自动切换到周期测量模式,通过周期计算频率具有较高的精度。如果要求3秒内给出结果,则周期超过3秒的信号就无法得到准确的频率或周期。
五、实验步骤
1.电路连接
参考以下电路示意图连接电路:


图3.2 低频脉冲信号测量参考电路示意图
2.软件编写
示例程序如下:
            ORG     0000H
            LJMP    MAIN
           (______________)
LJMP    INTS_T0

;***********************主程序**************************************
            ORG     0030H
MAIN:      MOV     SP,#40H
MOV     TMOD,(___)
;两个定时器都是方式1,定时器1对外部信号计数
            MOV     TL0,#0AFH
            MOV     TH0,#3CH              ;0FFFFH-3CAFH=50000,50ms
            MOV     B,#20      ;软件计数器。循环20次,T0共定时20×50ms=1s
            MOV     TL1,#0H
            MOV     TH1,#0H
            (____________)                       ;允许T0中断
            (____________)                      ;禁止T1中断
            SETB    EA
            SETB    TR0
            SETB    TR1
            SJMP     $

;******************T0定时1s的中断服务程序****************************
INTS_T0:    CLR     EA                        ;关中断
DJNZ    B,CONTINUE              
;1s定时到,把T0、T1都关掉,计算1s钟内T1的计数脉冲有多少   

CLR     TR1         
CLR     TR0
            MOV     R0,#30H
            MOV     @R0,TL1                      ;获取数据。先低后高
            INC     R0
            MOV     @R0,TH1;
ACALL    NDIV1                        ;16位调整为五个十进制数

MOV     R0,#36H
DSHOW:    ACALL    SHOW                         ;显示
            MOV     TL1,#0H
            MOV     TH1,#0H
            SETB    TR0
            SETB    TR1
            MOV     B,#20
CONTINUE:
            MOV     TL0,#0AFH
            MOV     TH0,#3CH
            SETB    EA
(_________)           ;中断返回

;********(31H高8位 30H低8位)***********************************************
;********(32H个位,33H十位,34H百位,35H千位,36H万位);R3,R4余数***********
;********NDIV1子程序:把0~FFFFH,转换成五个十进制数**************************
NDIV1:
         MOV   R0,#30H
         MOV   R1,#36H
         MOV   R2,#0                              ;商65535
L10000:                                             ;除以10000   即2710H
         CLR   C
         MOV   R0,#30H
         MOV   A,@R0
         SUBB  A,#10H
         MOV   R3,A                             ;低位余数
         INC   R0
         MOV   A,@R0
         SUBB  A,#27H
         MOV   R4,A
         JC    L1000                             ;不超过10000,
         INC   R2
         MOV   30H,R3
         MOV   31H,R4
         JMP   L10000
L1000:                                          ;除以1000   即3E8H
         MOV   36H,R2
         MOV   R2,#0H
L1000A:
         MOV   R0,#30H
         CLR   C
         MOV   A,@R0
         SUBB  A,#0E8H
         MOV   R3,A                                    ;低位余数
         INC   R0
         MOV   A,@R0
         SUBB  A,#3H
         MOV   R4,A
         JC    L100                                      ;不超过1000
         INC   R2
         MOV   30H,R3
         MOV   31H,R4
         JMP   L1000A
L100:                                                     ;除以100   即64H
         MOV   35H,R2
         MOV   R2,#0H
L100A:
         MOV   R0,#30H
         CLR   C
         MOV   A,@R0
         SUBB  A,#64H
         MOV   R3,A                                     ;低位余数
         INC   R0
         MOV   A,@R0
         SUBB  A,#0H
         MOV   R4,A
         JC    L10                                      ;不超过100
         INC   R2
         MOV   30H,R3
         MOV   31H,R4
         JMP   L100A
L10:
         MOV   34H,R2
         MOV   R2,#0H
L10A:
         MOV   R0,#30H
         CLR   C
         MOV   A,@R0
         SUBB  A,#10
         MOV   R3,A                                       ;低位余数
         JC    L1                                        ;不超过10
         INC   R2
         MOV   30H,R3
         JMP   L10A
L1:
         MOV   33H,R2
         MOV   32H,30H
         RET

;******************显示子程序***********************************
SHOW:
         MOV   SCON,#00H                       ;设定串行工作模式为0
         MOV   R1,#05H                          ;数码管显示的位数5位
         MOV   DPTR,#TAB
LOOP:
         MOV   A,@R0
         MOVC  A,@A+DPTR                     ;取出字型码
         MOV   SBUF,A                          ;发送
WAIT:    JNB   TI,WAIT                         ;等待一帧发送完毕
         CLR   TI
         DEC   R0                              ;指向下一字型码
         DJNZ  R1,LOOP
         (_______)           ;子程序返回
TAB:  
DB  0FCH, 060H, 0DAH, 0F2H, 66H, 0B6H, 0BEH, 0E0H, 0FEH, 0F6H
;显示字型为0,1,2,3,4,5,6,7,8,9
DB  8EH, 7CH, 1CH, 0ceH, 6eH, 60H                  ;显示字型F,U,L,P,H,I
         END

在(____)中填上合适的语句,运行程序,使用信号发生器发生不同频率的信号,并纪录测量的值。
六、实验报告
  • 画出电路原理图。
  • 给出程序流程图和程序清单、并给予适当注释。
  • 描述实验现象和结果,要求对实验现象和结果进行分析。
  • 本实验中,频率测量的有效范围是多少?

实验四、双机串行通讯实验一、实验目的
该实验需要两套MPC100B配合完成。
1.掌握单片机串行口工作方式;
    2.掌握双机通讯的接口电路设计及程序设计。
二、实验设备
1.仿真器;
2.单片机最小系统教学实验模块;
3.外部数据存储器模块;
三、实验要求
由两套单片机试验装置(两个实验小组)共同完成该实验。我们称装置1为甲机,装置2为乙机。甲机发送一个字节的呼叫信号给乙机,乙机正确地收到该呼叫信号后,返回一个字节的应答信号。当甲机收到正确的应答信号后,再发送规定格式的数据帧。数据帧必须包括以下内容:
数据长度(1字节)+ 数据(n字节)+ 校验和(1字节)
乙机收到完整的数据帧后,发送一个表明接收正确或错误的应答字节。
要求每个字节的发送帧格式为:起始位(1bit)+数据位(8bit)+停止位(1bit)。
要求通讯波特率为4800bps,而以上各信号和数据帧的具体数据内容,可以自行规定。
四、实验原理
41 串行通讯的方式
在串行通讯中,有两种基本的通讯方式:异步通讯,同步通讯。
异步串行通讯规定了字符数据的传送格式,既每个数据以相同的帧格式发送。每个帧信息由起始位、数据位、奇偶校验位和停止位组成。本实验主要学习异步通讯的实现方法。
在异步通讯中,每一个字符要用起始位和停止位作为字符开始和结束的标志,以至占用了时间。所以在数据块传送时,为了提高通讯速度,常去掉这些标志,而采用同步通讯。同步通讯不像异步通讯那样,靠起始位在每个字符数据开始时发送和接受同步。而是通过同步字符在每个数据块传送开始时使收/发双方同步。
按照通讯方式,又可将数据传输线路分成三种:单工方式、半双工方式、全双工方式。
(1)单工方式
在单工方式下,通讯线的一端联接发送器,另一端联接接收器,它们形成单向联接,只允许数据按照一个固定的方向传送。
(2)半双工方式
在半双工方式下,系统中的每个通讯设备都由一个发送器和一个接收器组成,通过收发开关接到通讯线路上,如图所示。在这种方式中,数据能从A站送到B站,也能从B站传送到A站,但是不能同时在二个方向上传送,即每次只能一个站发送,另一个站接收。如图4.1所示。
图4.1 半双工通讯

图4.1中的收发开关并不是实际的物理开关,而是由软件控制的电子开关,由通讯线两端的半双工通讯协议进行功能切换。
(3)全双工(Full—duplex)方式
虽然半双工方式比单工方式灵活,但它的效率依然较低。从发送方式切换到接收方式所需的时间一般大约为数毫秒,这么长的时间延迟在对时间较敏感的交互式应用(例如远程检测监视控制系统)中是无法容忍的。重复线路切换所引起的延迟积累,正是半双工通信协议效率不高的主要原因。
半双工通讯的这种缺点是可以避免的,而且方法很简单,即采用信道划分技术。在下图的全双工连接中,不是交替发送和接收,而是可同时发送和接收。全双工通讯系统的每一端都包含发送器和接收器,数据可同时在两个方向上传送。如图4.2所示。
图4.2  全双工通讯

42单片机串行口工作方式
在定时器实验中,我们熟悉了单片机串口工作方式0;单片机串口还具有有3种工作方式。如下表所示:
方式1(01)
8-bit UART
波特率可变
方式2(10)
9-bit UART
波特率为1/32fosc或1/64fosc
方式3(11)
9-bit UART
波特率可变
这3种工作方式,均用于串行异步通讯。在异步串行通讯的一个字节的传送中,必须包括了起始位(0)和停止位(1)。除此之外,方式1具有8位(1个字节)的数据位(低位在先),方式2、3则除这8位之外,还具有一个可编程的第9位,这个第9位编程通常被编程为奇偶校验位。
串口工作方式在特殊寄存器SCON中设置。
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
(MSB)                                                                  (LSB)
其中的SM0和SM1位确定了串口工作方式。要使通讯双方能够通讯成功,必须具有相同的串口工作模式;REN为允许接收位,本实验中因为双方都要进行接收,因此REN也都应设为1。TB8和RB8这里暂不涉及。利用以下语句来设置SCON:
MOV SCON,#50H
43 波特率的设置
在异步串口通讯中,一个很重要的工作就是进行串口波特率的设置。波特率是指串口通讯中每秒传送的位数,单位为bps,它反映了串行口通讯的速度;同时,通讯双方的速度必须一致,才能够顺利进行通讯。
在串口工作方式1、3中,传送波特率都是可变的。单片机内部通过定时器T1来提供发送与接收缓存器的内部移位时钟。也就是说,要确定串行通讯的波特率,必须对T1进行相关设置。51单片机系统对此时T1的设置有以下固定的规定:
  • 必须工作在定时器状态;
  • 必须工作在“8位自动重载”工作模式;
这必须在特殊寄存器TMOD中进行设置。可以利用以下语句来设置TMOD:
MOV  TMOD,#20H
除了对TMOD的设置外,还必须设置定时器T1的初值,也就是保存在TH1中的8位重载值。这直接影响到波特率的大小:
它通过以下公式进行计算:
其中的SMOD为特殊寄存器PCON的最高位。当它置1时,可以将波特率增大1倍。
在双机通讯中,只要双方的波特率一致就能够完成通讯了;但是,在标准的异步通讯协议中,只有几种波特率是适用的。例如1200bps,2400bps,4800bps,9600bps……等等。
而通过这个公式可以看出,并不是所有的晶振频率都能够得到准确的上述波特率。比如采用12MHz晶振,代入公式进行运算,就无法得到4800bps的准确波特率(TH1必须为小数了)。在这种情况下,过去人们都使用软件补偿的方法,尽量得到准确的波特率;而现在,市场上有很多通讯专用的晶振,例如3.6864MHz、11.0592MHz……的晶振,都能够直接得到准确的波特率。因此在进行本实验时,必须使用通讯专用晶振(如果使用仿真器,则设置为使用仿真头的外接晶振,并将11.0592M的晶振插入仿真头。)
当波特率已经确定,就可以反向推导出TH1的取值。例如,在本次实验中,我们要求波特率为4800bps,在晶振采用11.0592MHz的情况下,推出TH1=0F4H。
使用以下语句设置初值:
MOV TH1,#0F4H
MOV TL1,#0F4H
44 双机通讯接口设计
(1)通讯接口设计
在本次实验中,主要讨论单片机系统之间的异步串行通讯的实现。
51单片机具有1个“全双工”的串行口,主要因为单片机内部有独立的发送器(1字节缓存)和接收器(1字节缓存)。但由于串口缓存太少,只有1字节,在相互传送大量数据时,软件上实际采用的还是半双工的工作方式。
如果两个51单片机应用系统相距很近,可以将它们的串行口用导线直接连起来,就构成了双机通讯,请注意两个单片机系统要“共地”。如图4.3所示。


图4.3 串行通讯电路示意图

(2)查询方式双机通讯软件设计
为确保通讯成功,通讯双方必须在软件上有一系列的约定,通常称为软件“协议”。本例规定的软件“协议”如下:
通讯双方均采用4800bps波特率进行传送(系统时钟频率为11.0592MHz),甲机发送数据,乙机接收数据。双机开始通讯时,甲机发送一个呼叫信号“06H”,询问乙机是否可以接收数据;乙机收到呼叫信号后,若同意接收数据则发回“00H”作为应答,否则发“15H”表示暂不能接收数据,甲机只有收到乙机的应答信号“00H”后才可把存放在外部数据存储器的字节内容发送给乙机,否则继续向乙机呼叫,直到乙机同意接收。呼叫成功后甲机依次发送长度字节(1字节)、数据字节(n字节)和校验和字节(1字节),其中校验和为长度字节和数据字节的“累加和”。乙机在成功收到甲机的数据之后,发送“0FH”作为成功应答,否则发送“F0H”作为失败应答。

◆ 甲机发送程序约定:
1)基本设置
波特率设置初始化:定时器T1模式2工作,计数常数0F4H;
PCON的SMOD=1;
串行口初始化:方式1工作,允许接收;
内部RAM和工作寄存器设置:31H和30H存放发送的数据块首址;2FH存放发送的数据块长度; R6为校验和寄存器。
2)程序流程图及程序清单
如图4.4所示。
图4.4发送程序流程图

图4.5接收程序流程图
甲机发送程序清单:
                                          ORG 0000H
                                          AJMP FMT_T_S
                                          ORG 0030H
FMT_T_S:     MOV   TMOD,(______)             ;波特率设置
MOV   TH1,#0F4H
MOV   TL1,0F4H
SETB    TRl
MOV  SCON,(______)           ;串行口初始化
MOV  PCON,#80H           ;置SMOD=1
FMT_RAM:    MOV  R0,#30H              ;设置R0指针
MOV  R7,2FH               ;送字节数至R7
MOV  R6,#00H              ;清累加和寄存器
TX_ACK:      MOV  A,#06H               ;发呼叫信号“06”
MOV  SBUF,A
WAITl:        JBC  TI,RX_YES             ;等待发送完一个字节
                SJMP  WAITl
RX_YES:      JBC   RI,NEXTl              ;接收乙机回答
                SJMP  RX_YES
NEXTl:        MOV  A,SBUF          ;判断乙机是否同意接收,不同意就继续呼
CJNE  A,#00H,TX_ACK
TX_BYTES:    MOV  A,R7                 ;向乙机发送要传送的字节个数
MOV  SBUF,A
ADD  A,R6
                MOV  R6,A
WAIT2:       JBC   TI,TX_NEWS
SJMP  WAIT2
TX_NEWS:    MOV  A,@R0                 ;发送数据
(_____________)
ADD  A,R6                       ;形成累加和送R6
MOV  R6,A
INC   R0                       ;指针加1
WAIT3:       JBC   TI,NEXT2
SJMP  WAIT3
NEXT2:       DJNZ  R7,TX_NEWS               ;判发送结束
TX_SUM:       MOV  A,R6                       ;数据巳发送完,发累加给乙机
MOV  SBUF,A
WAIT4:       (_______________)   
(______________)
RX_0FH:     JBC  RI,IF_0FH                     ;等待乙机回答
             SJMP  RX_0FH
IF_0FH:       MOV  A,SBUF
               CJNE  A,#0FH,FMT_RAM          ;判断传送正确否
SJMP $

◆乙机接收程序
   接收程序约定:
   波特率设置初始化:同发送程序
   串行口初始化:同发送程序
   寄存器设置:
31H,30H——存放接收数据缓冲区首址
R7——数据块长度寄存器
R6——校验和寄存器
    向甲机回答的状态信息:0FH为接收正常,F0H为传送出错,00H为同意接收数据。
接收程序流程框图如图4.5:

乙机接收程序清单:
                                          ORG 0000H
                                          AJMP FMT_T_S
                                          ORG 0030H
FMT_T_S:      MOV  TMOD,#20H                ;T1初始化
                 MOV  TH1,#0F4H
                 MOV  TL1,#0F4H
                 SETB  TR1
                 MOV  SCON,#50H              ;串行口初始化
                 MOV  PCON,#80H
FMT_RAM:     MOV  R0,#30H               ;设置R0指针
                 MOV  R6,#00H                ;校验和寄存器清零
RX_ACK:       JBC   RI,IF_06H              ;接收呼叫信号
                 SJMP  RX_ACK
IF_06H:         MOV  A,SBUF                ;判断呼叫信号是否有误
CJNE  A,#06H,TX_15H
TX_00H:        MOV  A,#00H                 ;向甲机回送同意接收信号
                 MOV  SBUF,A
WAIT1:         JBC   TI,RX_BYTES           ;等待应答信号发送完
SJMP   WAIT1
TX_15H:        MOV   A,#15H                ;向甲机报告接收呼叫信号不正确
                 MOV   SBUF,A
WAIT2:         JBC    TI,HAVE1     
                 SJMP   WAIT2
HAVE1:         LJMP   RX_ACK
RX_BYTES:     JBC   RI,HAVE2                 ;接收数据块长度
                 SJMP  RX_BYTES   
HAVE2:         MOV  A,SBUF                   ;给长度寄存器赋值
                 MOV  R7,A
                 MOV  R6,A                      ;形成累加器和
RX_NEWS:     JBC  RI,HAVE3                   ;接收数据
                SJMP  RX_NEWS
HAVE3:        MOV   A,SBUF                   ;将接收到的数据存入外部RAM
                MOV  @R0,A
                INC  R0
                ADD  A,R6                      ;形成累加和
                MOV  R6,A
DJNZ  R7,RX_NEWS             ;判断数据是否接收完毕
RX_SUM:      JBC  RI,HAVE4                  ;接收数据校验和
SJMP   RX_SUM
HAVE4:        MOV   A,SBUF                 ;判断传送是否正确
CJNE  A,06H,TX_ERR
TX_RIGHT:    MOV  A,#0FH                   ;向甲机报告传送正确
MOV  SBUF,A
WAIT3:        JBC  TI,OKEND      
                SJMP  WAIT3
TX_ERR:      MOV  A,#0F0H                   ;向甲机报告传送有误
MOV  SBUF,A
WAIT4:       JBC  TI,AGAIN      
SJMP  WAIT4
AGAIN:       LJMP  FMT_RAM                 ;返回重新接收数据状态
OKEND:       SJMP OKEND
五、实验步骤
1.参考图4.3进行电路设计,画出电路图,并用导线正确连接两套装置的单片机最小系统实验模块,以及连接最小系统模块与外部数据存储器模块。
2.参考示例程序,按照实验要求编写程序流程图,然后编写程序。连接好仿真器,对编写的程序进行仿真调试,直至通讯成功。
六、实验报告
1.画出接口电路原理图。
2.在该实验中,单片机串行口工作在什么工作方式下?说明该工作方式的特点。
3.波特率是什么?怎样设置单片机串口通讯的波特率?如果实验要求通讯波特率为9600bps,怎样修改程序?
  • 详细说明本次实验采用的通讯协议。
  • 给针对实验要求编写甲机和乙机的程序流程图、程序清单并给予适当注释。
  • 描述实验现象和结果,要求对实验现象和结果进行分析。

实验五、SRAM外部数据存储器扩展实验
一、实验目的
1、学习SRAM(静态RAM)芯片的工作原理和结构;
2、学习单片机扩展数据存储器的接口方法。
二、实验设备
  • 仿真器
  • SRAM数据存储器扩展接口模块;
2.单片机最小系统模块;
三、实验要求
连接电路并编写程序,使得:第一步,单片机在SRAM中填入不断增加的数字,0,1,2,3……9,然后再从0开始到9,直到添满整个SRAM。第二步,将数据读出并验证是否符合原写入的规律。该实验主要通过仿真器来观察程序工作情况。
四、实验原理
4.1  51单片机片外总线结构
如图5.1所示为51单片机的片外总线结构图。
其中,P0口在接外部存储器时,作为地址总线的低8位及数据总线复用。它能以吸收电流的方式驱动8个TTL负载。P2口在访问外部存储器时,可以作为高8位地址总线送出高8位地址。
由图5.1可以看到,51单片机的引脚除了电源、复位、时钟接入、用户I/O外,其余管脚都具有系统扩展的功能。这些引脚构成了51单片机的片外3总线结构,即:
  • 地址总线(AB):宽度为16位,因此,可以寻址64K字节的外部存储器空间。地址总线由P0口经锁存器提供低8位地址(A0A7),P2提供高8位地址(A8A15)。
  • 数据总线(DB):宽度为8位,由P0口作为数据总线。
  • 控制总线(CB):P3口及RESETEAALEPSENRDWR
图5.1 51单片机的片外总线结构图。

42 62256的工作原理
SRAM的容量一般为32K,64K,128K等,其中HY62256ALp-10容量为32Kx8位(即256K位)是高速、低功耗的静态存储器。存储单元访问时间为10ns,2-5V的宽工作电压。
DIP-28封装管脚如图5.2所示。

图5.2 引脚图

管脚定义如表5.1所示。
表5.1 管脚定义
管脚名
功能
A0-A14
地址
-CS
片选
-OE
输出使能端
-WE
写使能端
I/O1?I/O8
数据输入/输出
VCC
电源
GND

内部逻辑结构如图5.3所示

操作真值表5.2:
表5.2  操作真值表
-CS
-WE
/OE
模式
I/O操作
H
X
X
待机模式
高阻态
L
H
H
禁止输出
高阻态
L
H
L
输出
L
L
X
输入
操作时序以-70型号为例,如表5.3所示。
表5.3  操作时序参数
读周期
符号
参数
最小值
最大值
单位
tRC
读周期时间
70
--
ns
TAA
地址访问时间
--
70

TACS
片选访问时间
--
70

TOE
OE到输出有效延迟
--
35
ns
TCLZ
片选有效,高阻态到输出延迟
5
--
ns
TOLZ
OE有效,高阻态到输出延迟
5
--

TCHZ
片选到输出高阻态延迟
0
30
ns
TOHZ
OE到输出高阻态延迟
0
30

TOH
输出保持到地址改变
5
0

写周期
TWC
写周期
70
--
ns
TCW
片选到写结束
65
--
ns
TAW
地址有效到写结束
65
--
ns
TAS
地址建立时间
0
--
ns
TWP
写脉冲宽度
50
--
ns
TWR
写恢复时间
0
--
ns
TWHZ
写到输出高阻态
0
30
ns
TDW
数据到写时间重叠
35
--
ns
TDH
数据保持到写
0
--
ns
TOW
输出到写结束
5
--
ns

1READ读操作。
-CE、-OE/VPP低电平,在内部-CE作为电源控制(高电平进入省电模式),-OE/VPP,控制数据从Q0-Q7端输出。当地址信号稳定之后,地址访问时间tACC等于-CE到数据输出的延迟时间。满足tACC tCE条件下数据在-OE/VPP高下降沿之后可用。
时序如图5.4所示。

图5.4  READ读操作时序1

当1、-WE为高电平;2、器件连续保持-CS= VIL;3、-OE =VIL,则访问时序图如图5.5所示。

图5.5  READ读操作时序2

2写操作
写操作发生在-CS和-WE都是低电平的情况下,在-CS或-WE的最后的一个下降沿则写操作开始。在-CS或-WE的最先的一个上升沿则写操作结束。tWP测量写操作开始到结束的时间。
写时序如图5.6所示。

图5.6  READ读操作时序3
五、实验步骤
1、连接电路

电路参考如下。

62256共具有32K字节空间,因此它需要15位地址(A0~A14),使用P0、P2.0-P2.6作为地址线,片选线CE接地。按照该电路,62256的全部地址空间为0000H~7FFFH。
2.编程参考:
         ORG 0000H
         JMP MAIN
         ORG 0030H
MAIN:
         MOV SP,#60H
         MOV A,#0H
         MOV DPTR,#0000H
         MOV R0,#00H
LOOP:
         ADD A,#1
         DA  A
         ANL A,#0FH                   ;则总在0到9之间
         MOVX @DPTR,A
         INC DPTR
         DJNZ R0,LOOP;载入256个

;读出送到静态串行显示口
         MOV 30H,#0;
         MOV 31H,#0;
         MOV 32H,#0;
         MOV 33H,#0;
         MOV 34H,#0;
         MOV 35H,#0;
         MOV R3,#00H;读数据的个数
         MOV DPTR,#0000H
GET_LOOP:
         MOV R0,#30H;存放的首地址
         MOV R1,#31H
         MOV R2,#5;6个显示的数据,移动5个
         ;推入到显示存储区,向后移动
SHIFT_LOOP:
         MOV A,@R1
         MOV @R0,A
         INC  R0
         INC  R1
         DJNZ R2,SHIFT_LOOP
         MOVX A,@DPTR
         MOV  @R0,A;写到最后一个位置
         ;显示在数码管上
         ACALL SHOW
         ACALL DELAY
         INC  DPTR
         DJNZ R3,GET_LOOP;256个
         JMP MAIN
         RET

DELAY:   ;延时子程序;大约1秒
         PUSH  04H
         PUSH  05H
         PUSH  06H
         MOV R4,#01H
         MOV R5,#0H
         MOV R6,#0H
DELAYLOOP:
         NOP
         NOP
         NOP
         NOP

         DJNZ R6,DELAYLOOP;原地循环
         DJNZ R5,DELAYLOOP
         DJNZ R4,DELAYLOOP
         POP   06H
         POP   05H
         POP   04H
         RET

SHOW:
         PUSH  00H
         PUSH  01H
         PUSH  0E0H
         PUSH  DPH
         PUSH  DPL
         MOV  SCON,#00H       ;设定串行工作模式为0
         MOV  R1,#06H        ;数码管显示的位数
         MOV  R0, #30H        ;字型码首地址偏移量
         MOV  DPTR,#TAB
LOOPSHOW:
         MOV  A,@R0
         MOVC A,@A+DPTR      ;取出字型码
         MOV  SBUF,A         ;发送
WAIT:    JNB  TI,WAIT         ;等待一帧发送完毕
         CLR  TI
         INC   R0             ;指向下一字型码
         DJNZ  R1,LOOPSHOW
         POP  DPL
         POP  DPH
         POP  0E0H
         POP  01H
         POP  00H
         RET
TAB:DB  0FCH,060H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H
DB  8EH,7CH,1CH,0ceH,6eH,60H,00H
;显示字型为0,1,2,3,4,5,6,7,8,9,F,U,L,P,H,I
;0   1    2    3    4   5    6    7    8     9  10F  11U 12L 13P 14H 15I
;16 NOTHING
         END
  编写程序,并装入仿真器,运行程序,通过开发环境观察数据区内容。
六、实验报告
  • 画出接口电路原理图,
  • 说明62256的工作原理。简要分析电路工作原理,说明地址分配的依据。
  • 说明单片机的总线结构,并说明电路中锁存器的作用?
  • 给出针对实验要求编写的程序清单、并给予适当注释。
  • 描述实验现象和结果,要求对实验现象和结果进行分析。

实验六、矩阵式键盘输入实验
一、实验目的
1.学习矩阵式键盘工作原理;
2.学习矩阵式键盘接口的电路设计和程序设计。
二、实验设备
1.仿真器
2.单片机最小系统实验教学模块
3.矩阵式键盘实验模块
4.动态扫描数码管显示模块
三、实验要求
要求实现:在矩阵式键盘中的某个键被按下时,8位LED动态显示器上最低位显示该键对应的字符,以前的字符向高位推进1位(即类似于计算器)。
四、实验原理
矩阵式由行线和列线组成,按键位于行、列的交叉点上。如图所示,一个4*4的行、列结构可以构成一个16个按键的键盘。很明显,在按键数量较多的场合,矩阵式键盘与独立式键盘相比,要节省很多的I/0口。
图6-1  矩阵式键盘结构
41 矩阵式键盘工作原理
按键设置在行、列交节点上,行、列分别连接到按键开关的两端。行线通过上拉电阻接到+5V上。平时无按键按下时,行线处于高电平状态,而当有按键按下时,行线电平状态将由与此行线相连的列线电平决定。列线电平如果为低,则行线电平为低,列线电平如果为高,则行线电平则为高。这一点是识别矩阵式键盘是否被按下的关键所在。由于行列式键盘中行、列线为多键共用,各按键均影响该键所在行和列的电平。因此,各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。

42 按键识别方法
下面以图6-2中4号键被按下为例,来说明此键是如何被识别出来的。
前已述及,键被按下时,与此键相连的行线电平将由与此键相连的列线电平决定,而行线电平在无键按下时处于高电平状态。如果让所有列线处于高电平那么键按下与否不会引起行线电平的状态变化,始终是高电平,所以,让所有列线处于高电平是没法识别出按键的。现在反过来,让所有列线处于低电平,很明显,按下的键所在行电平将也被置为低电平,根据此变化,便能判定该行一定有键被按下。但我们还不能确定是这一行的哪个键被按下。所以,为了进一步判定到底是哪—列的键被按下,可在某一时刻只让一列线处于低电平,而其余所有列线处于高电平。当第1列为低电平,其余各列为高电平时,因为是键4被按下,所以第1行仍处于高电平状态;当第2列为低电平,其余各列为高电平时,同样我们会发现第1行仍处于高电平状态,直到让第4列为低电平,其余各列为高电平时,因为是4号键被按下,所以第1行的高电平转换到第4列所处的低电平,据此,我们确信第1行第4列交叉点处的按键,即4号键被按下。
根据上面的分析,很容易得出矩阵键盘按键的识别方法,此方法分两步进行。第一步,识别键盘有无健被按下;第二步,如果有键被按下,识别出具体的按键。分述如下:
识别键盘有无键被按下的方法是:让所有列线均为低电平,检查各行线电平是否有低电平,如果有,则说明有键被按下,如果没有,则说明无键被按下(实际编程时应考虑按键抖动的影响,通常总是采用软件延时的方法进行消抖处理)。
识别具体按键的方法是(亦称之为扫描法):逐列置零电平,并检查各行线电平的变化,如果某行电平由高电平变为低电平,则可确定此行此列交叉点处按键被按下。
请注意:由于键盘模块做了特殊的处理,使得矩阵式键盘的行线输出的电平状态与前面所述正好相反。即,行线的输出电平,在平时为低电平,有键按下时(该键对应列线输入为低电平),该键对应的行线输出为高电平。在编程的时候请注意这一点。
五、实验步骤
1、按照图6-2的电路图,用导线将矩阵式键盘、数码管动态扫描显示模块和单片机的最小系统实验模块连接正确。
2、示例程序如下:
keyvalue  equ   40h      ;读到键盘的值暂放的地址
dispptr      equ   37h      ;显示缓冲区地址高位
firstptr      equ   30h      ;显示缓冲区地址低位
ORG 0000H
AJMP INIT
ORG 0030H
INIT:         mov r0,#firstptr
         mov r1,#08H
initloop:      MOV A,#10H           ;显示缓冲区存放‘灭’
         mov  @r0,a
          inc  r0
          djnz r1,initloop   
LOOP:        MOV  P2, #00H        ;关闭所有显示
MOV  R4,#04H        ;列扫描数
        MOV  R5,#0EFH       ;扫描第一列
KEY:         MOV  A,R5           ;
          MOV  P1,A           ;送出列扫描码
MOV  A,P1           ;读出行扫描码
          MOV  keyvalue,A     ;暂存在KEYVALUE
         ORL  A,#0F0H
          CJNE A,#0F0H,KEY_ON ;判断是否有键按下
ACALL DISP         
MOV  A,R5           ;未有按键按下,扫描下一列
        RL   A
          MOV R5,A
          DJNZ R4,KEY     
         JMP  LOOP            ;不断重新扫描键盘
KEY_ON:    ACALL DL10MS            ;延时10MS
         MOV   A,P1             ;扫描键盘
         CJNE  A,keyvalue,KEY   ;判断有键盘按下,转移到K1
                                    ;如果没有键盘按下,则重新开始扫描
         (…………)                ;等待键释放程序
K1:          CJNE  A,#0E1H,K2         ;K0未按下,转移K1
         LCALL movdisp
       MOV   firstptr,#0   
          ACALL disp
      LJMP  LOOP

K2:           (……….)       ;K1未按下,转移K2

K3:           (……….)       ;K2未按下,转移K3

K4:          (……….)       ;K3未按下,转移K4

K5:          (……….)      ;K4未按下,转移K5

K6:          (……….)      ;K5未按下,转移K6

K7:           (……….)      ;K76未按下,转移K7

K8:          (……….)       ;K7按下,转移K8

K9:           (……….)      ;K8未按下,转移K9

K10:          (……….)       ;K9未按下,转移K10

K11:           (……….)       ;K10未按下,转移K11

K12:           (……….)       ;K11未按下,转移K12

K13:            (……….)       ;K12未按下,转移K13

K14:           (……….)        ;K13未按下,转移K14

K15:           (……….)        ;K14未按下,转移K15

K16:            (……….)        ;K15未按下,转移ERROR

error:   lcall key                 ;重新扫描键盘

;//显示程序
;30h-37h:显示缓冲区;

DISP:           MOV P2,#00H
DISPLOOP2:     mov r2,#8
disploop0:       mov r1,#01h
           mov r0,#30h
           mov dptr,#tab
disploop1:      mov  a,@r0
           movc a,@a+dptr
          mov  p0,a
           mov  p2,r1
           lcall dl1ms
          inc  r0
          mov  a,r1
           rl   a
          mov  r1,a
           djnz r2,disploop1
            RET

DL1MS:     (……….)

DL10MS:      (….……)

movdisp:      mov  r0,#dispptr
          mov  r1,#dispptr
          mov  r2,#7
mov_lp:       dec  r0
          mov  a,@r0
          mov  @r1,a
          dec  r1
          djnz r2,mov_lp
          ret
tab:         DB 03H,9FH,25H,0DH,99H,49H,41H,1FH         ;0,1,2,3,4,5,6,7
          DB 01H,09H,11H,0C1H,63H,85H,61H,71H        ;8,9,A,B,C,D,E,F
          DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH      ;灭
          DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
END

(……….)部分要求学生自己编写,将程序调入仿真器进行调试,直至达到实验要求。
六、实验报告
1、画出接口电路原理图,并简要分析电路的执行过程。
2、给出程序流程图和程序清单、并给予适当注释。
3、图6-2的电路示意图共采用了P0、P1、P2三个I/O口,你有没有更节省I/O线的方案?请给出电路示意图。
  • 实验过程中遇到哪些问题,是如何解决的?
  • 描述实验现象和结果,要求对实验现象和结果进行分析。

实验七、8255可编程并行I/O扩展接口实验
一、实验目的
1.熟悉8255并行接口芯片的基本工作原理及应用;
2.掌握单片机与8255的接口电路设计和编程。
二、实验设备
  • 仿真器
  • 8255可编程并行I/O扩展接口模块
  • 单片机最小系统模块
4. 发光二极管阵列模块
三、实验要求
  • 连接单片机最小系统、8255扩展接口、发光二极管阵列模块组成的电路,使发光二极管
阵列以一定规律点亮:(1)逐行循环点亮;(2)逐列循环点亮
2连接单片机最小系统、8255扩展接口、数码管动态扫描显示模块、矩阵式键盘模块组成的电路,要求在键盘按下时,8位LED动态显示器上最低位显示相应的字符,以前的各位字符向高位推进1位。请参看实验六的相关内容。
四、实验原理
8255是一个具有3个8位的8位并行口,并且可编程为多种工作模式的接口芯片。由于每个端口上具有输入/输出的缓冲和锁存功能,因此可用于扩展单片机有限的I/O口,作为单片机和外围器件的中间接口电路。
41引脚说明
8255共40个引脚,采用了双列直插的封装,主要引脚功能如下:
  • D7D0:三态双向数据线,与单片机数据总线连接;
  • CS:片选信号,低电平有效;
  • RD:读出信号线,低电平有效;
  • WR:写入信号线,低电平有效;
  • PA7PA0A口输入/输出线;
  • PB7PB0B口输入/输出线;
  • PC7PC0C口输入/输出线;
  • RESET:芯片复位信号线;
  • A1A0:地址线,用来指定8255内部端口。
42内部结构和工作方式
(1)端口A、B、C
端口A为8位数据传送,数据输入或输出时均受到锁存。
端口B为8位数据传送,数据输入时不受锁存,而数据输出时受到锁存。
端口C为8位数据传送,数据输入时不受锁存,而数据输出时受到锁存。
(2)8255接口工作状态选择表7.1
表7.1 8255接口工作状态
A1          A0
RD      WR       CS
工作状态
  0           0
  0           1
  1           0
0       1        0
0       1        0
0       1        0
A口数据→数据总线
B口数据→数据总线
C口数据→数据总线
  0           0
1       0        0
数据总线→A口
  0           1
1       0        0
数据总线→B口
  1           0
1       0        0
数据总线→C口
  1           1
1       0        0
数据总线→控制寄存器
  x           x
x       x        1
数据总线→三态
  1           1
0       1        0
非法状态
  x           x
1       1        0
数据总线→三态

(3)8255的基本工作方式
    8255可编程并行I/O扩展芯片是通过在控制端口中设置控制字来决定它的工作方式的。
    8255有以下三种基本工作方式:




    • 方式0——基本输入/输出方式。
    • 方式1——选通输入/输出方式。
    • 方式2——双向传送方式。(A)
    8255A的端口A可以工作在三种工作方式中的任何一种,端口B只能工作在方式0或方式1,端口C则常常配合端口A和端口B工作,为这两个端口的输入/输出传送提供控制信号和状态信号。
①方式0
方式0是一种基本输入/输出方式。它是把PA0~PA7、PB0~PB7、PC0~PC3、PC4~PC7全部输入/输出线都用作传送数据,各端口是输入还是输出由方式控制字来设置。这种方式多用于同步传送和查询式传送。
8255的方式控制字如图7.1:
②方式1
方式1是一种选通输入/输出方式。它把A口和B口用作数据传送,C口的部分引脚作为固定的专用应答信号,A口和B口可以通过方式控制字来设置方式1。这种方式多用于查询传送和中断传送。
③方式2
方式2是一种双向选通输入/输出方式。它利用A口为双向输入/输出口,C口的PC3~PC7作为专用应答线。方式2只用于端口A,在方式2下,外设可以通过端口A的8位数据线,向CPU发送数据,也可以从CPU接收数据。
当8255接收到写入控制端口的控制字时,首先测试控制字的最高位,如为1,则是方
如图7.1  8255的方式控制字
式选择控制字;如为0,则不是方式选择控制字,而是对端口C置1/置0控制字,这是由于端口C的每一位可作为控制位来使用。端口C置1/置0控制字也是写到控制端口,而不是写到端口C。
43 电路原理示意图
图7.2 采用8255的阵列式发光二极管电路

图7.3为键盘和动态显示参考电路,只耗费了少量器件和单片机I/O口线便完成了控制电路:

图7.3 采用8255的键盘显示实验电路
4.4  软件编写
   按照实验要求,参考图7.2 和7.3,分别编写程序。
五、实验步骤
1、参考图7.2进行电路设计,画出电路图,并用导线正确连接8255可编程I/O扩展模块、单片机最小系统模块、发光二极管阵列。分别编写程序实现(1)逐行循环显示程序,一个时刻只有一盏灯亮;(2)逐列循环显示程序,一个时刻只有一盏灯亮2。也可以一排排显示,或者一列列显示,学生可以自己设计显示方案。连接好仿真器,对编写的程序进行仿真调试。
2、参考图7.3,参考实验六的相关程序,编写矩阵式键盘和显示程序。
六、实验报告
  • 画出接口电路原理图,说明8255的工作原理,简要分析电路的执行过程。
  • 给出针对实验要求编写程序流程图、程序清单并给予适当注释。
  • 实验过程中遇到哪些问题,是如何解决的?
  • 描述实验现象和结果,要求对实验现象和结果进行分析。

完整的Word格式文档51黑下载地址:
单片机原理及应用实验指导书.doc (1.96 MB, 下载次数: 12)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表