首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

8051单片机实训指导书

2020-01-30 来源:化拓教育网
8051单片机实训指导书

目 录

第一章 单片机仿真系统简介 1.1 仿真实验系统的特点与基本组成 1.2 系统的安装和启动 第二章 8051系列单片机实验 2.1 实验一 单片机仿真实验系统基本操作 2.1.1 实验目的与要求 2.1.2 实验内容 1 存储器块清零程序 2 上机操作及调试步骤 3 二进制数转换成二 - 十进制数(BCD码)程序 4 二进制数转换成ASCII码程序 5 数据排序程序 复习思考题 2.2 实验二 8051定点数运算程序设计 2.2.1 实验目的与要求 2.2.2 实验内容 1 二进制定点数加减运算程序 2 二进制定点数乘法运算程序 复习思考题 2.3 实验三 8051单片机P1口应用实验 2.3.1 实验目的与要求 2.3.2 8051并行I/O口简介 2.3.2 实验内容 1 采用P1口作输出 2 采用P1口作输入和输出 3 采用P1口控制继电器 4 采用P1口控制音频电路发声 复习思考题 2.4 实验四 外部中断实验 2.4.1 实验目的与要求 2.4.2 8051单片机中断系统简介 4.4.3 实验内容

1 采用外部中断INT0触发P1.0的输出状态反转 2 采用外部中断模拟交通信号灯控制 复习思考题 2.5 实验五 定时/计数器实验 2.5.1 实验目的与要求 2.5.2 8051单片机定时/计数器简介 4.5.3 实验内容 1 用T0中断方式定时,每秒钟使P1.0输出状态发生一次反转 2 用T0计数外部脉冲,通过P1口显示计数值 复习思考题 2.6 实验六 8255输入输出实验

2.6.1 实验目的与要求 2.6.2 8255可编程芯片简介 4.6.3 实验内容 利用8255方式0,实现PA口作输出,PB口作输入 复习思考题 2.7 实验七 D/A转换实验 2.7.1 实验目的与要求 2.7.2 D/A转换芯片0832简介 2.7.3 实验内容 利用0832产生不同波形输出 复习思考题 2.8 实验八 A/D转换实验 2.8.1 实验目的与要求 2.8.2 ADC0809简介 2.8.3 实验内容 利用0809实现A/D转换并从LED上显示转换结果 复习思考题 2.9 实验九 键盘显示实验 2.9.1 实验目的与要求 2.9.2 数码管显示及键盘扫描工作原理 2.9.3 实验内容 1 数码管动态显示 2 键盘扫描显示 复习思考题 2.10 实验十 电子时钟实验

2.10.1 实验目的与要求 2.10.2 实验内容

1

利用定时器中断实现电子时钟 复习思考题 2.11 实验十一 串行口通讯实验

2.16.1 实验目的与要求 2.16.2 8051单片机串行口简介 2.16.3 实验内容 通过串行口实现双机通信 复习思考题 2.12 实验十二 模拟空调温度控制实验

2.12.1 实验目的与要求 2.12.2 实验原理说明 2.12.3 实验内容 利用电位器和A/D转换器实现模拟空调温度控制 复习思考题

2

第一章 伟福单片机仿真实验系统简介

1.1 仿真实验系统的特点与基本组成

伟福单片机仿真实验系统由板上仿真器、实验仪、伟福仿真软件、开关电源构成。本实验仪提供强大的逻辑分析、波形输出和程序跟踪功能,可以让学生直观地观察到单片机内部及外部电路工作的波形。实验仪上有丰富的实验电路和灵活的组成方法。这些电路既可以和8031系列、也可以和80C196系列CPU及8088/8086CPU组合完成各种实验。本实验仪将高档仿真器所具有的逻辑分析仪、波形发生器和程序跟踪器等强大的分析功能移植到了过来,让学生在做实验时不仅能知道软件的执行过程,也能直观地看到程序运行时,电路上的信号状态,工作时序,非常详细地了解电路的工作情况。仿真实验系统具有三种使用方法:

(1)用PC机上的集成调试软件驱动板上仿真器进行仿真和实验。 (2)无PC机,仅用实验仪的板上仿真器进行仿真和实验。

(3) 无实验仪、无仿真器,仅在PC机上采用软件模拟方式进行仿真。

配MCS51/196仿真板,可进行8051或80C196的实验,配8088/8086仿真板,可以进行8088/8086实验。实验系统自带键盘和显示器,自带系统监控程序。如果没有PC机也同样进行各种学习和实验。配备PC机集成调试软件,在有PC机的情况下,通过板上仿真器实现64K全空间的硬件断点和仿真。

PC机软件具有全集成化仿真环境,中、英文两种界面,软件仿真与硬件仿真两种模式,软件仿真可以在无仿真仪的情况下进行。实验仪可以方便灵活地构成各种实验方案,在有无PC机和实验仪的情况下,都能进行相应的编程实验,从而具有极为广泛的应用范围,板上提供了基本的实验电路,减少繁琐的连接线过程,板上也提供了DIP40/28/24/20/16/14插孔和CPU的地址数据总线引出插孔,供学生自己扩展其它实验,培养实际动手能力,加强对实验电路的理解。

伟福实验系统在硬件上预留了自主开发实验的空间。对基本实验仅需少量连线就可进行,以减轻学生的工作量,同时也提供了一些需较多连线的扩展性实验以进一步锻炼学生的动手能力。此外,它还为学生们提供了强大的软硬件调试手段。

伟福仿真实验系统上各功能模块的排列如图1.1所示。各个模块的引脚都被引出到相应的插孔,扩展插座为40 芯通用插座,可兼容28芯、24芯、16芯和14芯插座。利用这个插座,可对双列直插式的各种微机芯片进行实验。总线扩展为三排插孔,用于引出各种总线信号,包括8根数据总线,16根地址总线,以及ALE,RD,WR等控制总线,另外与CPU相关的一些控制信号和I/O信号例如P1口、RXD、TXD等信号在仿真板上引出。

3

图1.1 伟福仿真试验系统的功能模块排列

图中的圆点表示仿真实验系统上的连线插孔,每个插孔旁边都有相应的文字标识,进行不同实验的时候,需要根据要求用专门的连线将它们连接起来。注意:无论是集成电路的插拔、通讯电缆的连接、跳线器的设置还是实验线路的连接,都应确保在断电情况下进行,否则可能造成对设备的损坏。实验线路连接完成后,应仔细检查无误后再接通电源。

在进行不同实验的时候可能需要采用不同译码地址,地址插孔的地址分配如表1-1所示。

表1-1 地址译码插孔的地址分配表

CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7

08000H~08FFFH 09000H~09FFFH 0A000H~0AFFFH 0B000H~0BFFFH 0C000H~0CFFFH 0D000H~0DFFFH 0E000H~0EFFFH 0F000H~0FFFFH 1.2 系统的安装和启动

1. 在PC机上安装伟福仿真开发系统集成调试软件。

2. 进行8051单片机实验时,应插上POD51仿真板,并插上8051或8052 CPU。 3. 将配套的串行通讯电缆的一端与实验仪上的“仿真器串口” 9芯D形插座相连,

另一端与PC机的串行口相连。

4

4. 将实验台的电源线与220V电源相连。(实验结束后应拔下)

5. 打开实验台电源开关,红色电源指示灯亮。仿真开发器初始化成功后,LED会

显示8051,表示仿真系统正常。

6. 打开PC计算机电源,执行伟福(WAVE)集成调试软件。集成调试环境界面如图

1.2所示。 下拉菜单 快捷工具图标 编辑/调试窗口 项目窗口

图1.2 伟福(WAVE)集成调试环境

7. 通过下拉菜单“仿真器”对仿真实验系统进行设置,如图1.3所示。

选择仿真器:伟福Lab2000P实验系统。 选择仿真头:MCS51实验。 选择CPU:(8031/32)。

5

图1.3 设置仿真实验系统

通过仿真器设置中的“语言”栏可以设置用户所采用的编程语言,如图1.4所示。采用汇编语言编程时,应选中“伟福汇编器”复选框,采用C51高级语言编程时,应选中“Keil C”复选框。

图1.4 设置用户编程语言

通过仿真器设置中的“目标文件”栏可以设置最终生成的用户目标文件,一般可以按图1.5进行设置。

6

图1.5 设置目标文件

通过仿真器设置中的“通信设置”栏可以设置集成调试环境与PC机的通信端口和波特率,如图1.6所示。

图1.6 设置通信方式

7

第二章 8051系列单片机实验

2.1 实验一 单片机仿真实验系统基本操作

2.1.1 实验目的与要求

通过本实验,了解熟悉伟福单片机开发实验系统软、硬件的基本操作,同时学习简单的8051汇编语言程序的编写和调试方法。熟悉伟福单片机开发实验系统软、硬件,掌握伟福集成调试环境的使用方法。

2.1.2 实验内容

1. 存储器块清零程序

指定存储器中某块的起始地址和长度,要求能将其内容清零。程序清单如下: BLOCK EQU 6000H

MOV DPTR, #BLOCK ; 起始地址

MOV R0, #256 ; 清零 256 字节 MOV A, #0 LOOP: MOVX @DPTR, A

DJNZ R0, LOOP ; 记数减一 LJMP $

END

2.上机操作及调试步骤

(1) 启动伟福集成调试软件后,单击快捷工具栏中的“新建文件”图标

(或按

Alt+F+N键),在弹出的编辑窗口中键入上述源程序文件,如图2.1和图2.2所示。

图2.1 创建新文件

8

图2.2 在编辑窗口中键入源程序文件

(2)单击快捷工具栏中的“保存文件”图标(或F2键),在弹出的保存文件窗

口中选定保存源程序的文件夹,并给定源程序文件名(汇编语言源程序文件的扩展名为“.ASM”),单击“保存”按钮,如图2.3和2.4所示。

图2.3 保存源程序文件

图2.4 选定保存文件夹并给定文件名

9

(3) 单击下拉菜单“文件”中的“新建项目”,如图2.5所示,项目窗口如图2.6所示。

图2.5 新建项目 图2.6 项目窗口

新建项目会自动分如下三步: ①加入模块文件。在加入模块文件的对话框中选择刚才保存的文件S1.ASM,按所示。打开键。如果是多模块项目,可以同时选择多个文件再打开,如图2.7所示。

图2.7 加入模块文件窗口

②加入包含文件。在加入包含文件对话框中,选择所要加入的包含文件(可多选)。包含文件通常用于多模块或高级语言编程中,如果没有包含文件,按取消键,如图2.8所示。

10

图2.8 加入包含文件窗口

③保存项目。在保存项目对话框中输入项目名称“S1”, 无须加后缀。软件会自动将后缀设成“.PRJ”。按保存键将项目保存到与源程序相同的文件夹下,如图2.9所示。

图2.9 保存项目窗口

项目保存好后,如果项目是打开的,可以从项目窗口看到该项目中的“模块文件”。对于上例,可以看到项目中已经有了一个模块文件“S1.ASM”,如图2.10所示。

11

图2.10 加入模块文件后的项目窗口

(4) 单击快捷工具栏中的“编译”图标

(或F9键),对刚才保存的项目进行编译

和连接,如图2.11所示。在编译之前,软件会自动将项目中的源程序文件存盘。如果发生编译连接错误,则在“信息窗口”中报告如图2.12所示编译连接出错信息。此时可将鼠标指向“信息窗口”中的错误行并双击鼠标左键,光标将自动跳转到编辑窗口中源程序的相应出错位置,便于用户修改。修改源程序文件并保存之后,重新进行第(3)步。如果编译连接通过,将在“信息窗口”中报告如图2.13所示编译连接正确信息。此时就可以对源程序进行调试了。

图2.11 对已保存的项目进行编译连接

12

图2.12 编译连接出错信息

图2.13 编译连接正确信息

(5) 单击快捷工具栏中的“跟踪” 图标

或按F7键启动单步跟踪调试程序,如图

2.14所示。单步跟踪就是一条指令一条指令地执行,若有子程序调用,也会跟踪到子程序中去。这种方式可以观察程序每一条指令的执行的结果,光标“=>”所指的就是下次将要执行的程序指令。源程序窗口最左边的“o”代表此行为有效程序,此行在编译过程中产生了可以指行的机器指令。

图2.14 启动单步调试程序

13

跟踪调试执行速度较慢,也可以采用单步调试(快捷图标为

),此时若有子程序

调用,不会跟踪到子程序中去,而是将子程序一次执行完成。还可以单击快捷图标启动程序全速运行,单击快捷图标

停止程序运行,单击快捷图标

将复位CPU。调

试时除了上述快捷图标之外,还可以采用“执行到光标处”的功能,先将鼠标指向程序想要暂停的地方,例如程序中最后一条指令“LJMP $”,单击鼠标右键,弹出一个右键菜单,选择右键菜单中的“执行到光标处”,程序将全速执行到指定行暂停,如图2.15所示。

右键菜单中还有其他一些功能,用户可以自己通过实践和阅读伟福仿真器的说明书来逐步掌握。下面介绍一下设置断点功能。

将鼠标移到源程序窗口的左边灰色区,光标变成“手指圈”,单击左键设置断点,也可以用右键菜单的“设置/取消断点”功能或用Ctrl+F8组合键设置断点。如果断点有效图标为“红圆绿勾”,无效断点的图标为“红圆黄叉”。

图1.15 部分右键菜单

断点设置好后,就可以用全速执行的功能,当程序执行到断点时,会暂停下来,这你可以观察程序中各变量的值,及各端口的状态,判断程序是否正确。

在程序调试过程中单击CPU快捷图标

,可以观察CPU的运行状态,此时源程序窗

口将出现反汇编(Disassembly)结果,以及工作寄存器和CPU寄存器窗口,如图2.16所示。可以通过这些窗口观察程序运行时CPU内部寄存器的变化情况。请读者在对上述程序进行调试的过程中,学会观察这些窗口中不同寄存器内容的状态,从而判断程序运行是否正常。

14

CPU快捷图标 反汇编窗口 工作寄存器窗口 CPU寄存器窗口

图2.16 CPU运行状态观察窗口

伟福集成调试软件中还提供了一个DATA快捷图标,单击该图标右边的小箭

头,出现如图2.17所存储器空间选择菜单。通过该菜单可以分别观察8051单片机内部数据存储器空间(DATA)、程序存储器空间(CODE)、外部数据存储器空间(XDATA)、外部数据存储器分页空间(PDATA)以及位寻址空间(BIT)。图2.18所示为本实验程序运行后的XDATA空间数据变化的情况。

图2.17 数据空间菜单 图2.18 外部数据存储器XDATA空间窗口

至此,已经介绍了如何应用伟福集成软件开发环境调试8051单片机汇编语言程序的基本方法,读者可以通过实际应用来加深理解,例如若要将从6000H开始的256个字

15

节外部数据存储器块的内容置成11H值,请修改以上程序完成此操作,注意在程序调试过程中数据的变化情况。

3. 二进制数转换成二 - 十进制数(BCD码)程序

将累加器A中一个给定的二进制数,转换成三个二 - 十进制数(BCD码), 并存入 Result 开始的三个单元。源程序清单如下。

RESULT EQU 20H

ORG 0 ;复位入口 LJMP START

BINTOBCD: ;数值转换子程序 MOV B, #100 DIV AB MOV A, B MOV B, #10 DIV AB

MOV RESULT+1, A ; 余数除以 10, 得十位数 MOV RESULT+2, B ; 余数为个位数 RET

START: ;主程序 MOV SP, #40H MOV A, #123 LCALL BINTOBCD SJMP $ END

通过本实验学习简单的数值转换算法,了解数值的各种表达方法。同时进一步熟悉伟福单片机实验系统以及集成开发软件环境的使用方法。按照前面介绍的仿真调试方法,启动伟福集成开发环境,用“执行到光标处”功能,启动程序运行到最后一条指令处,然后单击图2.17存储器空间菜单中的“DATA”选项,打开8051内部数据存储器空间,如图2.19所示,可以看到已经将A中原来的内容“123H” 拆为了三个 BCD 码“1”、“2”和“3”,并分别存入了从“Result”(20H)开始的三个单元中。

16

图2.19 内部数据存储器DATA空间窗口

4. 二进制数转换成ASCII码程序

此实验主要让学生了解数值的二进制表示和ASCII码表示之间的区别,利用查表功能快速地进行数值转换。

; 将累加器A 中的内容拆为二个 ASCII 码, 并存入Result开始的二个单元。源程序清单如下。

RESULT EQU 20H

ORG 0 ;复位入口 LJMP START ASCIITAB:

DB '0123456789ABCDEF' ; 定义数字对应的ASCII表 BINTOHEX: ;数值转换子程序 MOV DPTR, #ASCIITAB

MOV B, A ; 暂存 A SWAP A

ANL A, #0FH ; 取高四位 MOV RESULT, A

MOV A, B ; 恢复 A ANL A, #0FH ; 取低四位 MOVC A, @A+DPTR ; 查ASCII表 MOV RESULT+1, A RET

START: ;主程序 MOV SP, #40H

MOV A, #01000011B

17

LCALL BINTOHEX SJMP $ END

按照前面介绍的调试方法,启动伟福集成开发环境,用“执行到光标处”功能,启动程序运行到最后一条指令处,然后单击图2.17存储器空间菜单中的“DATA”选项,打开8051内部数据存储器空间,如图2.20所示,可以看到已经将A中原来的二进制数“01000011” 拆为了2个ASCII 码“34”和“33”,并分别存入了从“Result”(20H)开始的2个单元中。

图2.20 从DATA窗口观察程序运行结果

5. 数据排序程序 给出一组随机数,将此组数据排序,使之成为有序数列。有序的数列更有利于查找。本程序用的是“冒泡排序” 算法,将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。通过本实验可以了解数据有序和无序的概念以及数据排序的简单算法。源程序清单如下。

SIZE EQU 8 ; 数据个数 ARRAY EQU 50H ; 数据起始地址 CHANGE EQU 0 ; 交换标志 SORT: MOV R6, #ARRAY CLR CHANGE GOON: MOV A, @R0 MOV R2, A INC R0 MOV B, @R0

18

CJNE A, B, NOTEQUAL SJMP NEXT NOTEQUAL:

JC NEXT ; 前小后大, 不交换 SETB CHANGE ; 前大后小, 置交换标志 XCH A, @R0 ; 交换 DEC R0 XCH A, @R0 INC R0

NEXT: DJNZ R7, GOON JB CHANGE, SORT LJMP $ END

启动伟福集成开发环境,单击图2.17存储器空间菜单中的“DATA”选项,打开8051内部数据存储器空间,将鼠标指向其中从50H开始的单元,单击右键,将其中内容修改为一组无序的数据,如图2.21所示,再用“执行到光标处”功能,启动程序运行到最后一条指令处,可以看到此时数据已经按从小到大的顺序排列了,如图2.22所示。

图2.21 未排序的数据 图2.22 已排序的数据

复习思考题

1.回忆并写出实验上机操作过程。 2.画出详细的实验程序框图。

19

2.2 实验二 8051定点数运算程序设计

2.2.1 实验目的与要求

通过本实验,学习编写8051单片机定点数运算汇编语言程序,同时进一步熟悉用伟福单片机开发实验系统进行软件调试的方法。熟练掌握伟福集成调试环境的使用方法,编写并调试通过8051单片机定点数加减运算程序、乘法运算程序以及除法运算程序,对于子程序调用要学会使用入口和出口参数,同时要学会通过CPU窗口和工作寄存器窗口观察程序运行过程以及最后结果。

2.2.2 实验内容

1 二进制定点数加减运算程序。

(R2R3)和(R6R7)中的内容为两个用原码表示的二进制数,最高位为符号位,将(R2R3)±(R6R7)的结果送R4R5。程序中DADD为原码加法子程序入口,DSUB为原码减法子程序入口,出口时CY=1发生溢出,CY=0为正常。程序清单如下。

START: ;主程序

MOV R2,#7FH ;准备入口参数,(R2R3)=32767 MOV R3,#0FFH

MOV R6,#7FH ;(R6R7)=32767±32767 MOV R7,#0FFH

LCALL DSUB ;执行减法 LCALL DADD ;执行加法 SJMP $

DSUB: MOV A, R6 ;减法入口 CPL ACC.7 ;取反符号位 MOV R6, A

DADD: MOV A, R2 ;加法入口 MOV C, ACC.7

MOV F0, C ;保存被加数符号位 XRL A, R6

MOV C, ACC.7 ;C=1,两数异号; C=0,两数同号 MOV A, R2

CLR ACC.7 ;清0被加数符号 MOV R2, A MOV A, R6

CLR ACC.7 ;清0加数符号 MOV R6, A JC DAB2

ACALL NADD ;同号执行加法

20

MOV A, R4

JB ACC.7, DABE

DAB1: MOV C, F0 ;恢复结果的符号 MOV ACC.7, C MOV R4, A RET DABE: SETB C

RET ;溢 出

DAB2: ACALL NSUB1 ;异号、执行减法 MOV A, R4

JNB ACC.7, DAB1

ACALL CMPT ;不够减,取补 CPL F0 ;符号位取反 SJMP DAB1 CMPT: MOV A,R5 CPL A ADD A,#1 MOV R5,A MOV A,R4 CPL A ADDC A,#0 MOV R4,A RET

NADD: ;无符号双字节加法子程序MOV A,R3 ADD A,R7 MOV R5,A MOV A,R2 ADDC A,R6 MOV R4,A RET

NSUB1: ;无符号双字节减法子程序MOV A,R3 CLR C SUBB A,R7 MOV R5,A MOV A,R2 SUBB A,R6

21

MOV R4,A RET

END

2 二进制定点数乘法运算程序

将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7,程序清单如下。 START: ;主程序

MOV R2,#7FH ;准备入口参数,(R2R3)=32767 MOV R3,#0FFH MOV R6,#7FH ;(R6R7)=32767*32767 MOV R7,#0FFH

LCALL NMUL ;执行乘法 SJMP $

NMUL: ;双字节无符号数乘法子程序

MOV R4,#0 MOV R5,#0

MOV R0,#16 ;16位二进制数 CLR C

NMLP:MOV A,R4 ;右移一位

RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6 RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A

JNC NMLN ;C为移出的乘数最低位, 若为0不执行加法 MOV A,R5 ;C不为0执行加法 ADD A,R3 MOV R5,A MOV A,R4 ADDC A,R2 MOV R4,A

NMLN:DJNZ R0,NMLP ;循环16次

22

MOV A,R4 ;最后再右移一位 RRC A MOV R4,A MOV A,R5 RRC A MOV R5,A MOV A,R6 RRC A MOV R6,A MOV A,R7 RRC A MOV R7,A RET END

复习思考题

1.写出实验上机操作过程中如何观察指令的执行状态,如何观察程序的运行结果。 2.画出详细的实验程序框图。

3.自己编写一段定点数除法运算程序并通过实验验证其正确性。

23

2.3 实验三 8051单片机P1口应用实验

2.3.1 实验目的与要求

学习8051单片机P1口作为双向I/O口的使用方法,采用循环指令编写延时子程序。了解用弱电控制强电的基本原理,采用单片机P1口实现继电器开关控制。要求:

① 采用8051单片机的P1口做输出口,接4只发光二极管,编写程序,使发光二极管循环点亮。

② 采用P1.0,P1.1作输入口接两个拨动开关,P1.2,P1.3作输出口,接两个发光二极管,编写程序读取开关状态,并将此状态在发光二极管上显示出来。

③ 采用P1口输出电平控制继电器的吸合和断开,从而实现对外部装置的开关量控制。

④ 采用P1口控制音频电路发声。

2.3.2 8051并行I/O口简介

8051单片机有四个并行I/O口,称为P0、P1、P2、P3,每个口都有8根引脚,它们都是双向通道,每一条I/O引脚都能独立地用作输入或输出,作输出时数据可以锁存,作输入时数据可以缓冲。P0~P3这四个I/O口的功能不完全相同,它们的负载能力也不相同,P1、P2、P3都能驱动四个LS TTL门电路,并且不需外加电阻就能直接驱动MOS电路。P0口在驱动TTL电路时能带动8个LS型TTL门,但驱动MOS电路时若作为地址/数据总线,可直接驱动;而作为I/O口时,则需外接上拉电阻才能驱动MOS电路。图2.23所示为P0~P3各口中一位的逻辑图。

P0为三态双向口,它可作为输入输出端口使用,也可作为系统扩展时的低8位地址/8位数据总线使用。P0口作为双向I/O端口使用时,通常要在外部加一个上拉电阻来提高驱动能力。P0口作为低8位地址/8位数据总线使用时,在ALE信号的控制下分时输出低8位地址和8位数据信号。

P1口为准双向口,每一位都可以分别定义为输入或输出使用。P1口作为输入口使用时,有两种工作方式,即所谓“读端口”和“读引脚”。读端口时实际上并不从外部读入数据,而只把端口锁存器中的内容读入到内部总线,经过某种运算和变换后,再写回到端口锁存器。读引脚时才真正地把外部的输入信号读入到内部总线。逻辑图中各有两个输入缓冲器,CPU根据不同的指令分别发出“读端口”或“读引脚”信号。在读引脚时,为了保证输入正确的外部输入电平信号,首先要向端口锁存器写入一个“1”,使驱动场效应管截止,引脚信号直接加到三态缓冲器,实现正确的读入。否则,端口锁存器中原来状态有可能为“0”,加到输出驱动场效应管栅极的信号为“1”,该场效应管导通,对地呈现低阻抗。这时即使引脚上输入的是“1”信号,也会因端口的低阻抗而使信号变化,使得外加的“1”信号读入时不一定是“1”。正是由于P1口在进行输入操作之前需要有这样一个附加准备动作,故称之为“准双向口”。P1作为输出口时,如果要输出“1”,只要将“1”写入P1口锁存器,使输出驱动场效应管截止,输出引脚由内部上拉电阻拉成高电平,输出为“1”。要输出“0”时,将“0”写入P1口锁存器,使输出

24

驱动场效应管导通,输出引脚被接到地,输出为“0”。

图2.23 8051单片机并行I/O口一位的逻辑图

表2-1 P3口的第二功能定义 端口引脚 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD(串行输入口) TXD(串行输出口) INT0(外部中断0输入 INT1(外部中断1入) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部RAM写选通) RD(外部RAM读选通) P2口也是一个准双向口,它有两种使用功能:作为普通I/O端口或作为系统扩展时的高8位地址总线。P2口作I/O端口使用时,其用法与P1口相同。P2口作外部地址总

25

线使用时,输出高8位地址总线。需要特别指出的是,只要进行了外部系统扩展,由于对片外地址的操作是连续不断的,此时P0口和P2口就不能再用作I/O端口了。

P3口为多功能口,除了用作通用I/O口之外,它的每一位都有各自的第二功能,如表2-1所示。P3口作通用I/O口时其使用方法与P1口相同,P3口的第二功能可以单独使用,即不用第二功能的引脚仍可以作通用I/O口线使用。

2.3.3 实验内容

1 采用P1口作输出

P1口是准双向口,它作为输出口使用时具有锁存功能。实验所需要LED电平显示电路如图2.24所示。

图2.24 电平显示电路

在实验系统上如表2-2所示连线。执行如下程序,发光二极管LED将循环显示。

表2-2 连线说明 连线 1 2 3 4 连接孔1 P1.0 P1.1 P1.2 P1.3 连接孔2 L0 L1 L2 L3

实验程序清单如下。 LOOP:

MOV A, #01H MOV R2, #8 MOV P1, A RL A

CALL DELAY

DJNZ R2, OUTPUT LJMP LOOP

26

DELAY: ;延时子程序

MOV R6, #0 MOV R7, #0 DELAYLOOP:

DJNZ R6, DELAYLOOP DJNZ R7, DELAYLOOP RET END

关于延时子程序的时间计算,查指令表可知MOV和DJNZ指令均需用两个机器周期,在6MHz晶振时,一个机器周期时间长度为12/6MHZ,所以上面延时子程序该的执行时间为:

(256×255+2)×2×12÷6 ≈ 261ms

2 采用P1口作输入和输出

由P1口的准双向口结构可知,当作为输入口时,必须先对它置“1”。若不先对它置“1”,读入的数据是不正确的。实验所需要LED电平显示电路和逻辑电平开关电路如图2.24和图2.25所示。

图2.25 逻辑电平开关电路

在实验系统上如表2-3所示连线。执行如下程序,发光二极管LED将随拨动开关的位置而点亮或熄灭。

表2-3 连线说明

连线 1 2 3 4 连接孔1 P1.0 P1.1 P1.2 P1.3 连接孔2 S0 S1 L4 L5

27

实验程序清单如下。 KeyLeft equ P1.0 KeyRight equ P1.1 LedLeft equ P1.2 LedRight equ P1.3

SETB KeyLeft SETB KeyRight MOV C,KeyLeft MOV LedLeft,C MOV C,KeyRight MOV LedRight,C LJMP Loop END

3 采用P1口控制继电器

自动化控制设备中,都存在一个电子电路与电气电路的互相连接问题,一方面要使电子电路的控制信号能够控制电气电路的执行元件(电动机,电磁铁,电灯等),另一方面又要为电子线路和电气电路提供良好的电隔离,以保护电子电路和人身的安全。继电器便能完成这一桥梁作用。本实验采用的继电器其控制电压是5V,实验电路如图2.26所示。

图2.26 继电器控制电路

当控制端P1.0为高电平时,继电器工作常开触点吸合,连接该触点的LED被点亮。当P1.0控制端为低电平时,继电器不工作,常开触点断开,连接该触点的LED熄灭。

28

在实验系统上如表2-4所示连线。采用单步方式执行如下实验程序,可以看到当执行P1.0被置1时,LED点亮,执行到P1.0被置0时,LED熄灭。如果全速运行程序,则对应的LED将随继电器的通、断而亮灭。

表2-4 连线说明

连线 1 2 3 连接孔1 P1.0 5V L0 连接孔2 继电器输入 继电器常闭输入 继电器中间输入

实验程序清单如下。 LOOP: CLR P1.0

CALL DELAY SETB P1.0 CALL DELAY

DELAY: MOV R6, #0

MOV R7, #0

DLOOP:DJNZ R7, DLOOP

DJNZ R6, DLOOP RET END

4 采用P1口控制音频电路发声

从P1.0输出不同频率的方波信号,经放大滤波后驱动扬声器发声。声音的频率由延时程序控制。实验电路如图2.27所示。

图2.27 音频输出电路

29

在实验系统上如表2-5所示连线,执行如下程序后,扬声器将发出一定频率的声音。

表2-5 连线说明

连线 1 连接孔1 P1.0 连接孔2 扬声器脉冲输入

实验程序清单如下。 LOOP:CLR P1.0

CALL DELAY SETB P1.0 CALL DELAY LJMP LOOP DELAY:MOV R0, #50

DJNZ R0, $ RET END

复习思考题

1. 复习8051单片机并行I/O端口特性,P0~P3口各有什么特点? 2. 为什么说P1口是“准双向口”?在实验中用P1口输入时如果不先向P1口写入

“1”而直接读取引脚,会出现什么现象?

3. 如果希望让扬声器发出不同频率,不同长短的声音,应如何修改实验程序?

30

2.4 实验四 外部中断实验

2.4.1 实验目的与要求

通过本实验加深对8051单片机中断系统的理解,学习外部中断的基本使用方法及相关编程。要求:

① 用单次脉冲申请中断,在中断处理程序中使P1.0的输出状态发生反转,并通过发光二极管观察P1.0的电平。

② 模拟交通信号灯控制。

2.4.2 8051单片机中断系统简介

8051单片机有5个中断源,有两个中断优先级,高优先级的中断源可以中断低优先级的服务程序,反之不行。当两个同样级别的中断申请同时到来时,则按一个固定的查寻次序来处理中断响应。8051单片机的5个中断源及其优先级次序如表2-6所示。

表2-6 8051单片机的中断源

中断源 外部中断0 定时/计数器0 外部中断1 定时/计数器T1 串行口 入口地址 优先级顺序 0003H 000BH 0013H 001BH 0023H 最高 最低 说 明 来自P3.2引脚(INT0)的外部中断请求 定时/计数器T0溢出中断请求 来自P3.3引脚(INT1)的外部中断请求 定时/计数器T1溢出中断请求 串行口完成一帧数据的发送或接收中断 8051单片机没有专门的开中断和关中断指令,中断的开放和关闭是由特殊功能寄存器IE来实现两级控制的。所谓两级控制是指在寄存器IE中有一个总允许位EA,当EA=0时, 就关闭了所有的中断申请,CPU不响应任何中断申请。而当EA=1时,对各中断源的申请是否开放,还要看各中断源的中断允许位的状态。

中断允许寄存器IE的地址为A8H,其中各位都可以位寻址,位地址为A8H~AFH。总允许位EA和各中断源允许位在IE寄存器中的分布如下:

D7 D6 D5 D4 D3 D2 D1 D0

EA ES ET1 EX1 ET0 EX0 其中各控制位的含义如下:

EA:中断总允许位。EA=0时,CPU关闭所有的中断申请,只有EA=1时,才能允许各个中断源的中断申请,但还要取决于各中断源中断允许控制位的状态。

ES:串行口中断允许位。ES=1,串行口开中断,ES=0,串行口关中断。

ET1:定时/计数器T1的溢出中断允许位。ET1=1允许T1溢出中断,ET1=0则不允许T1溢出中断。

EX1:外部中断1(INT1)的中断允许位。ET1=1允许外部中断1申请中断,EX1=0则不允许中断。

ET0:定时/计数器T0的溢出中断允许位。ET0=1允许中断,ET0=0不允许中断。

31

EX0:外部中断0(INT0)的中断允许位。EX0=1允许中断,EX0=0不允许中断。

8051单片机在复位时,IE各位的状态都为“0”,所以CPU是处于关中断的状态 。对于串行口来说,其中断请求在被响应之后,CPU不能自动清除中断标志,在这些情况下要注意用指令来实现中断的开放或关闭,以便进行各种中断处理。

8C51单片机的中断优先级控制比较简单,每个中断源的优先级别由特殊功能寄存器IP来管理。

IP寄存器的地址为B8H,格式如下:

D7 D6 D5 D4 D3 D2 D1 D0 PS PT1 PX1 PT0 PX0 其中各位的含义如下:

PS:串行口中断优先级控制位。

PT1:定时器/计数器T1中断优级控制位。 PX1:外部中断INT1中断优先级控制位。 PT0:定时器/计数器T0中断优先级控制位。 PX0:外部中断INT0中断优先级控制位。

IP寄存器中若某一个控制位置“1”,则相应的中断源就规定为高优先级中断,反之,若某一个控制位置“0”,则相应的中断源就规定为低优先级中断。IP寄存器的地址为B8H,其中各控制位也是可以位寻址的,位地址为B8H-BCH。

外部中断触发方式通过特殊功能寄存器TCON(地址为88H)控制,TCON中各控制位分布如下:

D7 D6 D5 D4 D3 D2 D1 D0 TF1 TF0 IE1 IT1 IE0 IT0 其中各控制位的含义如下:

IT0:选择外中断INT0的中断触发方式。IT0=0为电平触发方式,低电平有效。IT0=1为负边沿触发方式,INT0脚上的负跳变有效。IT0的状态可以用指令来置“1”或清“0”。

IE0:外中断INT0的中断申请标志。当检测到INT0上存在有效中断申请时,由硬件使IE0置位。当CPU转向中断服务程序时,由硬件清“0”IE0中断申请标志。

IT1:选择外中断INT1的触发方式(功能与TI0类似)。 IE1:外部中断INT1的中断申请标志(功能与IE0 类似)。

TF0:定时/计数器T0溢出中断申请标志。当T0溢出时,由内部硬件将TF0置“1”,当CPU转向中断服务程序时,由硬件将TF0清“0”,从而清除T0的中断申请标志。

TF1:定时器1溢出中断申请标志(功能与TF0相同)。

可见定时/计数器溢出中断和外部中断的申请标志,在CPU响应中断之后能够自动撤除。

8051单片机在接收到中断源发来的中断申请以后,先把这些申请锁定在各自的中断标志位中,然后在下一个机器周期按表2-5规定的内部优先顺序和中断优先级分别来查询这些标志,并在一个机器周期之内完成检测和优先排队。响应中断的条件有三个:

(1)必须没有同级或更高级别的中断正在得到响应,如果有的话,则必须等CPU为

32

它们服务完毕,返回主程序并执行一条指令之后才能响应新的中断申请。

(2)必须要等当前正在执行的指令执行完毕以后,CPU才能响应新的中断申请。 (3)若正在执行的指令是RETI(中断返回)或是任何访问IE寄存器或IP寄存器的指令,则必须要在执行完该指令以及紧随其后的另外一条指令之后才可以响应新的中断申请。

CPU响应中断后将自动跳转到中断源的入口地址开始执行程序,每个中断源都有其固定的入口地址,它们的处理过程也有所区别。一般情况下,中断处理包括两个部分:一是保护现场,二是为中断服务。

所谓保护现场就是将需要在中断服程序中使用而又不希望破坏其中原来内容的工作寄存器压入堆栈中保护起来,等中断服务完成后再从堆栈中弹出以恢复原来的内容。通常需要保护的寄存器有PSW、A以及其他工作寄存器。

在编写中断服务程序时,要注意以下几点:

(1)各中断源的入口地址之间仅相隔8个单元,如果中断服务程序的长度超过8个地址单元时,应在中断入口地址处安排一条转移指令,转到其他有足够空余存储器单元的地址空间。

(2)若在执行当前中断服务程序时需要禁止更高级中断源,则要用软件指令关闭中断,在中断返回之前再开放中断。

(3)在保护和恢复现场时,为了不使现场信息受到破坏或造成混乱,保护现场之前应关中断,若需要允许高级中断,则应在保护现场之后再开中断。同样在恢复现场之前也应先关中断,恢复现场之后再开中断。

(4)及时清除那些不能被硬件自动清“0”的中断请求标志,以免产生错误的中断。

4.4.3 实验内容

1 采用外部中断INT0触发P1.0的输出状态反转

在实验系统上如图2.28和表2-7所示连线。P1.0接LED灯, INTO(P3.2)端接单脉冲发生器。执行如下程序,每按一次单脉冲按钮,注意观察LED的状态。本例中断服务程序长度仅7个字节,可以直接从入口地址开始编写,如果中断服务程序较长,则应在中断入口放一条长转移指令,跳转到真正的服务程序地址。

表2-7 连线 1 连接孔1 P1.0 单脉冲输出 连接孔2 L0 INT0 2 图2.28

33

实验程序清单如下。

ORG 0000H ;复位入口 LJMP START

ORG 0003H ;外部中断INT0入口 INT0: ;INT0中断服务程序

PUSH PSW ;保护现场 CPL P1.0 ;取反P1.0 POP PSW ;恢复现场 START:

CLR P1.0

MOV TCON, #01H ;外部中断INT0, 下降沿触发 MOV IE, #81H ;开中断 LJMP $ END

2 采用外部中断模拟交通信号灯控制

本实验模拟交通信号灯控制,一般情况下正常显示,有急救车到达时,两个方向交通信号灯全红,以便让急救车通过。设急救车通过路口时间为10秒,急救车通过后,交通恢复正常,采用单脉冲申请外部中断,表示有急救车通过。在实验系统上如表2-8所示连线,P1.0~P1.5接LED灯, INTO(P3.2)端接单脉冲发生器。执行如下程序,每按一次单脉冲按钮,注意观察LED的状态。

表2-8 连线 1 2 3 4 5 6 7 连接孔1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 单脉冲输出 连接孔2 L0 L1 L2 L3 L4 L5 INT0(51)

34

实验程序清单如下。

FLASH EQU 0 ;LED状态 STOP EQU 1

SR EQU P1.0 ;南北红灯 SY EQU P1.1 ;南北黄灯 SG EQU P1.2 ; ER EQU P1.3 ; EY EQU P1.4 ;EG EQU P1.5 ;

ORG 0000H ; LJMP START

ORG 0003H ; SETB STOP ; RETI

START: MOV SP, #70

MOV IE, #81H ; SETB SR ; CLR SY CLR SG SETB ER CLR EY CLR EG CLR STOP

LOOP: JB STOP, ALLRED

SETB SR ; CLR SY CLR SG CLR ER CLR EY SETB EG MOV A, #20 CALL DELAY

JB STOP, ALLRED

SETB SR ; CLR SY CLR SG

南北绿灯 东西红灯 东西黄灯

东西绿灯 复位入口 外部中断INT0入口 南北, 东西均红灯 开中断

南北, 东西均红灯 南北红灯, 东西绿灯 南北红灯, 东西黄灯闪35

CLR ER CLR EY CLR EG CLR FLASH MOV R7, #9 LOOP1: MOV C, FLASH MOV EY, C MOV A, #1 CALL DELAY CPL FLASH DJNZ R7, LOOP1 JB STOP, ALLRED

CLR SR ; CLR SY SETB SG SETB ER CLR EY CLR EG MOV A, #20 CALL DELAY

CLR SR ; CLR SY CLR SG SETB ER CLR EY CLR EG CLR FLASH MOV R7, #9 LOOP2: MOV C, FLASH MOV SY, C MOV A, #1 CALL DELAY CPL FLASH DJNZ R7, LOOP2 LJMP LOOP ALLRED:SETB SR CLR SY CLR SG

36

南北绿灯, 东西红灯 东西红灯, 南北黄灯闪 SETB ER CLR EY CLR EG CLR STOP MOV A, #10 CALL DELAY

DELAY: MOV R1, #80H ; 延时子程序 MOV R0, #0 DELAYLOOP:

JB STOP, EXITDELAY DJNZ R0, DELAYLOOP DJNZ R1, DELAYLOOP DJNZ ACC, DELAY EXITDELAY: RET END

复习思考题

1 若在实验中采用INT1,应如何修改实验程序?

2 为什么在中断服务程序中需要保护现场?通过实验后有何发现 3 8051单片机在响应中断之后是否能够自动取消所有中断请求标志?对于低电平触发的外部中断应如何处理?

37

2.5 实验五 定时/计数器实验

2.5.1 实验目的与要求

通过本实验学习8031内部定时器的使用和编程方法,进一步掌握中断处理程序的编程方法。要求

① 8051内部定时器T0用中断方式计时,实现每一秒钟使P1.0的输出状态发生一次反转,从而形成方波输出。

② 8051内部定时计数器T0,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数,并将计数值按二进制数通过P1口驱动LED灯显示出来。

2.5.2 8051单片机定时/计数器简介

8051单片机内部有两个16位可编程定时/计数器,记为T0和T1。它们的工作方式可以通过指令对相应特殊功能寄存器编程来设定,或作定时器用,或作外部事件计数器用。

定时/计数器在硬件上由双字节加法计数器TH和TL组成,作定时器使用时,计数脉冲由单片机内部振荡器提供,计数频率为fosc/12,每个机器周期加1。作计数器使用时,计数脉冲由P3口的P3.4(或P3.5)即T0(或T1)引脚输入,外部脉冲的下降沿触发计数,计数器在每个机器周期的S5P2期间采样外部脉冲,若一个周期的采样值为1,下一个周期的采样值为0,则计数器加1,故识别一个从0到1的跳变需要2个机器周期,所以对外部计数脉冲的最高计数频率为fosc/24,同时还要求外部脉冲的高低电平保持时间均要大于一个机器周期。

定时/计数器的工作方式由特殊功能寄存器TMOD编程决定,定时/计数器的启动运行由特殊功能寄存器TCON编程控制。不论用作定时器还是用作计数器,每当产生溢出时,都会向CPU发出中断申请。

方式控制寄存器TMOD的地址为89H,控制字格式如下:

D7 D6 D5 D4 D3 D2 D1 D0

GATE C/T M1 M0 GATE C/T M1 M0 低4位为T0的控制字,高4位为T1的控制字,其中各位的具体含义介绍如下。

GATE为门控位。它对定时/计数器的启动起辅助控制作用。GATE=1时,定时/计数器的计数受外部引脚P3.2(INT0)或P3.3(INT1)输入电平的控制,此时只有当P3口的P3.2(或P3.3)引脚即INT0 (或INT1)上的电平为1才能启动计数;GATE=0时,定时器/计数器的运行不受外部引脚输入电平的控制。

C/T为方式选择位。C/T = 0为定时器方式,采用单片机内部振荡脉冲的12分频信号作为计数脉冲,若采用12MHz的晶振,则计数频率为1MHz,从计数值便可计算出定时时间。C/T=1为计数器方式,采用外部引脚(T0为P3.4,T1为P3.5)的输入脉冲作为计数脉冲,当T0(或T1)上的输入信号发生从高到低的负跳变时,计数器加1。最高计数频率为单片机晶振频率的1/24。

M1、M0二位的状态确定定时/计数器的工作方式,详见表2-9。

38

表2-9 定时/计数器的方式选择

M1 0 0 1 1 M0 0 1 0 1 工作方式 方式0,为13位定时/计数器。 方式1,为16位定时/计数器。 方式2,为自动重装常数的8位定时/计数器。 方式3,仅适用于T0,分成2个8位定时/计数器。 定时/计数器控制寄存器TCON的地址为88H,格式如下:

D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TF1为定时/计数器T1的溢出标志位。当T1被允许计数以后,T1从初值开始加1计数,计数器的最高位产生溢出时置“1”TF1,并向CPU申请中断,当CPU响应中断时,由硬件清“0”TF1。TF1也可由软件查询清“0”。

TR1为定时/计数器的运行控制位,由软件置位和复位。当方式控制寄存器TMOD中的GATE位为0,且TR1为1时允许T1计数,TR1为0时禁止T1计数。当GATE为1时,仅当TR1为1且INT1 (P3.2)输入为高电平时才允许T1计数,当TR1为0或INT1输入为低电平时都禁止T1计数。

TR0为定时器T0的运行控制位,其功能与TR1类似。 TF0为定时器T0的溢出标志位,其功能与TF1类似。

8051单片机的定时/计数器在进行定时或计数之前要进行初始化编程,通常包括如下几个步骤:

(1) 确定工作方式,即给方式控制寄存器TMOD写入控制字。 (2) 计算定时器/计数器初值,并将初值写入寄存器TL和TH。

(3) 根据需要对中断控制寄存器IE置初值,决定是否开放定时器中断。 (4) 使TCON中的TR0或TR1置“1”,启动定时器/计数器。

在初始化过程中,要设置定时或计数的初始值,则计算初值X的公式如下: 计数方式: X = M-要求的计数值

13168

式中M取决于不同工作方式,可以是2、2或2)。

定时方式: X = (M-(要求的定时值/t))

式中t=12/fosc,称为定时周期。

39

4.5.3 实验内容

1 用T0中断方式定时,每秒钟使P1.0输出状态发生一次反转

将T0作定时器定时1秒,由于实验系统fosc=6MHz,定时周期t=2us。为了实现定时1秒,通过中断服务程序进行定时扩展,即设置T0定时100us产生一次中断,同时设置一个软件计数器来计数中断次数,当达到中断1000次时即完成了定时1秒钟。

在实验系统上如表2-10所示连线。P1.0接LED灯,执行如下程序,注意观察LED的状态的变化。

表2-10

连线 连接孔1 连接孔2

1 P1.0 L0

实验程序清单如下。

TICK EQU 10000 ; 10000 X 100US = 1S T100US EQU 256-50 ; 100US时间常数(6M) C100US EQU 30H ; 100US计数单元 LEDBUF EQU 0 LED EQU P1.0 ORG 0000H LJMP START ORG 000BH LJMP T0INT ORG 0030H

START: MOV TMOD, #02H ; 设置T0为工作方式2, 定时器 MOV TH0, #T100US MOV TL0, #T100US

MOV IE, #10000010B ; EA=1, IT0 = 1 CLR LEDBUF CLR LED

MOV C100US, #HIGH(TICK) MOV C100US+1, #LOW(TICK) LOOP: MOV C, LEDBUF MOV LED, C LJMP LOOP

T0INT: PUSH PSW ;T0中断服务程序 MOV A, C100US+1 JNZ GOON

40

DEC C100US GOON: DEC C100US+1 MOV A, C100US ORL A, C100US+1

JNZ EXIT ; 100US 计数器不为0, 返回 MOV C100US, #HIGH(TICK) MOV C100US+1, #LOW(TICK)

CPL LEDBUF ; 100US 计数器为0, 重置计数器取反LED EXIT: POP PSW RETI END

2 用T0计数外部脉冲,通过P1口显示计数值

采用T0作计数器,外部计数脉冲由P3.4引入,8051单片机在每个机器周期采样一次输入信号,因此至少需要两个机器周期才能检测到一次脉冲跳变。这就要求被采样的外部脉冲高低电平保持时间均要大于一个机器周期,以保证电平在变化之前即被采样,并且外部计数脉冲的最高计数频率为fosc/24。

在实验系统上如表2-11所示连线。P1.0~P1.3接LED灯, TO(P3.4)端接单脉冲发生器。执行如下程序,每按一次单脉冲按钮,T0将计数一个脉冲,注意观察LED的状态。

表2-11

连线 连接孔1 连接孔2

1 P1.0 L0

2 P1.1 L1

3 P1.2 L2

4 P1.3 L3

5 单脉冲输出 T0

实验程序清单如下。 ORG 0000H

MOV TMOD, #00000101B ;设置T0为工作方式1,计数器 MOV TH0, #0 MOV TL0, #0

LOOP: MOV P1, TL0 ;将记数结果送P1口 LJMP LOOP END

41

复习思考题

1 若在实验中采用定时器T1,应如何修改实验程序?

2 实验中是如何实现定时时间扩展的?能否实现更长时间的扩展?

3 利用8051定时器控制寄存器TMOD中的GATE位,设计一个用T1实现测量脉冲宽度的实验。

42

2.6 实验六 8255输入输出实验

2.6.1 实验目的与要求

通过实验进一步学习了解8255可编程芯片的结构及编程方法,要求编程实现8255的PA、PB和PC口的输入输出。

2.6.2 8255可编程芯片简介

8255具有3个8位的并行I/O口,分别称为PA、PB、PC,其中PA具有一个8位数据输出锁存/缓冲器和一个8位数据输入锁存器,可编程为8位输入输出或双向寄存器。PB、PC与PA类似,不同的是PB不能用作双向寄存器,而PC又分高4位(PC7~PC4)和低4位(PC3~PC0),PC除了用作输入输出口之外,还可用作PA、PB口选通工作方式下的状态控制信号。

8255内部读写控制逻辑用于管理所有的数据、控制字或状态字的传递,它接受来自CPU的地址及控制信号来控制各个端口的工作状态。其控制信号有:

复位信号RESET:高电平有效。复位时控制寄存器被清0,所有端口都设置为输入方式。

片选信号/CS:低电平有效。允许8255与CPU交换信息。

读信号/RD: 低电平有效。允许CPU从8255端口读取数据或外设状态信息。 写信号/WR: 低电平有效。允许CPU将数据、控制字写入8255中。

端口选择信号A1、A0:它们与/RD、/WR及/CS信号配合来选择I/O端口及内部控制寄存器,并控制信息的传送方向,如表2-12所示。

表2-12 8255的端口选择及其功能

A1 A0 0 0 0 1 1 0 0 0 0 1 1 0 1 1 × × 1 1 × × /RD /WR /CS 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 × × 1 0 1 0 1 1 0 功 能 说 明 A口→数据总线 B口→数据总线 C口→数据总线 数据总线→A口 数据总线→B口 数据总线→C口 数据总线→控制寄存器 数据总线为三态 非法状态 数据总线为三态

8255有三种工作方式:方式0、方式1和方式2。

方式0为基本输入输出方式, PA、PB和PC口都可以设定为输入或输出,作为输出口时,输出的数据被锁存,作为输入口时,输入输据不锁存。

方式1为选通输入输出方式,PA、PB和PC三个口分为两组:A组包括PA口和PC

43

口的高4位,PA口可编程设定为输入或输出口,PC口高4位用作输入输出操作的控制和同步信号。B组包括PB口和PC口的低4位,PB口可编程设定为输入或输出口,PC口低4位用作输入输出操作的控制和同步信号。PA和PB口的输入输出数据都被锁存。

方式2为双向总线方式,仅用于PA口,将PA为8位双向总线端口,PC的PC3~PC7用作输入输出的同步控制信号,此时PB口只能编程设定为方式0或方式1。

D7 D6 D5 D4 D3 D2 D1 D0B组C口(下半部)1=输入0=输出B口1=输入0=输出模式选择1=模式10=模式0A组C口(上半部)1=输入0=输出A口1=输入0=输出模式选择00=模式001=模式11×=模式2控制选择1=工作方式控制(a) 方式选择控制字(b) C口置位/复位控制字D7 D6 D5 D4 D3 D2 D1 D0置位0=复位1=置位位选择D3 D2 D0C口0 0 0Bit00 0 1Bit10 1 0Bit20 1 1Bit31 0 0Bit41 0 1Bit51 1 0Bit61 1 1Bit7控制选择0=PC口位操作不用时置0

图2.29 8255的控制字格式

8255有两种控制字,即控制PA、PB、PC口工作方式的方式控制字和控制PC口各位置“1”或清“0”的控制字。两种控制字写入的控制寄存器相同,只是用D7位来区分时哪一种控制字:D7=1为工作方式控制字,D7=0为PC口置“1”或清“0”的控制字。这两种控制字的格式如图2.29所示。

4.6.3 实验内容

利用8255方式0,实现PA口作输出,PB口作输入 在实验系统上如图2.30和表2-13所示连线,8255的片选端/CS接地址译码信号/CS0,则命令口地址为8003H,PA口地址为8000H,PB口地址为8001H,PC口地址为8002H。PA0~PA7接LED0~LED7(LED灯),PB0~PB7接K0~K7(开关量)。数据线、读/写控制、地址线、复位信号在实验板上已经接好。执行如下程序,拨动开关K0~K7到不同位置,注意观察

44

LED灯的状态的变化。

图2.30 8255实验连线

表2-13 连线 连接孔1 连接孔2 1 CS0 8255-CS 2 L0 8255-PA0 3 L1 8255-PA1 4 L2 8255-PA2 5 L3 8255-PA3 6 L4 8255-PA4 7 L5 8255-PA5 8 L6 8255-PA6 9 L7 8255-PA7 10 K0 8255-PB0 11 K1 8255-PB1 12 K2 8255-PB2 13 K3 8255-PB3 14 K4 8255-PB4 15 K5 8255-PB5 16 K6 8255-PB6 17 K7 8255-PB7

实验程序清单如下。

MODE EQU 082H ; 方式0:PA,PC输出,PB 输入 PORTA EQU 08000H ; PA口地址 PORTB EQU 08001H ; PB口地址

45

PORTC EQU 08002H ; PC口地址 CADDR EQU 08003H ; 控制字地址

ORG 0000H MOV A, #MODE MOV DPTR, #CADDR

MOVX @DPTR, A ; 输出控制字 EX_B:MOV DPTR, #PORTB

MOVX A, @DPTR ; 读入PB口 MOV DPTR,#PORTA

MOVX @DPTR,A ; 输出到PA口 MOV R5,#2 CALL DELAY LJMP 0

DELAY:MOV R7,#0 ;延时子程序 DDD: DJNZ R7,DDD

DJNZ R6,DDD DJNZ R5,DDD RET END

复习思考题

1 若要求用8255的PB口作输出,PA口作输入,应如何修改实验程序?

2 利用8255的方式1可实现与单片机的查询或中断方式接口,设计一个通过查询8255的PC1(IBF B)和PC7(OBF A)实现从PB口输入,从PA口输出的实验程序。 3 如果需要采用8255的PC7输出连续方波,如何利用PC口的置位/复位控制命令来实现?

46

2.7 实验七 D/A转换实验

2.7.1 实验目的与要求

通过实验进一步学习D/A转换器的基本原理以及在单片机系统中扩展D/A转换器的方法,掌握D/A转换芯片0832的性能及编程。要求利用0832扩展电路,编制程序产生锯齿波、三角波、方波,用示波器查看波形。

2.7.2 D/A转换芯片0832简介

0832是典型的带内部双缓数据缓冲器的8位D/A芯片,其逻辑结构如图2.31示。图中/LE是寄存命令,当/LE=1时,寄存器输出随输入变化,当/LE=0时,数据锁存在寄存器中,而不再随数据总线上的数据变化而变化。当ILE端为高电平、/CS与/WR1同时为低电平时,使得/LE1=1;当/WR1变为高电平时,输入寄存器便将输入数据锁存。当/XFER与/WR2同时为低电平时,使得/LE2=1,DAC寄存器的输出随寄存器的输入变化,/WR2上升沿将输入寄存器的信息锁存在该寄存器中。RFB为外部运算放大器提供的反馈电阻。VREF端是由外电路为芯片提供一个+10V到-10V的基准电源。Iout1和Iout2是电流输出端,两者之和为常数。

图2.31 DAC0832逻辑框图

0832是电流输出型D/A转换器,实际应用中可以通过外接运算放大器将电流转换为电压。0832的分辨率为8位,如其满度电压为5V,则1个LSB对应的最小转换电压为:

8

Vm=5V/2=5V/256=19.5mV。

47

2.7.3 实验内容

利用0832产生不同波形输出

实验系统中DAC0832的接口电路如图2.33所示,按表2-14所示接线,执行如下程序,用电压表或示波器探头接-5V~+5V输出,观察输出电压或波形。

CS0 图2.32 DAC0832接口电路

表2-14 连线 1 2 连接孔1 DA_CS -5V-+5V 连接孔2 CS1 电压表或示波器

① 正向阶梯波实验程序。

在图2.32中,让8051单片机的累加器A从0开始循环增量,每增量一次向DAC0832送出一个数,得到一个输出电压,这样就可以获得一个正向阶梯波,波形的周期可以通过调整延时时间来改变。

MOV DPTR,#8000H ;DAC0832地址 MOV A,#00H

LOOP:MOVX @DPTR,A ;启动D/A转换

ACALL DELAY ;延时 INC A

AJMP LOOP ;连续输出波形 DELAY:MOV R4,#0FFH ;延时子程序 LOOP1:MOV R5,#10H LOOP2:NOP

NOP NOP

DJNZ R5,LOOP2

48

DJNZ R4,LOOP1 RET

② 三角波实验程序。

若要获得负向的锯齿波,只需将以上程序中的指令INC A换成指令DEC A即可,如果将正向锯齿波与负向锯齿波组合起来就可以获得三角波,程序如下:

MOV DPTR,#8000H ;DAC0832地址 MOV A,#00H

UP: MOVX @DPTR,A ;启动D/A转换

INC A ;上升沿 CJNE A,#0FFH,UP

DOWN:MOVX @DPTR,A ;启动D/A转换

DEC A ;下降沿 CJNE A,#00H,DOWN

AJMP UP ;连续输出波形 ③ 方波实验程序。

方波信号是波形发生器中最常用的一种信号,下面的程序可以从DAC的输出端得到方波,改变两次调用延时子程序的延时值,可得到不同占空比的矩形波。改变HI和LO对应的数字量可以改变方波信号高、低电平值。程序如下:

HI EQU 0FFH LO EQU 00H

MOV DPTR,#8000H ;DAC0832口地址 SQ: MOV A,#LOW ;取低电平数字量

MOVX @DPTR,A ;DAC输出低电平 ACALL DELAY ;延时

MOV A,#HIGH ;取高电平数字量 MOVX @DPTR,A ;DAC输出高电平 ACALL DELAY ;延时

DELAY:MOV R4,#0FFH ;延时子程序 LOOP1:MOV R5,#10H LOOP2:DJNZ R5,LOOP2

DJNZ R4,LOOP1 RET

复习思考题

1 若希望输出一个梯形波,应如何修改实验程序? 2 设计一个用查表方式实现的正弦波实验程序。

49

2.8 实验八 A/D转换实验

2.8.1 实验目的与要求

通过实验进一步学习A/D转换器的基本原理以及在单片机系统中扩展A/D转换器的方法,掌握A/D转换芯片0809的性能及编程,了解单片机如何进行数据采集。

要求利用实验系统上的ADC0809,以及电位器提供模拟量输入,编制A/D转换程序,将模拟量转换成二进制数字量,用8255的PA口输出到LED发光二极管显示。

2.8.2 ADC0809简介

ADC0809是一种较为常用的8路模拟量输入、8位数字量输出的逐次比较式ADC芯片,图2.33为ADC0809的原理结构框图。芯片的主要部分是一个 8 位的逐次比较式A/D转换器。为了能实现8路模拟信号的分时采集, 在芯片内部设置了多路模拟开关及通道地址锁存和译码电路, 因此能对多路模拟信号进行分时采集和转换。转换后的数据送入三态输出数据锁存器。ADC0809的最大不可调误差为±1LSB, 典型时钟频率为640kHz, 时钟信号应由外部提供。每一个通道的转换时间约为100μs。

图2.33 ADC0809的原理结构框图

ADC0809各引脚的功能如下: IN0~IN7: 8路模拟量输入端。 D0~D7: 数字量输出端。

START: 启动脉冲输入端, 脉冲上升沿复位0809, 下降沿启动A/D转换。

ALE: 地址锁存信号, 高电平有效时把三个地址信号送入地址锁存器, 并经地址译

码得到地址输出, 用以选择相应的模拟输入通道。

EOC: 转换结束信号, 转换开始时变低, 转换结束时变高, 变高时降转换结果打入

50

三态输出锁存器。如果将EOC和START相连, 加上一个启动脉冲则连续进行转换。

OE: 输出允许信号输入端。

CLOCK: 时钟输入信号, 最高允许值为640KHz。 VREF(+): 正基准电压输入端。

VREF(-): 负基准电压输入端。通常将VREF(+)接+5V, VREF(-)接地。 Vcc: 电源电压, 可从+5V~+15V。

由于0809芯片没有专门的片选信号输入端,因此在与单片机进行接口时必须通过进行时序分析,图2.34为ADC0809的工作时序。

图2.34 ADC0809的工作时序

2.8.3 实验内容

利用0809实现A/D转换并从LED上显示转换结果

利用实验板上的ADC0809做A/D转换器,实验板上的电位器提供模拟量输入,编制程序,将模拟量转换成二进制数字量,用8255的PA口输出到发光二极管显示。

实验电路如图2.35所示。ADC0809每进行一次A/D转换需要100us的时间。下面的实验程序采用延时方式读入A/D转换结果,也可以用查询或中断方式读入结果,将0809的EOC引脚与CPU的外部中断INT0(P3.2)相连,采用查询方式时通过读取8051的P3.2引脚状态,来确定A/D转换是否结束。在中断方式下,A/D转换结束后会自动产生EOC信号,8051在开中断状态下,每当0809转换结束时通过中断服务程序自动读取A/D转换结果。

按表2-15连线,执行如下程序,旋动实验系统上的电位器,注意观察LED状态的变化。

51

图2.35 ADC0809接口电路 表2-15 连线 1 2 3 4 5 6 7 8 9 10 11 12 连接孔1 IN0 AD_CS EOC 8255_CS PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7 连接孔2 电位器输出 CS2 INT0 CS1 L0 L1 L2 L3 L4 L5 L6 L7 52

实验程序如下。

MODE EQU 082H ; 8255方式0,PA,PC输出,PB输入 CS0809 EQU 8000H

PORTA EQU 9000H ; 8255 PA口地址 PORTB EQU 9001H ; 8255 PB口地址 PORTC EQU 9002H ; 8255 PC口地址 CADDR EQU 9003H ; 8255控制口地址

ORG 0000H

MOV DPTR,#CADDR ; 设置8255工作方式 MOV A,#MODE MOVX @DPTR,A

MOV DPTR, #CS0809 MOV A, #0

MOVX @DPTR, A ; 起动 ADC0809 MOV A, #40H

DJNZ ACC, $ ; 延时 > 100US MOVX A, @DPTR ; 读入A/D结果 MOV R7,#100

DLY: MOV DPTR,#PORTA ; 将A/D结果通过8255 PA口送LED显示 MOVX @DPTR,A

DJNZ R7,DLY ;延时 LJMP 0 END

复习思考题

1 认真复习实验,希望采用查询方式读取A/D结果,应如何修改实验程序?2 设计一个用中断方式实现读取A/D转换结果并显示的实验程序。

53

2.9 实验九 键盘显示实验

2.9.1 实验目的与要求

通过实验学习键盘扫描和8段LED数码显示器的工作原理,掌握键盘和显示器的接口方法。要求:① 利用实验系统提供的显示电路,实现动态显示数据。② 利用实验系统提供的键盘显示电路,实现键盘扫描和数码显示,把按键输入的键码在六位数码管上显示出来。

2.9.2 数码管显示及键盘扫描工作原理

数码显示器是由7段条形的LED组成,在右下角带有一个园形的LED作小数点用,这样一共有8段,恰好适用于8位的并行系统。点亮适当的字段,就可显示出不同的数字。数码显示器有共阴极和共阳极两种,共阴极显示器的公共阴极接地,当各段阳极上的电平为“1”时,该段点亮,电平为“0”时,段就熄灭;共阳极显示器的公共阳极接+5V电源,当各段阴极上的电平为“0”时,该段就点亮,电平为“1”时,段就熄灭。

实验系统提供了6位8段LED数码管显示电路,8位段码、6位位码分别由两片74LS374输出。位码经MC1413或ULN2003倒相驱动后,选择相应显示位。8位段码输出地址为0X004H,位码输出地址为 0X002H。此处“X”由地址译码输入端KEY/LED CS 决定,如将KEY/LED CS接到CS0上,则段码地址为08004H,位码地址为08002H。8段数码管的字型代码如下:

a 显示字形 g f e d c b a 段码 ----- 0 0 1 1 1 1 1 1 3fh f| |b 1 0 0 0 0 1 1 0 06h | | 2 1 0 1 1 0 1 1 5bh ----- 3 1 0 0 1 1 1 1 4fh | g | 4 1 1 0 0 1 1 0 66h e| |c 5 1 1 0 1 1 0 1 6dh ----- 6 1 1 1 1 1 0 1 7dh d 7 0 0 0 0 1 1 1 07h

.h 8 1 1 1 1 1 1 1 7fh

9 1 1 0 1 1 1 1 6fh A 1 1 1 0 1 1 1 77h b 1 1 1 1 1 0 0 7ch C 0 1 1 1 0 0 1 39h d 1 0 1 1 1 1 0 5eh E 1 1 1 1 0 0 1 79h F 1 1 1 0 0 0 1 71h

实验系统提供了一个6×4的小键盘,向行扫描地址(0X002H)逐行输出低电平,然后从列地址(0X001H)读回。如果有键按下,则相应列的值应为低,如果无键按下,由于上拉

54

的作用,列的值为高。这样就可以通过输出的行值和读取的列值来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。扫描地址和列地址中的“X”由地址译码输入端KEY/LED CS 决定,例如将KEY/LED CS信号接CS0上,则行扫描地址为08002H,列地址为08001H。行扫描码还可以分时用作LED数码管的位选通信号。

2.9.3 实验内容

1 8段数码管动态显示

实验原理电路如图2.36所示,按表2-16连线,执行如下程序,注意观察8段LED数码管显示字形的变化。

数据总线

位选通信号 段码输出 (0x002H) (0x004H)

图2.36 数码管显示原理电路 表2-16 连线 1 连接孔1 KEY/LED_CS 连接孔2 CS2

实验程序清单如下。

OUTBIT EQU 08002H ; 位控制口 OUTSEG EQU 08004H ; 段控制口 LEDBUF EQU 60H ; 显示缓冲区 NUM EQU 70H ; 显示的数据 DELAYT EQU 75H ;

ORG 0000H LJMP START

LEDMAP: ; 8段数码管显示代码

55

DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H DELAY: MOV R7, #0 ; 延时子程序 DELAYLOOP: DJNZ R7, DELAYLOOP DJNZ R6, DELAYLOOP RET

DISPLAYLED:MOV R0, #LEDBUF

MOV R1, #6 ; MOV R2, #00100000B ; LOOP: MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; MOV A, @R0

MOV DPTR, #OUTSEG MOVX @DPTR,A

MOV DPTR, #OUTBIT MOV A, R2

MOVX @DPTR, A ; MOV R6, #01 CALL DELAY

MOV A, R2 ; RR A MOV R2, A INC R0

DJNZ R1, LOOP

MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; RET

START: MOV SP, #40H MOV NUM, #0 MLOOP: INC NUM MOV A, NUM MOV B, A

MOV R0, #LEDBUF FILLBUF: MOV A, B ANL A, #0FH

MOV DPTR, #LEDMAP

56

共6个八段管 从左边开始显示 关所有八段管 显示一位八段管 显示下一位 关所有八段管 MOVC A, @A+DPTR ; 数字转换成显示代码 MOV @R0,A ; 显示代码填入显示缓冲区 INC R0 INC B

CJNE R0, #LEDBUF+6, FILLBUF MOV DELAYT,#30

DISPAGAIN: CALL DISPLAYLED ; 显示 DJNZ DELAYT,DISPAGAIN LJMP MLOOP END

2 键盘扫描显示

本实验实际上是前一个实验的扩展,原理电路如图2.37所示,按表2-17连线。执行程序,按下不同按键,注意观察8段LED数码管显示数据的变化。

实验程序可分成三个模块:

① 键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 ② 显示模块:将显示单元的内容在显示器上动态显示。 ③ 主程序:调用键输入模块和显示模块。

图2.37 扫描式键盘原理电路

实验程序清单如下。

OUTBIT EQU 08002H ; 位控制口 OUTSEG EQU 08004H ; 段控制口 IN EQU 08001H ; 键盘读入口 LEDBUF EQU 60H ; 显示缓冲

57

ORG 0000H LJMP START

LEDMAP: ; 八段数码管显示代码

DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H

DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

DELAY: MOV R7, #0 ; DELAYLOOP: DJNZ R7, DELAYLOOP DJNZ R6, DELAYLOOP RET

DISPLAYLED:MOV R0, #LEDBUF ; MOV R1, #6 ; MOV R2, #00100000B ; LOOP: MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; MOV A, @R0

MOV DPTR, #OUTSEG MOVX @DPTR, A

MOV DPTR, #OUTBIT MOV A, R2

MOVX @DPTR, A ; MOV R6, #1 CALL DELAY

MOV A, R2 ; RR A MOV R2, A INC R0

DJNZ R1, LOOP RET

TESTKEY: MOV DPTR, #OUTBIT ; MOV A, #0

MOVX @DPTR, A ; MOV DPTR, #IN

MOVX A, @DPTR ; CPL A

58

延时子程序 显示子程序

共6个八段数码管 从左边开始显示 关闭所有数码管 显示一位数码管 显示下一位 按键扫描子程序 输出线置为0 读入键状态 ANL A, #0FH ; 高四位不用 RET

KEYTABLE: DB 16H, 15H, 14H, 0FFH ; 键码定义 DB 13H, 12H, 11H, 10H DB 0DH, 0CH, 0BH, 0AH

DB 0EH, 03H, 06H, 09H DB 0FH, 02H, 05H, 08H DB 00H, 01H, 04H, 07H

GETKEY: MOV DPTR, #OUTBIT ; MOV P2, DPH

MOV R0, #LOW(IN)

MOV R1, #00100000B MOV R2, #6

KLOOP: MOV A, R1 ; CPL A

MOVX @DPTR, A CPL A RR A

MOV R1, A ; MOVX A, @R0 CPL A

ANL A, #0FH

JNZ GOON1 ; DJNZ R2, KLOOP

MOV R2, #0FFH ; SJMP EXIT

GOON1: MOV R1, A ; MOV A, R2 DEC A RL A RL A

MOV R2, A ; R2 = (R2-1)*4 MOV A, R1 ; R1 MOV R1, #4

LOOPC: RRC A ; JC EXIT

INC R2 ; R2 = R2+ 读键值子程序 找出按键所在行 下一行 该行有键按下 无键按下返回0FFH 键值=行号*4+列号 中为读入的列值 移位找出所在列 列值

59

DJNZ R1, LOOPC

EXIT: MOV A, R2 ; 取出键码 MOV DPTR, #KEYTABLE MOVC A, @A+DPTR MOV R2, A

WAITRELEASE:MOV DPTR, #OUTBIT ; 等键释放 CLR A

MOVX @DPTR, A MOV R6, #10 CALL DELAY CALL TESTKEY JNZ WAITRELEASE MOV A, R2 RET

START: MOV SP, #40H ; 主程序

MOV LEDBUF+0, #0FFH ; 显示 8.8.8.8. MOV LEDBUF+1, #0FFH MOV LEDBUF+2, #0FFH MOV LEDBUF+3, #0FFH MOV LEDBUF+4, #0 MOV LEDBUF+5, #0

MLOOP: CALL DISPLAYLED ; 显示 CALL TESTKEY ; 有键入?

JZ MLOOP ; 无键入, 继续显示 CALL GETKEY ; 读入键码 ANL A, #0FH ; 显示键码 MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV LEDBUF+5, A LJMP MLOOP END

复习思考题

1 认真复习实验过程,弄清8段数码管动态显示原理。 2 改写数码管动态显示实验程序实现显示“HELLO”字符。

3 改写键盘扫描显示实验程序,实现按键显示“123456”字符。

60

2.10 实验十 电子时钟实验

2.10.1 实验目的与要求

通过实验加深理解8051定时器和中断系统工作原理,进一步掌握定时器任意定时时间的编程方法,以及数码显示电路的驱动编程方法。要求利用8051定时器和实验系统提供的数码显示电路,设计一个电子时钟。显示格式为:XX XX XX 由左向右分别为:时、分、秒

2.10.2 实验内容

设置8051内部定时器每100us中断一次,在中断服务程序中,对中断次数进行计数,计数10000次就是1秒。然后再对秒计数得到分和小时值,并送入显示缓冲区。本实验只需接上显示/键盘的选择信号,按表2-17所示连线,执行如下程序,显示器上将按上述格式显示时、分、秒值。

表2-17 连线 1 连接孔1 KEY/LED_CS 连接孔2 CS2

实验程序清单如下。

OUTBIT EQU 08002H ; 数码管位控制口 OUTSEG EQU 08004H ; 数码管段控制口 IN EQU 08001H ; 键盘读入口 LEDBUF EQU 60H ; 显示缓冲区 HOUR EQU 40H MINUTE EQU 41H SECOND EQU 42H C100US EQU 43H

TICK EQU 10000 ;中断次数计数器 T100US EQU 256-50 ;100US定时初值

ORG 0000H ;复位入口 LJMP START

ORG 000BH ;定时器T0中断入口 LJMP T0INT ORG 0030H

LEDMAP: ; 数码管显示代码

DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H

61

DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

DELAY: MOV R7, #0 ; 延时子程序 DELAYLOOP:

DJNZ R7, DELAYLOOP DJNZ R6, DELAYLOOP RET

DISPLAYLED: ; MOV R0, #LEDBUF

MOV R1, #6 ; MOV R2, #00100000B ; LOOP: MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; MOV A, @R0

MOV DPTR, #OUTSEG MOVX @DPTR,A

MOV DPTR, #OUTBIT MOV A, R2

MOVX @DPTR, A ; MOV R6, #1 CALL DELAY

MOV A, R2 ; RR A MOV R2, A INC R0

DJNZ R1, LOOP RET

TOLED: MOV DPTR, #LEDMAP ; MOVC A, @A+DPTR RET

START: MOV TMOD, #02H ; MOV TH0, #T100US ; MOV TL0, #T100US

MOV IE, #10000010B ; 62

显示子程序 共6个数码管 从左边开始显示 关所有数码管 显示一位八段管 显示下一位 查表取显示代码子程序 主程序

设置T0工作方式及初值 开中断

MOV HOUR, #0 MOV MINUTE, #0 MOV SECOND, #0

MOV C100US, #HIGH(TICK) MOV C100US+1, #LOW(TICK)

SETB TR0 ; 启动T0 MLOOP: MOV A, HOUR MOV B, #10 DIV AB CALL TOLED MOV LEDBUF, A MOV A, B CALL TOLED ORL A, #80H MOV LEDBUF+1, A MOV A, MINUTE MOV B, #10 DIV AB CALL TOLED

MOV LEDBUF+2, A MOV A, B CALL TOLED ORL A, #80H MOV LEDBUF+3, A MOV A, SECOND MOV B, #10 DIV AB CALL TOLED

MOV LEDBUF+4, A MOV A, B CALL TOLED

MOV LEDBUF+5, A CALL DISPLAYLED LJMP MLOOP

T0INT: PUSH PSW ; PUSH ACC

MOV A, C100US+1

定时器T0中断服务程序63

JNZ GOON DEC C100US GOON: DEC C100US+1 MOV A, C100US ORL A, C100US+1 JNZ EXIT

MOV C100US, #HIGH(TICK) MOV C100US+1, #LOW(TICK) INC SECOND MOV A, SECOND CJNE A, #60, EXIT MOV SECOND, #0 INC MINUTE MOV A, MINUTE CJNE A, #60, EXIT MOV MINUTE, #0 INC HOUR MOV A, HOUR

CJNE A, #24, EXIT MOV HOUR, #0 EXIT: POP ACC POP PSW RETI END

复习思考题

1 认真复习实验过程,进一步弄清定时器任意定时时间的工作原理和8段数码管动态显示原理。

2 改写实验程序实现用按键设定电子时钟的时、分、秒值。

64

2.11 实验十一 串行口通讯实验

2.11.1 实验目的与要求

通过实验了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议,学习串口通讯中断方式的程序编写方法,掌握单片机串行口简易三线式通讯的实现方法。要求利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示。

2.11.2 8051单片机串行口简介

8051单片机内部有一个可编程的全双工串行接口,它在物理上分为两个独立的发送缓冲器和接收缓冲器SBUF,这两个缓冲器占用一个特殊功能寄存器地址99H,究竟是发送缓冲器还是接收缓器工作是靠软件指令来决定的。对外有两条独立的收、发信号线RXD(P3.0)和TXD(P3.1),因此可以同时接收和发送数据,实现全双工传送,使用串行口时可以用定时器T1或T2作为波特率发生器。

8051串行口通过两个特殊功能寄存器SCON和PCON来进行控制,分别介绍如下。 串行口控制寄存器SCON(地址为98H):这个特殊功能寄存器包含有串行口的工作方式选择位,接收发送控制位及串行口的状态标志,格式如下:

D7 D6 D5 D4 D3 D2 D1 D0 SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1为串行口的工作方式选择位,详见表2-18。

表2-18

SM0 0 0 1 1 SM1 0 1 0 1 工作方式 方式0,移位寄存器方式(用于I/O口扩展)。 方式1,8位UART,波特率可变(T1溢出率/n)。 方式2,9位UART,波特率为fosc/64获fosc/32。 方式3,9位UART,波特率可变(T1溢出率/n)。。 表中, n为16或32, 取决于特殊功能寄存器PCON中SMOD位的值,SMOD=1时, n= 16;

SMOD=0时, n=32。UART表示通用异步收发器。

串行口有四种工作方式,说明如下。

方式0为移位寄存器输入/输出方式。串行数据从RXD线输入或输出,而TXD线专用于输出时钟脉冲给外部移位寄存器。这种方式主要用于进行I/O口的扩展,输出时将片内发送缓冲器中的内容串行地移入外部的移位寄存器,输入时将外部移位寄存器中的内容移入片内接收缓冲器,波特率固定为fosc/12。

方式1为8位异步接收发送。一帧数据有10位, 包括1位起始位(0),8位数据位和1位停止位(1)。串行口电路在发送时能自动插入起始位和停止位,在接收时,停止位进入SCON中的RB8位。方式1的传送波特率是可变的,由定时器1的溢出率决定。

方式2为9位异步接收发送。一帧数据包括有11位, 除了1位起始位、8位数据位、1位停止位之外,还可以插入第9位数据,字符格式如图2.37所示。

65

1个字符起始位00/10/10/1第9位0/10/10/10/1停止位1

图2.37 串行口方式2的9位UART数据格式

8位数据0/10/1发送时,第9位数据的值可通过SCON中的TB8指定为“0”或“1”,用一些附加的指令可使这一位作奇偶校验位。接收时,第9位数据进入特殊功能寄存器SCON中的RB8位。方式2的波特率为fosc/64或fosc/32。

方式3也是9位异步接收发送,一帧数据有11位, 工作方式与方式2相同,只是传送时的波特率受定时器1的控制,即波特率可变。

SCON寄存器中另外各位的意义如下:

SM2为允许在方式2和方式3时进行多机通讯的控制位。若允许多机通讯,则应使SM2=1,然后根据收到的第9位数据值来决定从机是否接收主机的信号,当SM2=0时禁止多机通讯。

REN为允许串行接收位。由软件置位以允许接收。由软件清“0”来禁止接收。 TB8为方式2和方式3时发送的第9位数据。需要由软件置位或复位。

RB8为方式2和方式3时接收到的第9位数据。在方式1,若SM2=0,则RB8是接收到的停止位;在方式0,不使用RB8。

TI为发送中断标志。由硬件在方式0串行发送第8位结束时置“1”,或在其他方式串行发送停止位的开始时置“1”。该位必须由软件清“0”。

RI为接收中断标志。由硬件在方式0接受到第8位结束时置“1”,或在其他方式串行接收到停止位的中间时置“1”。该位必须由软件清“0”。

特殊功能寄存器PCON(地址为87H):在PCON寄存器中,只有一位与串行口工作有关。其格式如下:

D7 D6 D5 D4 D3 D2 D1 D0

Smod 串行口工作于方式1,方式2和方式3时,数据传送的波特率与2Smod成正比,也就是说,当Smod=1时,将使串行口传送的波特率加倍。

2.16.3 实验内容

8051单片机的RXD、TXD接线柱在POD51仿真板上,通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接,如图3.38所示。

66

图3.38 双机通信连线示意图

也可以将本机的TXD接到RXD上,这样按下的键,就会在本机LED上显示出来。若想与标准的RS232设备通信,就要做电平转换,输出时要将TTL电平换成RS232电平,输入时要将RS232电平换成TTL电平。可以将仿真板上的RXD、TXD信号接到实验板上的“用户串口接线”的相应RXD和TXD端,经过电平转换,通过“用户串口”接到外部的RS232设备。

按表2-19连线,执行如下程序,按下一台实验系统的按键,注意观察另一台实验系统上数码管的显示值。

表2-19 连线 1 2 3 4 连接孔1 甲方TXD 甲方RXD 甲方GND KEY/LED_CS 连接孔2 乙方RXD 乙方TXD 乙方GND CS0

实验程序清单如下。

OUTBIT EQU 08002H ; 数码管位控制口 OUTSEG EQU 08004H ; 数码管段控制口 IN EQU 08001H ; 键盘读入口

HASRCV EQU 20H.0 ; 接收标志位 LEDBUF EQU 40H ; 显示缓冲 RCVBUF EQU 50H ; 接收缓冲

ORG 0000H ; 复位入口 LJMP START

ORG 0023H ; 串行口中断入口 LJMP SINT

LEDMAP: ; 数码管显示代码

67

DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

DELAY: MOV R7, #0 ; 延时子程序 DELAYLOOP:

DJNZ R7, DELAYLOOP DJNZ R6, DELAYLOOP RET

DISPLAYLED:

MOV R0, #LEDBUF

MOV R1, #6 ; MOV R2, #00100000B ; LOOP: MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; MOV A, @R0

MOV DPTR, #OUTSEG MOVX @DPTR,A

MOV DPTR, #OUTBIT MOV A, R2

MOVX @DPTR, A ; MOV R6, #1 CALL DELAY

MOV A, R2 ; RR A MOV R2, A INC R0

DJNZ R1, LOOP RET

TESTKEY:

MOV DPTR, #OUTBIT MOV A, #0

MOVX @DPTR, A ; MOV DPTR, #IN

MOVX A, @DPTR ; CPL A

68

共6个数码管 从左边开始显示 关所有数码管 显示一位数码管 显示下一位 输出线置为0 读入键状态 ANL A, #0FH ; 高四位不用 RET

KEYTABLE: ; 键码定义 DB 16H, 15H, 14H, 0FFH DB 13H, 12H, 11H, 10H DB 0DH, 0CH, 0BH, 0AH DB 0EH, 03H, 06H, 09H DB 0FH, 02H, 05H, 08H DB 00H, 01H, 04H, 07H

GETKEY:MOV DPTR, #OUTBIT MOV P2, DPH

MOV R0, #LOW(IN) MOV R1, #00100000B MOV R2, #6

KLOOP: MOV A, R1 ; CPL A

MOVX @DPTR, A CPL A RR A

MOV R1, A ; MOVX A, @R0 CPL A

ANL A, #0FH

JNZ GOON1 ; DJNZ R2, KLOOP

MOV R2, #0FFH ; SJMP EXIT

GOON1: MOV R1, A ; MOV A, R2 DEC A RL A RL A

MOV R2, A ; R2 = (R2-1)*4 MOV A, R1 ; R1 MOV R1, #4

LOOPC: RRC A ; 找出键所在列 下一列 该列有键入 没有键按下, 返回 0FFH 键值 = 列 X 4 + 行 中为读入的行值 移位找出所在行

69

JC EXIT

INC R2 ; R2 = R2+ 行值 DJNZ R1, LOOPC

EXIT: MOV A, R2 ; 取出键码 MOV DPTR, #KEYTABLE MOVC A, @A+DPTR MOV R2, A WAITRELEASE:

MOV DPTR, #OUTBIT ; 等键释放 CLR A

MOVX @DPTR, A MOV R6, #10 CALL DELAY CALL TESTKEY JNZ WAITRELEASE MOV A, R2 RET

START: MOV SP, #60H ; 主程序

MOV IE, #0 ; DISABLE ALL INTERRUPT

MOV TMOD,#020H ; 定时器1工作于方式2 (8位重装) MOV TH1, #0F3H ; 波特率=2400BPS @ 12MHZ MOV TL1, #0F3H

ANL PCON,#07FH ; SMOD 位清零 ORL PCON,#80H

MOV SCON,#050H ; 串行口工作方式设置 MOV LEDBUF, #0FFH ; 显示 8.8.8.8. MOV LEDBUF+1, #0FFH MOV LEDBUF+2, #0FFH MOV LEDBUF+3, #0FFH MOV LEDBUF+4, #0 MOV LEDBUF+5, #0 SETB TR1 SETB ES SETB EA

;MOV SBUF,A ;JNB TI,$

MLOOP: JB HASRCV, RCVDATA ; 收到数据?

70

CALL DISPLAYLED ; 显示 CALL TESTKEY ; 有键入?

JZ MLOOP ; 无键入, 继续显示 CALL GETKEY ; 读入键码

ANL A, #0FH ; 通讯口输出键码 MOV SBUF,A LJMP MLOOP RCVDATA:

CLR HASRCV ; 是

MOV A, RCVBUF ; 显示数据 MOV B,A

ANL A,#0FH ; 显示低位 MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV LEDBUF+5, A MOV A,B

SWAP A ; 显示高位 ANL A,#0FH

MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV LEDBUF+4, A LJMP MLOOP

SINT: JNB TI,S0_R ; 串行口中断服务程序 CLR TI NOP

SJMP S0_RET

S0_R: CLR RI ; 接收数据 MOV RCVBUF,SBUF ; 保存数据 SETB HASRCV ; 提示收到数据 NOP S0_RET: RETI END

复习思考题

1. 复习实验过程,加深对串行工作原理的理解。

2. 修改实验程序实现下位机8051与上位机PC之间的串行通信。71

2.12 实验十二 模拟空调温度控制实验

2.12.1 实验目的与要求

通过实验学习闭环控制的基本原理,进一步熟悉A/D转换器工作原理和编程方法,进一步了键盘扫描和LED动态显示原理和编程方法。 利用实验系统提供的键盘、显示电路和A/D转换电路,完成类似空调恒温控制实验,采用实验仪系统上的电位器模仿温度变化,加热和致冷电机用发光二极管代替。要求用键盘设定恒温温度,当外界温度超过设定温度+/-2℃时,启动加热或致冷电机。

2.12.2 实验原理说明

这是一个综合硬件实验,其中各部分实验前面都已经单独做过,现联合起来形成一个控制系统。实验原理电路如图2.39所示,用电位器模拟温度采样,用8255的PA0模拟加热电机,PA1模拟制冷电机,LED显示电路和键盘电路在实验系统上已经接好, A/D转换电路只要接上模拟量输入和地址选择信号即可。

电位器模仿温度采样 8255 PA0模拟加热电机,PA1模拟制冷电机

图2.39 实验原理电路

2.17.3 实验内容

利用电位器和A/D转换器实现模拟空调温度控制

如表2-20所示连线,执行如下程序,调节电位器,注意观察发光二极管状态的变化。

72

表2-20 连线 1 2 连接孔1 AD_CS IN0 连接孔2 CS1 电位器输出 3 8255_CS CS2 4 PA0 L0 5 PA1 L1 6 KEY/LED_CS CS1 实验程序清单如下。

MODE EQU 082H ; 8255工作方式 PORTA EQU 08000H ; 8255 PA端口地址 CTL EQU 08003H ; 8255控制端口地址 OUTBIT EQU 09002H ; 数码管位控制口 OUTSEG EQU 09004H ; 数码管段控制口 IN EQU 09001H ; 键盘输入口 LEDBUF EQU 60H ; 显示缓冲区

ORG 0000H ; 复位入口 LJMP START

LEDMAP: ; 数码管显示代码

DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H

DELAY: MOV R7, #0 ; 延时子程序 DELAYLOOP:

DJNZ R7, DELAYLOOP DJNZ R6, DELAYLOOP RET

DISPLAYLED: ; 显示子程序 MOV R0, #LEDBUF MOV R1, #6

MOV R2, #00100000B LOOP: MOV DPTR, #OUTBIT MOV A, #0 MOVX @DPTR, A

73

MOV A, @R0

MOV DPTR, #OUTSEG MOVX @DPTR, A

MOV DPTR, #OUTBIT MOV A, R2 MOVX @DPTR, A MOV R6, #1 CALL DELAY MOV A, R2 RR A MOV R2, A INC R0

DJNZ R1, LOOP

MOV DPTR, #OUTBIT MOV A, #0 MOVX @DPTR, A RET

TESTKEY: ; MOV DPTR, #OUTBIT MOV A, #0 MOVX @DPTR, A MOV DPTR, #IN MOVX A, @DPTR CPL A

ANL A, #0FH RET

KEYTABLE: ; DB 16H, 15H, 14H, 0FFH DB 13H, 12H, 11H, 10H DB 0DH, 0CH, 0BH, 0AH DB 0EH, 03H, 06H, 09H DB 0FH, 02H, 05H, 08H DB 00H, 01H, 04H, 07H

GETKEY:MOV DPTR, #OUTBIT ; MOV P2, DPH

74

按键子程序 键值表 读键值子程序 MOV R0, #LOW(IN) MOV R1, #00100000B MOV R2, #6 KLOOP: MOV A, R1 CPL A

MOVX @DPTR, A CPL A RR A MOV R1, A MOVX A, @R0 CPL A

ANL A, #0FH JNZ GOON1 DJNZ R2, KLOOP MOV R2, #0FFH SJMP EXIT GOON1: MOV R1, A MOV A, R2 DEC A RL A RL A

MOV R2, A ; R2 = (R2-1)*4 MOV A, R1 MOV R1, #4 LOOPC: RRC A JC EXIT INC R2

DJNZ R1, LOOPC EXIT: MOV A, R2

MOV DPTR, #KEYTABLE MOVC A, @A+DPTR MOV R2, A WAITRELEASE:

MOV DPTR, #OUTBIT CLR A

MOVX @DPTR, A MOV R6, #10 CALL DELAY

75

CALL TESTKEY JNZ WAITRELEASE MOV A, R2 RET

; ==============模拟温度调节================ UP EQU 16H ; NEXT DOWN EQU 15H ; LAST LOWLIMIT EQU 10 HIGHLIMIT EQU 30

LOWTEMP EQU -40 ; A/D 0 HIGHTEMP EQU 50 ; A/D 255 ADPORT EQU 0A000H HEAT EQU 1 COOL EQU 2 SETTEMP EQU 50H CURTEMP EQU 51H

DISPLAYRESULT:

MOV A, CURTEMP JNB ACC.7, GE0

MOV LEDBUF, #40H ; '-' DEC A CPL A JMP GOON

GE0: MOV LEDBUF, #0 ; ' ' GOON: MOV B, #10 DIV AB

MOV DPTR, #LEDMAP MOVC A, @A+DPTR MOV LEDBUF+1, A MOV A, B

MOVC A, @A+DPTR MOV LEDBUF+2, A

MOV LEDBUF+3, #0 ; ' ' MOV A, SETTEMP MOV B, #10 DIV AB

MOVC A, @A+DPTR

76

MOV LEDBUF+4, A MOV A, B

MOVC A, @A+DPTR MOV LEDBUF+5, A RET

READAD:MOV DPTR, #ADPORT CLR A

MOVX @DPTR, A ; START A/D MOV A, #0

DJNZ ACC, $ ; DELAY MOVX A, @DPTR RET

READTEMP:

MOV R1, #0 MOV R2, #0 MOV R0, #16 RLOOP: CALL READAD ADD A, R2 MOV R2, A JNC GN1 INC R1

GN1: DJNZ R0, RLOOP MOV A, R2 SWAP A

ANL A, #0FH XCH A, R1 SWAP A

ANL A, #0F0H

ORL A, R1 ; A = R1R2/16 MOV B, #(HIGHTEMP-LOWTEMP) MUL AB

MOV A, B ; /256 ADD A, #LOWTEMP MOV CURTEMP, A RET

77

START: MOV SP, #70H ; 主程序 MOV A, #MODE MOV DPTR, #CTL

MOVX @DPTR, A ; 设置8255 PA、PC输出,PB输入 MOV SETTEMP, #20 MLOOP: CALL TESTKEY JNZ KEYPRESSED CALL DISPLAYRESULT CALL DISPLAYLED CALL READTEMP MOV A, CURTEMP JB ACC.7, LE0 CLR C

MOV B, SETTEMP DEC B DEC B SUBB A, B JNC GN2

LE0: MOV A, #HEAT MOV DPTR, #PORTA MOVX @DPTR, A SJMP GN4

GN2: MOV A, CURTEMP SETB C

MOV B, SETTEMP INC B INC B SUBB A, B JC GN3

MOV A, #COOL MOV DPTR, #PORTA MOVX @DPTR, A SJMP GN4 GN3: MOV A, #0

MOV DPTR, #PORTA MOVX @DPTR, A GN4: SJMP MLOOP

78

KEYPRESSED:

CALL GETKEY MOV B, A XRL A, #DOWN JNZ KEY0

MOV A, SETTEMP XRL A, #LOWLIMIT JZ KEY1 DEC SETTEMP SJMP KEY1 KEY0: MOV A, B XRL A, #UP JNZ KEY1

MOV A, SETTEMP XRL A, #HIGHLIMIT JZ KEY1 INC SETTEMP KEY1: SJMP MLOOP

END

复习思考题

1. 复习实验过程,加深对空调温度控制工作原理的理解。

2. 如果不用8255而直接用8051的P1口控制加热和制冷电机,应如何修改实验程

序?

79

因篇幅问题不能全部显示,请点此查看更多更全内容