微机原理与接口技术 实验讲稿( PPT )

Preview:

DESCRIPTION

微机原理与接口技术 实验讲稿( PPT ). 实验项目. 实验箱简介 基于 EPP 接口的 LED 显示 8255 并行接口原理及编程 8253 计数器原理及分频实验 8253 计数器在测频中的应用 双积分式 A/D 转换器 7109 的原理及编程 逐次比较式 A/D 转换器 0809 的原理及编程 D/A 转换器 0832 的原理实验 DAC0832 在程控信号源中的应用 LED 点阵显示 基本并行输入 / 输出口在键盘接口中的应用 8250 串行通信 电子称实验. 实验箱简介. 实验箱的组成原理 ▼ 实验主板的原理 - PowerPoint PPT Presentation

Citation preview

微机原理与接口技术实验讲稿( PPT )

实验项目 实验箱简介 基于 EPP 接口的 LED 显示 8255 并行接口原理及编程 8253 计数器原理及分频实验 8253 计数器在测频中的应用 双积分式 A/D 转换器 7109 的原理及编程 逐次比较式 A/D 转换器 0809 的原理及编程 D/A 转换器 0832 的原理实验 DAC0832 在程控信号源中的应用 LED 点阵显示 基本并行输入 / 输出口在键盘接口中的应用 8250 串行通信 电子称实验

实验箱简介 实验箱的组成原理 ▼ 实验主板的原理 实验主板是由并行 I/O 、定时器 / 计数器、A/D 转换器、 D/A 转换器及 LED 显示器等接口部件构成,采用了总线结构,各功能部件均通过内部总线进行连接,如下图所示。

实验主板的内总线结构 D 0 ~ D 7

外部扩展口

并行数字显示

A /D、D /A

定时 /计数器

并行I/O

译码器

A 0 ~ A 7

▼ 实验主板的布局电源

EPP接口

LED 数字显示

A /D转换器( 7109)应用

8255并行口 应用

D/ A转换器( 0832)应用实验

外接扩展板 接口

A/ D转换器 ( 0809)应用

8253计数器 应用实验

EPP 接口原理 ▼EPP 信号特性,其引脚定义如下图

引脚 SPP信号 EPP信号 方向 EPP功能描述1 STOBE nWr i t e 输出 读写信号,低写高读

2~9 Dat a0~7 Dat a0~7 双向 双向数据/地址线10 ACK I nt er r upt 输入 中断请求线,上升沿触发

11 BUSY nWai t 输入握手信号,低表示开始一个周期,高表示结束一个周期

12 PE 用户自定义 输入 按不同外设自定义13 SELECT 用户自定义 输入 按不同外设自定义14 AUTO LF nDat aSTB 输出 数据选通信号,低表示正在进行数据读写操作15 ERROR 用户自定义 输入 按不同外设自定义16 I NTI nReset 输出 外设复位信号,低有效17 SLCT I N nAddr STB 输出 地址选通信号,低表示正在进行地址读写操作

18~25 GND GND GND 信号地

▼ EPP 端口寄存器 端口地址如表下图所示。表中 BASE 为并口基地址,地 址 端 口 名 称 方 向

BASE+0 数据端口 ( SPP) 写

BASE+1 状态端口 ( SPP/ EPP) 读

BASE+2 控制端口 ( SPP/ EPP) 写

BASE+3 地址端口 ( EPP) 读 /写BASE+4 数据端口 ( EPP) 读 /写BASE+5 未定义 ( 16/ 32bi t Tr ansf er ) -BASE+6 未定义 ( 32bi t Tr ansf er ) -BASE+7 未定义 ( 32bi t Tr ansf er ) -

状态寄存器和控制寄存器各位具体定义如下图所示。

中断使能位1有效

× × DI R I RQEN ASTRB I NI T DSTRB WRI TE

方向位1=输入0=输出 地址选通位

0有效

初始化位1有效

数据选通位0有效

读 /写状态位1=读0=写

控制寄存器(BASE+2)

D7 D6 D5 D4 D3 D2 D1 D0

WAI T I NTR USER1 USER2 USER3 × × TMOUT状态寄存器(BASE+1)

Wai t状态位1有效

中断请求状态位1有效

用户自定义保留( EPP1. 7)超时标志位( EPP1. 9)1=超时; 0=未超时

▼ EPP 接口初始化 在使用 EPP 之前应将并口置于正向传输模式(输出),即将控制寄存器的方向位( Bit5 )置 0 。可编写 EPP 初始化函数 epp_init() 如下: void epp_init(void) { outportb(0x37a,0x04); }

▼ EPP 时序 数据 / 地址写周期时序 nW rite

nW ait

Va lidD ata

nD ataS TB

Data

IS A (IO W )

nW rite

nW ait

ValidD ata

nAddS TB

Data

ISA (IO W )

数据 / 地址读周期时序

nD ataS TB

nW rite

nW ait

D a ta ValidD ata

IS A (IO R )

nA ddS TB

nW rite

nW ait

D ata ValidD ata

ISA (IO R )

▼ EPP 端口读写 计算机要同外设实验箱通信,就要通过

EPP 接口来读写数据,因此,首先应向EPP 地址端口( BASE+3 )写入欲访问的外设地址,然后从 EPP 数据端口(BASE+4) 读写数据,每次读写 1 个字节

EPP 端口写函数 epp_write_data()

void epp_write_data(unsigned char paddr,unsigned char data)

{ outportb(0x37b,paddr); epp_check_clear(); outportb(0x37c,data); epp_check_clear();}

EPP 端口读函数 epp_read_data()

void epp_read_data(unsigned char paddr,unsigned char *data)

{ outportb(0x37b, paddr); epp_check_clear(); *data = inportb(0x37c); epp_check_clear(); }

EPP 接口与本实验平台的连接 , 如下ABC

E1E2

Y0Y1Y2Y3Y4Y5Y6Y7

D1...D8

CLK

Q1Q2Q3Q4Q5Q6Q7Q8

A0..A7

EDI R

B0...B7

ABC

E1E2

Y0Y1Y2Y3Y4Y5Y6Y7

nWai t信号产生电路

nDat aSTBnAddr STB

nWr i t e

nWai t

AD0 . . .AD7

WRRD

1Y01Y11Y21Y31Y41Y5 1Y61Y7

2Y02Y12Y22Y3 2Y4 2Y52Y62Y7

DB0. . . DB7

EPP

74LS245

74LS273

D0. . . . . D7

A0A1

A5A6A7

A2

n R e ad

DB0. . . DB7

扩展接口扩展接口的原理及管脚定义如下图所示。

A0

EDI R

B0B1B2B3B4B5B6B7

ED0ED1ED2ED3ED4ED5 ED6ED7

D0

RD1Y61Y7

A0A1A21Y71Y6RDWRnDat aSTB AI N+

扩展接口

151617

1234567891011121314

1819202122232425262728293031323334

AGNDAI 7AI 6AI 5AI 4AI 3AI 2F0FX+12V- 12VAGNDVCCGNDI NTERRUPT

GND74LS245

A7

. . . . . . . . .

.

.

.

.

D7

键盘、点阵实验扩展板 ,原理框图如下:ED0 . . .ED7

ABCE1E2

Y0

Y7E3

74LS138

ABCE1E2

Y0

Y7E3

74LS138

D1

D8CLRCLK

Q1Q2Q3Q4

Q8

74LS273

.

.

.

.

.

.

.

VCC

Q1~Q3

Q1~Q3

Q4

VCC

ED0~ ED7

ABC

E1E2E3

Y0Y1Y2Y3Y4Y5Y6Y7

Y0

Y1Y2Y3 Y7

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

D1

D8

CLK

Q1Q2Q3Q4Q5Q6Q7Q8

74LS273

2Y4...

2Y11Y4.

.

.

1Y1

2A4...

2A11A4.

.

.

1A1

2G1G

74LS244

.

.

.

.

.

.

键盘矩阵的行

键盘矩阵的列

ED0~ ED2

ED0~ ED7

CLRVCC

A0A1A2

nDat aSTB

VCC1Y71Y6RDWR

GND

2803

VCC

Q1

Q8

D1

D8

Q1~Q8D1

D8CLRCLK

Q1

Q8

74LS273......

VCC

GND

2803

VCC

Q1

Q8

D1

D8

Q1~Q8D1

D8CLRCLK

Q1

Q8

74LS273......

VCC

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

VCC

VCC

ED0~ ED7

.

.

.

.

.

ED0~ED7

Q4

74LS138

16*16点阵前八行

16*16点阵后八行

16*16点阵左边八列

16*16点阵右边八列

串口实验扩展板 ,原理框图如下:ED0 . . .ED7

D0...

D7

CS0CS1CS2

I NTR

XTAL1 晶振源

CTSRTS

T2i n

T1i n

R2out

R1out

T2out

T1out

R2i n

R1i n

DTR

SOUT

DSR

SI N

BAUDOUTRCLK

A0A1A2

1A

1EN1Y

VCC

输出

电路OUT2OUT1

1Y7A0A1A2

DI STRDOSTR

RDWR

RLSD

DOSTRDI STR

ADS

MR复位

电路1Y6

I nt er r upt

实验箱

配备的

串口

通讯线

DTR

TXD

DSR

RXD

ED0 ~ ED7

TC232

8250

端口地址 为了方便同学们的在实验中更快,更方便的找到实验板上各个芯片的端口地址,在实验指导书上详细列出了各个端口的地址及其简要的功能描叙。

头文件 在本实验指导书的附录里,列举了部分实验的参考源程序,以便同学们在学习的过程中参考。为了使程序更简化、直观,将常用的地址端口和函数定义成头文件的形式,其头文件有: ① paddr.h 对实验板内地址进行了宏定义。 ② eppinit.h EPP 接口初始化。 ③ epprw.h EPP 端口的读 / 写。 ④ displed.h LED 数字显示函数。

实验一 EPP 接口驱动 LED 显示 实验目的1 .熟悉 EPP 接口的输入 / 输出及读 / 写操作。2 .掌握七段 LED 显示驱动原理及接口方法。3 .熟悉 C 语言。

实验任务 1 .分析实验主板电路,指出输入 / 输出口地址。 2 .编写 LED 显示程序,使实验主板上的四个 LED 显示任意四位数字和任意一位的小数点,并通过调试。

实验原理 ▼ LED 显示器原理 7 段 LED 显示器的结构和 8 位字节数的对应关系如下图:

ab

cd

e

f g

h

h g f e d c b aD7 . . . . . . . . . . . . . . . D 0

1=亮; 0=灭(共阴极)1=灭; 0=亮(共阳极)

(每一位相同)

▼ LED 显示实验电路 实验箱主板上带有的四位 LED 显示器采用四片 CD4511( BCD -七段锁存译码器)来驱动 。其原理图如下:

D4~D72Y32Y02Y1 2Y1 2Y0

D4~D7D0~D3 D0~D3 D0~D3

74LS273

D0~D7

CD4511 CD4511 CD4511 CD4511

▼ 4 位 LED 显示的端口操作为: D7 D 6 D 5 D4 D3 D 2 D 1 D0

2Y1

第四位小数点亮;1=亮; 0=灭

第一位小数点亮;1=亮;0=灭第二位小数点亮;1=亮; 0=灭

第三位小数点; 1=亮;0=灭

D7 D 6 D 5 D4 D3 D 2 D 1 D0

2Y0

D 7 D 6 D5 D 4 D 3 D2 D 1 D0

2Y3

第一位 第二位

第三位 第四位

8 4 2 1

本实验共用到的端口地址及其功能介绍00H( 2Y0 ):输出口,用作后两位显示译码驱动器

4511 的锁存使能信号。01H( 2Y1 ):输出口 , 用作前两位显示译码驱动器

4511 的锁存使能信号。03H ( 2Y3 ) : 输 出 口 , 用 作 4 位 小 数 点 锁 存 器

74LS273 的 控制 CLK 信号。

编程与调试 ▼ 程序说明 该程序设计功能为: ① 先从最高位开始依次显示 1 , 2 , 3 , 4 ,显示时只有一位显示,其它位熄灭。 ② 从高到低轮流点亮小数点。 ③依次显示 0000, 1111, 2222, 3333 , ...... 一直到 9999 。

▼ 编程思路 开始

EPP初始化

结束

LED显示数字

▼ 编程步骤 ① 调用自定义头文件 #include "paddr.h" #include "epprw.h" #include "displed.h" #include "eppinit.h "② EPP 端口初始化 epp_init(); ③ LED 的数字显示 在 LED 上显示某个数,只要在对应的字节上写入这个数即可,例如:要在第二位 LED 上显示 1 ,第一位 LED 上显示 5 ,只要先向 EPP 地址端口写入这两位的地址 0x00(D_LED ) ,再向 EPP 数据端口写入相应的数据。 epp_write_data(D_LED, 0x15);如果想要熄灭某个 LED ,只要在相应的位上写入 10到 15 的任意一个数。程序中利用此方法循环点亮 LED 。

思考和练习题 1. 若不对 EPP 接口进行初始化,会发生什么现象?为什么?2. 编写循环点亮四位小数点的程序。 3. 可以同时点亮四位的小数点吗?如果可以,应怎样设置其端口控制字?

实验二 8255 并行接口原理及编程 实验目的 1. 熟悉 8255 内部结构和外部引脚定义。 2. 熟悉 8255 并行接口的原理和接口方法。 3. 掌握 8255 的简单应用编程。

实验任务 1 .编写出 8255 的初始化程序。 2 .编写出循环控制发光二极管的显示程序,并运行通过 3 .编写出交通灯控制模拟程序。 4 .理清 8255 的一些与实验板上其他芯片相连接的 I/O 端口电路。 5 .掌握对 8255PC 口的位操作。

实验原理 ▼ 8255工作原理 8255有 8 条数据引脚 D0~D7 ,它们全部是双向、三态,用来与数据总线相连接;另外,还有 6 条输入控制引脚,分别是: ① RESET: 复位输入信号,高电平有效。当 RESET 有效时,将梭鱼哦内部寄存器,包括控 制 寄 存 器清零,而且把 A 、 B 、 C 三个都设 为 输 入 方 式 , 对 应 的 PA7 ~

PA0、 PB7~PB0、 PC7~ PC0 引脚均为高阻态。 ② CS :芯片选中信号,输入低电平有效。只有当它为低电平时 ,8255才被 CPU选中。 ③ A0和 A1 :芯片内部寄存器的选中信号。当有效时, 8255被选中,再由 A0、 A1的编码决定选中通道A 、 B、 C ,还是控制寄存器。 ④ RD :读信号。输入低电平有效。当它为低电平时,由 CPU 读出 8255 的数据或者状态信息。 ⑤ WR :写信号。输入低电平有效当它为低电平时,由 CPU 将数据或命令写到 8255 。CS、 A0、 A1、WR 、五根引脚的电平与 8255 操作的关系,详见下表

8255 通道选择和基本操作表

A 1 A 0 RD WR CS 操 作

0

0

1

0

1

0

0

0

0

1

1

1

0

0

0

A 口 数据总线

B 口 数据总线

C 口 数据总线

输入

0

0

1

1

0

1

0

1

1

1

1

1

0

0

0

0

0

0

0

0

数据总线 A 口

数据总线 B 口

数据总线 C 口

数据总线 控制寄存器

输出

×1×

×1×

×01

×11

100

端口输出为 “ 高阻 ”非法

端口输出为 “ 高阻 ”

禁止

▼ 8255 控制字 ① 8255 方式选择控制字

1 D 6 D 5 D4 D 3 D2 D1 D0

方式选择控制字的标志位

A组方式选择00-方式 001-方式 11X-方式 2 通道 A:

00-输入 11-输出

PC3~ PC0 : 1-输入0-输出

通道B: 1-输入0-输出

B组方式选择: 0-方式 01-方式 1

PC7 ~ PC4 : 1-输入0-输出方式 0―― 基本输入 / 输出

方式 1――选通输入 / 输出方式 2―― 双向数据传送

② 8255按位置位 /复位的控制字 通道 C 的每一位都可以通过向控制寄存器写入置位 /复位控制字,而使它相应位置位(即输出为 1 )或复位(即输出为 0 )。通道 C置位、复位控制字的具体格式下图所示。

0 D6 D5 D4 D 3 D2 D 1 D0

按位置位 /复位标志

1=置 1 0=复位

未用

C口01234567

D101010101

D200110011

D300001111

▼ 实验电路图 PA0

PA7PB0

PB7

PC0PC1PC2PC3PC4PC5PC6PC7

D0D1D2D3D4D5D6D7RD

WR

A0A1RESET

CS

VCC

VCC

7109( STATUS)8253( CLK0)7109( RUN/ HOLD)

0809( EOC)8253( OUT1)

RDWR

A0A1

1Y1

VCC

D0. . . D7

▼ 本实验用到的端口地址:23H( 1Y1 ):输出口, 8255 的控制端口20H( 1Y1 ):输出口, 8255 端口 A 的地址21H ( 1Y1 ):输入口, 8255B 端口 B 的地址22H( 1Y1 ):输入 / 输出口, 8255 端口 C的地址

编程与调试(一)交通灯实验1 .程序说明 通过对 8255的 A 口读 / 写命令,来循环点亮与 A 口相 连接的红、黄、绿三个发光二级管。在点亮的过程中, 同时在 LED 上显示时间,从 60秒开始倒计时, 60秒到

6 秒红灯亮, 5 秒到 1 秒黄灯亮,然后再从从 60秒开始倒 计时, 60秒到 6 秒绿灯亮, 5 秒到 1 秒黄灯亮。依次循环。

2 .编程思路

初始化8255

EPP初始化

开始

结束

Y

N

点亮红色指示灯(E5 55秒)

点亮绿色指示灯(E5 55秒)

点亮黄色指示灯( E5 5秒)

点亮黄色指示灯( E5 5秒)

循环是否结束?

3 .编程步骤 ① 调用自定义头文件(同上实验一)。 ② EPP 端口初始化(同上实验一)。 ③ 初始化 8255 。 在本实验中设计为方式 0 、 A口输出、 B口输入,故向控制寄存器写入的数据为 0x82 。在交通灯的实验中,我们就用到 A口的输出。 8255的片选由 1Y1 来控制,其控制寄存器的地址为 0x23( CW_8255 )。 epp_write_data(CW_8255,0x82); ④ 向 8255的 A口写数据。 由指示灯的硬件电路可知,与其相连的端口输出为低电平,指示灯亮;输出为高电平,指示灯灭。 在本实验中我们要依次点亮红色、黄色、绿色、黄色。 epp_write_data(PA_8255, 0xfe); /* 点亮红色指示灯 */ delay(10000); /*延时 */ epp_write_data(PA_8255, 0xfd); /* 点亮黄色指示灯 */ delay(10000); epp_write_data(PA_8255, 0xfb); /* 点亮绿色指示灯 */ delay(10000); epp_write_data(PA_8255, 0xfd); /* 点亮黄色指示灯 */

⑤ 点亮实验板上的 LED 。 在点亮指示灯的同时,要在 LED 上显示点亮时间,这个数字显示程序可直接调用上面介绍过的 LED 数字显示程序。 epp_write_data(PA_8255, 0xfe); /* 点亮红色指示灯 */ for( i=60;i>5;i-- ) /* 点亮时间 55秒 */ { displed(i,0); /* 调用 LED 数字显示函数 */ for( j=0;j<100;j++ )

delay(1000); if(kbhit()) exit(0);

}

4 .源程序清单 参考指导书附录 I-2 。

(二) A 、 B并行口实验1 .程序说明 该程序为通过操作与 8255 的 B 口相连的开关键,来控制与

8255的 A口相连的发光二极管的亮和灭。2 .编程思路

启动 8255

读 B口输入量

EPP初始化

开始

数据处理

结果输出到 A口

结束

是否退出?

Y

N

3 .编程步骤① 调用自定义头文件(同上)。② EPP 端口初始化(同上)。③ 初始化 8255 (同上)。④ 读取 8255的 B端口的数据 与 8255的 B端口相连接的是 8 个开关控制器,通过操作这些开关可以使与其相连的 B端口呈现高电平“ 1”或者低电平“ 0” 。 epp_read_data(PB_8255, &data); ⑤ 向 A 端口写数据 epp_write_data(PA_8255, data)

4 .源程序清单 参考实验指导书附录 I-3 。

思考和练习 1 .交通灯实验中如何同时点亮多个指示灯。2. 能否从 A 口输出 C 口的获取量。3 .在不同的工作方式下,考虑 I/O 口的外设连接。

实验三 8253 计数器原理及分频实验 实验目的1. 熟悉 8253 定时器 / 计数器的功能及接口方法。2. 熟悉 8253 的分频原理。 3. 掌握 8253 的分频应用编程。

实验任务 1 .分析本实验主板上 8253 的硬件电路原理。 2 .熟悉 8253 的工作原理后,编写出 8253的 初始化程序。 3 .编写出 8253 分频程序,观察实验显现。

实验原理 ▼ 8253 的引脚 8253有 3 个独立的 16 位减计器通道,每一个通道有三条引线: CLK、 GATE和 OUT 。 ① CLK: 输入时钟, 8253规定,加在 CLK 引脚的输入时钟周期不能小于 380ns 。 ② GATE :门控信号输入引脚。这是控制计数器工作的一个外部信号。当 GATE 引脚为低时,通常都是禁止计数器工作的;只有

GATE为高时,才允许计数器工作。 ③ OUT :输出引脚。当计数到“ 0” 时, OUT 引脚上必然有输出,输出信号波形取决于工作方式。

8253 内部端口的选择及每个通道的读 / 写操作的选择如下表所示

RD WR A1 A0 寄存器选择和操作

1 0 0 0 写入计数器 01 0 0 1 写入计数器 11 0 1 0 写入计数器 21 0 1 1 写入控制寄存器

0 1 0 0 读计数器 00 1 0 1 读计数器 10 1 1 0 读计数器 20 1 1 1 无操作( 3态)

▼ 8253 的端口控制子D7 D6 D5 D4 D3 D2 D1 D0

00 选择计数器 001 选择计数器 110 选择计数器 211 非法选择

00 计数器锁存命令01 只读 /写最高有效字节 (高 8位)10 只读 /写最低有效字节 (低 8位)11 先写最低有效字节 再写最高有效字节

000 方式 0001 方式 1x10 方式 2x11 方式 3100 方式 4101 方式 5

0 二进制1 BCD

▼ 8253 的工作方式和输出波形 方

式功能 输出波形

0 计完最后一个数中断 写入计数值 N后,经过 N+1 个 CLK脉冲输出变高1 硬件再触发单拍脉冲 单拍脉冲的宽度为 N个 CLK脉冲2 速率发生器 每 N个 CLK脉冲,输出一个宽度为 CLK周期的脉冲

3 方波速率发生器 写入N后,输出1/ 2N个CLK高电平 , 1/ 2N个CLK低电平 ( N为偶数 )

( N+1) / 2个CLK高电平 , ( N- 1) / 2N个CLK低电平 ( N为奇数 ){4 软件触发选通 写入 N后,过 N+1 个 CLK,输出一个宽度为 1个 CLK的脉冲5 硬件触发选通 门控触发后,过 N+1个 CLK,输出一个宽度为 1个 CLK的脉冲

▼ 实验电路组成原理框图

OUT0GATE0CLK0

OUT1GATE1CLK1

OUT2GATE2CLK2

CSRDWR

A0A1

1110

9

131415

1617

18

2M H Z

f x

212223

2019

D SD

CDCLK

Q

Q

Vcc

D0. . . . D7

1Y5RDWR

A0A1

Vcc

PC3

AO2FX自激振荡

(自D/ A输出 )(外部输入TTL)

(实验主板振荡电路)

指示灯电路

D0

D7Vcc

Vcc

Vcc

▼ 本实验共用到六个端口地址:23H( 1Y1 ): 输出口, 8255 的控制端口22H( 1Y1 ): 输出端口( PC3 ),发出计数器 0 的闸门信 号( 0 为关, 1 为开)A0H( 1Y5 ): 输入 / 输出端口, 8253 计数器 0 的读写口A1H( 1Y5 ): 输入 / 输出端口, 8253 计数器 1 的读写口A3H( 1Y5 ): 输出端口, 8253 的控制寄存器的端口

编程与调试1. 程序说明 对 8253 的计数器 0 和 1 写入初值,使计数器 1 输出一定频率的方波,从而使得与计数器 1 输出端相连接的指示灯循环亮和灭。 2. 编程思路 开始

EPP初始化

8255初始化

8253初始化

8255的 PC3口置 1

结束

3. 编程步骤① 调用自定义头文件(同上实验一)。② EPP 端口初始化(同上实验一)。③ 初始化 8255 。 8255 的控制字应该定义 C 口的低位为输出口,工作方式为方式 0 。 epp_write_data(CW_8255,0x8a); ④ PC3 口置“ 0” ,阻止脉冲输入。 初始化 8253 前,要阻止脉冲输入,就要向 PC3 口置 0 , 8255的 C口的各个端口可以直接置位和复位。 epp_write_data(CW_8255,0x06);⑤ 初始化 8253 。 8253 的计数器 0 、计数器 1 ,工作方式分别为方式 2 和方式 3 ,都是先写低字节再写高字节和 BCD 码计数。向计数器 0 置入初值是 1000 ,向计数器 1 置入的初值也是 1000 。

/*8253的 0 口初始化,写 1000 进去 */epp_write_data(CW_8253,0x35); epp_write_data(CT0_8253,0x00);epp_write_data(CT0_8253,0x10);

 / *8253的 1 口初始化,设置时间为 1s*/epp_write_data(CW_8253,0x77); epp_write_data(CT1_8253,0x00);epp_write_data(CT1_8253,0x10); ⑥ PC3 置“ 1” ,允许脉冲输入。epp_write_data(CW_8255,0X07);

4. 源程序清单 参考实验指导书附录 I-4 。

思考和练习题 1 .向计数器 0 和计数器 1 写入不通的值,指示灯 会出现什么现象?2 .计数器 0 和 1 采用不同的工作方式,指示灯有 什么现象。3 . 8253 的初始化要在一个脉冲的作用下才能完 成,这对实验中计数器输出信号的频率有没 有影响?

实验四 8253 计数器在测频中的应用 实验目的 1 .了解频率测量原理。 2. 掌握 8253 的应用编程。 实验任务 1. 进一步理解 8253 的硬件电路原理。 2.根据测频原理,编写出 8253 的测频程序,并运行通

过。

实验原理 ▼ 频率测量原理 所谓“频率”,就是周期性信号在单位时间变化的次数。若在一定时间间隔 T 内,计得这个周期信号得重复变化次数为 N,则其频率可表达为: f= N/T 。电子计数器就是严格按照该定义进行测频得。其原理方框图和工作时间波形下图所示。 脉冲

形成电路闸门 电子计数器

门控电路

时基信号发生器

1 2 5

43

Fx

时基 T

1

2

3

4

5

▼ 8253 的工作原理。▼自激振荡电路

R2 R1 Rw

Cf

图中将滑动变阻器 Rw左边的阻值设为 Rx,令 R=Rx+ R1 。 当 R=R2时 ,

当 R<<R2时,

本实验主板上设计的是第二种情况,通过调节滑动变阻器 Rw 可获得不同频率的信号源。

▼ 电路原理OUT0

GATE0CLK0

OUT1GATE1CLK1

OUT2GATE2CLK2

CSRDWR

A0A1

1110

9

131415

1617

18

2M H Z

f x

212223

2019

D SD

CDCLK

Q

Q

Vcc

D0. . . . D7

1Y5RDWR

A0A1

Vcc

PC3

AO2FX自激振荡

(自D/ A输出 )(外部输入TTL)

(实验主板振荡电路)

指示灯电路

D0

D7Vcc

Vcc

Vcc

① 输入单元:输入的待测信号 fx 有以下三种来源: a. AO2 是自 D/A0832 (程控信号源)输出的信号,详见实验六。 b. FX 是外界直接输入的信号。 c. 实验主板上自带的振荡电路源。 ② 计数部分 : 被测频率信号由 8253 的计数器 2 计数

③ 时基信号产生与变换单元④ 逻辑控制单元开门信号由 8255的 PC3 控制。计数器 0 的输出( OUT0 )和计数器 1 的时钟( CLK1 )直接相连,计数器 1 的 OUT1 通过反相器,控制计数器 2 的 CLK2 的信号输入,完成硬件方面的控制。实验波形如下图 4 所示(计数器 0 、 1 、 2 的工作方式依次为方式 2 、 0 、 2 ,闸门信号全部为高)

PC 3

C LK 0

O U T0(CLK1)

O U T1

C LK 2

▼闸门时间 在本实验中初始化 8253 时,设定计数器 0 、 1 、 2 的工作方式分别为 0方式 2 、 0 、 2 ,向计数器 0 、 1 、 2 中置入的数据一次为为 N0、

N1、 N2 。定义计数器 0 的时钟输入频率为 F。闸门( PC3 )打开后,信号 F进入计数器 0 ,计数器 0 工作在方式 2 经 N0 分频后输出的波形信号频率 f0 为:

( 1)计数器 0 输出的频率为 f0 的信号作为计数器 1 时钟信号( CLK1 ),计数器 1 工作在方式 0 ,经 N1 分频后输出的波形信号频率 f1 为:

由式( 1 )、( 2 )得: ( 2 )

( 3 )

计数器 1 输出的频率为 f1 的信号作为被测信号 fx 的门控信号,则信号f1 的周期即为闸门时间 T ,由式( 3 )得: ( 4 )

本实验共用到六个端口地址: 23H( 1Y1 ):输出端口, 8255 的控制端口 22H( 1Y1 ):输出端口( PC3 ),发出计数器 0 的闸门信号( 0 为关, 1为开) 输入端口( PC6 ),读取计数器 2 的闸门信号( 0 为开, 1 为关) A3H( 1Y5 ):输出端口, 8253 计数器的控制寄存器的端口 A0H( 1Y5 ):输入 / 输出端口, 8253 计数器 0 的读写口 A1H( 1Y5 ):输入 / 输出端口, 8253 计数器 1 的读写口 A2H( 1Y5 ):输入 / 输出端口 ,8253 计数器 2 的读写口

编程步骤1. 程序说明 本程序是利用 8253 计数器,实现对未知频率信号的测频。实验过程中 , 可 以 通过探测 点 TP9 、 TP10 、 TP11 分别查看计数 器0 、 1 、 2 的输出情况,通过测试点 TP12 、 TP13 测量经过 74LS74 输出的

1Mhz 、5KHz 的波形信号。2. 编程思路

开始

初始化EPP、 8255、 8253初始化

8255的 PC3口置 1

读取门控( PC6)输出值gat e

gat e&40H=0?

读取计数器 2的值

将计数值转化为频率值

结束

Y

4. 编程步骤① 调用自定义头文件(同上实验一)。② EPP 端口初始化(同上实验一)。③ 初始化 8255 。epp_write_data(CW_8255,0x8a); /*8255 写控制字 */ ④ PC3置 0 ,阻值脉冲输入(同实验三)。⑤ 初始化 8253 。/*8253的 0 口初始化,写 1000 进去 */epp_weite_data(CW_8253,0x35); epp_weite_data(CT0_8253,0x00);epp_weite_data(CT0_8253,0x01);/*8253的 1 口初始化,设置时间为 1s*/epp_weite_data(CW_8253,0x71); epp_weite_data(CT1_8253,0x00);epp_weite_data(CT1_8253,0x10);/*8253的 2 口初始化,写 ff 进去 */ epp_weite_data(CW_8253,0xb4); epp_weite_data(CT2_8253,0xff);epp_weite_data(CT2_8253,0xff);

⑥ PC3置 1 ,允许脉冲输入(同实验三)⑦ 读取计数器 1 的输出量( PC6 )。do{ epp_read_data(PC_8255,&gate); /*读 PC6 的值 */ gate=gate&0xf0; gate=gate&0x40; }⑧ 读取计数器 2 寄存器内的值。 epp_weite_data(CW_8253,0x80); /* 锁存计数器通道 2*/epp_weite_data(CW_8253,0xb0); /* 先低字节后高字节 */epp_read_data(CT2_8255,&word.byte[0]);/* 读计数器 2 的低 8 位 */epp_read_data(CT2_8255,&word.byte[1]);/* 读计数器 2 的高 8 位 */⑨ 在 LED 上显示测得的频率。 freq=n/t; /* 将读数转化为频率值 */displed(freq,0x00); /* 在实验主板上显示测频结果 */

4. 源程序清单 参考实验指导书附录 I-5 。 ▼思考和练习题1 .为什么计数器 1 要工作在方式 0 能否工作在其余的工作 方式下?2 .图中计数器 1 和计数器 0 级联,计数器 1 是对计数器 0的 溢出计数,其目的是什么?3 .不通的闸门时间对测频结果是否有影响?如何影响?4 . 8253 的初始化要在一个脉冲的作用下才能完成,这对 用软件打开闸门的测频结果有什么影响?应该怎样降 低这种影响?

实验五 双积分式 A/D 转换器 7109 的原理及应用 实验目的1. 熟悉双积分式 A/D 转换器 7109 的工作原理和外围接口设计。 2.深化理解双积分 A/D 转换器及数字电压表的工作原理。 3. 了解双积分式 A/D 转换器 7109 的简单应用程序。4. 掌握利用 A/D 转换器进行电压测量的基本方法。

实验任务1. 编写利用 A/D 转换器进行电压测量的程序,并通过运行。2. 分析测量数据的误差及其来源。

工作原理 ▼ 其主要端口端定义如下:( 1) B1~ B12: 12bit 的数据输出端( 2)OR :溢出判别,输出高电平表示过量程;反之,数据有效。( 3) POL :极性判别,输出高电平表示测量值为正值;反之,负值。( 4)MODE :方式选择, 当输入低电平信号时,转换器处于直接输出工作方式。此时可在片选和字节使能的控制下直接读取数据;当输入高电平时,转换器将在信号信号握手方式的每一转换周期的结尾输出数据(本实验选用直接输出工作方式)。( 5) REF :外部参考电压输入(本实验用其典型值: 2.048V )。( 6) INL,INH: 输入电压端口(有效范围是参考电压的 2 倍)。( 7)OO,OI: 外部时钟输入(本实验用其典型值: 3.579MHz )。( 8 ) RUN/ :运行 /保持输入 , 当输入高电平时 , 每经 8192 时钟脉冲完成一次转换;当输入低电平时,完成正在进行的转换,并停在自动调零阶段( 9 ) STATUS :状态输出,输出高电平,表明芯片处于积分和反向积分阶段;输出为低电平,表明反向积分结束,数据被锁存,模拟部分处于自动返回零态阶段。

( 10) CE/ :片选,当其为低电平时,数据正常输出;当其为高电平时,所有数据输出端( B1~ B12、 POL、 OR )均处于高阻状态。( 11) LBEN :低字节使能,输出低电平时,数据线输出低位字节 B1~

B8 。( 12) HBEN :高字节使能,输出低电平时,数据线输出当高位字节 B9 ~ B12以及 POL、 OR 的状态值。▼ A/D 转换时序( ICL7109 直接接口方式)

数据有效

RUN/ HOLDSTATUS

高位字节

低位字节

HBEN

LBEN

CE/ LOAD

数据有效

▼ 测量放大电路 +-

-+

+- × 1 × 10

R47 R49

R 51

R 52

R 50R46

V O

V i

选择电阻以确定放大倍数

× 100× 200× 300

R 54

R 69

R 70

R71

如图选择不通电阻其增益分别为:① 引脚“ ×1” 脚断开,增益选择为 1 倍。② 引脚“ ×1” 和“ ×10”相连,增益为 10倍;③ 引脚“ ×1” 和“ ×100”相连,增益为 100倍;④ 引脚“ ×1” 和“ ×200”相连,增益为 200倍;⑤ 引脚“×1”和“×300”相连,增益为 300倍;

▼ A/D 转换器 7109 实验原理图

REF

I NHI NL

MODE

STATUSCE/ LOAD

ORPOL

B9

B12

B1

B8D0

D7

1Y1( PC2)1Y1( PC4)

RD1Y41Y3

I CL 7109

.

.

.

........

测量放大电路

V+

V-

OI

OO

+5V

- 5V2.048V基准电压

0~ 4. 096V

× 2 运放

26

2

20

18

19

40

28

35

34

21

22

23

36

3. 579MHz

RUN/ HOLD

LBENHBEN

跳线选择被测电压

AI N+

D0. . . . D7

D0. . . . D5

▼ 数据及控制信号接口

POL OR B11 B10 B9 B8

A/ D转换结果的高 4位数据

2Y5=01H

1=测量结果为正0=测量结果为负

1=溢出0=结果有效

D7 D6 D5 D4 D3 D2 D1 D0B7 B6 B5 B4 B3 B2 B1 B0

A/ D转换结果的低8位数据

2Y6=02H

1=正在转换; 0=转换结束

2Y4=00H IN 0

2Y3=03H O UT2 O U T1 O UT0

1=启动 71090=停止7109 00=0通道(板载可调电压)

01=1通道(固定2. 048V电压)10=2通道(外接电压)11=3通道(地)

本实验共用到五个端口:80H( 1Y4 ):输出口, 7109低位字节输出口。60H( 1Y3 ):输出口, 7109高位字节输出口。 22H( 1Y1 ):输入 / 输出端口 ,D2 控制 7109起停( R/H ), D4 位读取 7109 的状态( STATUS )信号( 1 正 在转换; 0 转换完毕)。23H( 1Y1 ):输出口, 8255 的控制端口 校准测量原理 参见实验指导书。

编程与调试1. 程序说明 本程序是利用实验主板上的 7109A/D 测量输入电压,输入电压有

4种选择,测量前必须将输入电压端口的跳线选择到需要测量的那个端 口 。 增 益 也 有 五 种 选 择(╳ 1 ,╳ 10 ,╳ 100 ,╳ 200 ,╳ 300 ),可根据实验需要选择某一档,并将其跳线连接好。实验测得的电压值同时在 PC 机的 CRT 和实验主板内的 LED 上显示出来。 实验过程中,可以通过测试点 TP2查看 7109 的工作状态,通过探测点 TP3查看 7109 芯片的启动状态。

2. 编程思路 开始

结束

N

初始化 EPP接口

启动 A/ D转换

转换结束 ?

Y停止 A/ D转换

读取高位字节并暂存

读取低位字节并暂存

提取高位字节的OR, POL

溢出否 ?N

Y

输入为负 ?N

Y

屏蔽高四位

送显示器和 LED

置溢出标志

屏蔽高四位

置负数符号

硬件选择增益和输入端

初始化 8255

3. 编程步骤 1 .调用自定义头文件(同上实验一)。2 . EPP 接口初始化(同上实验一)。3 .初始化 8255 (同上实验二)。epp_write_data(CW_8255, 0x8a); /* 初始化 8255*/4 . PC2 置“ 1” 。8255 的端口 PC2 与芯片 7109 的启动端口 () 直接相连,将 PC2 置“ 1” ,则启动芯片 7109让它开始工作。epp_write_data(CW_8255,0x05);/*PC2置 1 ,启动芯片 7109 的转换 */ 5 .读 PC4 的状态。 do{ epp_read_data(PC_8255,&state);/* 读取转化状态量,端口 PC4 口 */ state=state&0x10; }while(state==1 ); /*判断 status值:为 1 正在转换;为 0 转换完 */

6 . PC2 置“ 0” 。epp_write_data(CW_8255,0x04); /*PC2置 0 , R/=停止转换 */ 7 .读取 7109 转换完毕的数字量,并将其转化成电压值。 epp_read_data(H_7109,&high); /* 读出高位字节 */ epp_read_data(L_7109,&low); /* 读出低位字节 */ v=(high&0x0f)*256+low; 8 .判断极性和溢出if(high&0x10) /*判断溢出位,若溢出则发出警告提示 */printf("WARNING:the input volt is over!\n");if(!(high&0x20)) /*判断符号位 , 显示屏输出 */

printf("- %.3f\n",v);9 .电压值显示在实验主板内的 LED 上。

源程序清单 参考实验指导书附录 I-6 。

思考和练习题1. 双斜积分式 A/D 转换器 7109 芯片包括哪几个工作过程?2. 7109 的输入参考电压对 A/D 转换结果有何影响?如 A/D 转换结果 偏大,应如何调节参考电压?3. 记录 10 组对 2.048V 的标准电压由 7109A/D 转换结果。如测量结果 偏大,可能是什么原因造成的?4. 若输入电压的范围是 0 ~±204.8mV ,则参考电压应调节在多大? 此时电压测量的分辨率是多大?5 .根据校准原理,试用校准方法测量( AIN+ )输入的被测电压,并 显示结果。

实验六 逐次比较式 A/D 转换器0809 的原理及编程

实验目的1. 熟悉逐次逼近式 A/D 转换器芯片的工作原理。 2. 了解 A/D 转换芯片 0809 的接口设计方法。 3. 掌握 A/D 转换器 0809 简单的应用编程。 实验任务 1. 分析本实验板的电路原理。 2. 编写出逐次逼近式 A/D 转换器芯片 0809 的转换与显示的控制 程序,测量通道 0-7 的输入的信号。

实验原理 ▼ 0809工作原理 ADC0809是 8 路输入的 8 位逐次逼近 A/D 转换器,其转换时间为 16 个外部时钟周期。其主要端口端定义如下:① IN7~ IN0 :八个模拟量输入端。② D7~D0 :数字量输出端。③ ENABLE :输出允许信号。当此信号被选中时,允许从 A/D 转换器的锁存器中读取数字量。高电平有效。④ START :启动 A/D 转换,当 START 为高电平时, A/D 转换开始。⑤ ALE :地址锁存允许,高电平有效。当 ALE 为高电平时,允许 C、 B、 A 所示的通道被选中,并把该通道的模拟量接入 A/D 转换器。⑥ EOC :转换结束信号。当 A/D 转换结束后,发出一个正脉冲,表示 A/D 转换完毕。此信号可用作 A/D 转换是否完成的检测信号。⑦ ADDA、 ADDB、 ADDC :通道号选择端, C 为最高位, A为最低位。 ⑧ CLOCK :外部时钟(本实验采用 500KHz 的时钟频率)。 ⑨ Vref(+ ), Vref(- ):参考电压端,用来提供 D/A 转换器权电阻的标准电平(本实验采用典型值: Vref(+ )=+ 5V, Vref(- )=0V )。

▼ A/D 转换时序 ALE

地址总线 稳定

模拟输入

STARTEOC

DATAOUTPUT ENEBLE

稳定

输出允许

▼ 被测电压与 A/D 转换结果关系

式中 : Vin —— 0809A/D 转换器输入电压。 NADC —— 0809A/D 转换结果的 8bit 数字量; Vr —— 0809A/D 转换器外部参考输入电压, Vr= 5.00V;

▼ 数据及控制信号接口

1Y1=22H PC5

D7 D6 D5 D4 D3 D2 D1 D0

0809地址与通道的对应关系

× × × × × × × ×1Y2=40H~ 5FH

40H: 0通道; 43H: 3通道; 46H: 6通道;41H: 1通道; 44H: 4通道; 47H: 7通道;42H: 2通道; 45H: 5通道;

0=转换结束1=正在转换;

▼ A/D 转换器 0809 实验电路图

ADC0809

AO1AI 2

AI 6AI 7

AI 3AI 4AI 5

D0. . . D7

25

2423

ADDAADDBADDC

EOC7

A0A1A2

1Y1( PC5)

D0

D7:

10

12

11

16

13

500kHz

Vr 5V( 5. 00V)VCC

I N2I N1I N0

I N3I N4I N5I N6I N7

CLOCK

VREF( - )

VCC

VREF( +)

GND

ALESTARTENEBLE9

6

221Y2

RD

WR

测量放大电路

2. 048V基准电压

0~ 4. 096V

× 2 运放

跳线选择被测电压

AI N+

本实验共用到三个端口:40H~ 47H( 1Y2 ):输入 / 输出端口, 0809 的地址,控制 字任意。 23H( 1Y1 ):输出端口, 8255 的控制端口。 22H( 1Y1 ):输入端口,查询 0809 转换状态信号(“ 0” 正 在转换;“ 1” 转换完毕)。

编程与调试 (一) 0 通道测量电压 1 .程序说明 输入电压有 4 种选择,测量前,在实验主板上必须将跳线选择到需要测量的那个端口。增益也有五种选择(╳ 1 ,╳ 10 ,╳ 100 ,╳ 200 ,╳ 300 ),可根据实验需要选择一档,并在实验板上将其跳线连好。实验测得的电压值显示在 PC 机的 CRT 和实验主板的 LED 上。2 .编程思路

启动 ADC0809

读取 EOC状态值

读取 ADC0809输出值

开始

结束

EOC=1? N

Y

送CRT、 LED显示

EPP接口、 8255初始化

3 .编程步骤① 调用自定义头文件。② EPP 端口初始化。③ 初始化 8255 。epp_write_data(CW_8255, 0x8a); ④ 启动芯片 0809 。epp_write_data(AD_0809,0x00); /*启动 0809 进行转换 */⑤ 读取转换状态量 void eoc(void) { unsigned char status; do /*读 8255的 pc5 的值,为 1 时转换完毕 */ { epp_read_data(PC_8255,&status); status=status&0x20; }while( status==0 ); /* 状态为 0 时,继续读取状态转换量 */}

⑥ 读取 A/D 转换完毕的数字量,放入 firstdata 中。epp_read_data(AD_0809,&firstdata); /* 读转换完毕的数字量 */firstdata=firstdata&0xff; ⑦ 将读取的数据转换成电压值 V 。

v=(double) firstdata*5/255; ⑧ 在 LED 上的显示被测电压值。

4 .源程序清单 参考实验指导书附录 I-7 。

(二)测量 1 ~ 7 通道电压 测量 1 ~ 7 通道电压的编程思路和测量 0 通道的输入电压一样,所不通的只是要根据信号的输入通道来确定其输入端口的地址,通道不同其端口地址也不同。下面就仅介绍如何获取通道地址,其余部分参见上面的 0 通道测量电压实验。 程序的开始要输入当前实验所采用的输入通道( cha ),如: printf("Please input the channel which you will measure(int 1--7) :"); scanf("%d",&cha);/* 输入值是被测信号输入的那个通道 */ 芯片 0809 的基地址为: 0x40( AD_0809 ),选择通道后,该通道的地址就为: 0x40+ cha( AD_0809+ cha )。即程序中对端口地址的读写就不再是 0x40 ,而是 0x40+ cha 。 参考程序实验指导书附录 I-8 。

思考和练习题 1 .用 AD0809 采集交流正弦波形,调节信号频率从100Hz增加,观察显示波形的变化。当多高频率时,显示波形异常,解释此现象? 2.利用实验五介绍的校准方法,思考如何进行校准测量? 3. 编写 0 通道的有校准测量的实验程序,电压输入端选择 0 ~ 4.096V ,调节其输入电压值,比较有无校准的测量结果 , 参考源程序见实验指导书附录 I-9 ) 。

实验七 D/A 转换器 0832 的原理实验 实验目的 1. 了解典型 D/A 转换器 DAC0832 的工作原理。 2. 掌握芯片 0832 的接口设计方法。 实验任务 1. 找出本实验中芯片 0832 的地址。 12. 编写实验程序,向 0832 输入不通的数字电压以获得其相应的模拟电压输出,并运行通过。3.记录实验中电压的输出值。

实验原理 ▼ DAC0832工作原理 主要引脚定义如下: ① DI0-DI7: 8 条数据输入线。 ② ILE、 CS、WR1 :三条为输入锁存器的选通线,其中 ILE 为输入锁存器允许信号输入线(高电平有效),为片选信号输入线(低电平有效),为写信号输入线(低电平有效)。只有当三条线同时有效时,输入数据锁存器才被选通。 ③ XFER和WR2:二条为 DAC 锁存器选通线,其中 XFER 为传送控制信号输入线(低电平有效), WR2 为写信号输入线(低电平有效),只有当二条线同时有效时, DAC 锁存器才被选通。

▼ D/A 电流输出表达式

式中, Io1 —— DAC0832 输出电流;( Io1+ Io2=常数); NDAC —— DAC0832 数字输入量; Vr —— DAC0832 外部参考输入电压; R —— DAC0832 内部固定电阻,恒为 5KΩ 。

▼ DAC0832数 / 模电压转换实验电路

XFERCS

DI 7....DI 0

WR1WR2

Vr ef

Rf b

I out 1I out 2

I LE

2Y5

VCCAO1Vr 5V

AO2

D7. . . . . D0

ADC0832( I C35)

芯片 0832 的数字电压输入端口( DI7~ DI0 )与实验主板上的八位双向数据总线( D7~ D0 )相连;与地址线 2Y5相连,则其地址为 05H;参考电压有以下两种选择: ① AO1 来自实验主板上的信号源(参见实验八)。 ② Vr5V 来自实验主板上的参考电压源,实验电路原理如下图。

Vr5V 实验电路Vi n

GNVO

VCC1403

+- Vr 5V

OP07

+

▼ 输出电压值的计算 DAC0832 直接得到的转换输出信号是模拟电流,为得到电压输出,实验电路加了一个运算放大器,得到单极性的电压输出。其中,R=5kΩ;Rfb=15kΩ 是固定的内部电阻。则, D/A 转换后的输出电压

在本实验中参考电压 Vref选择实验主板上的参考电压源 Vr5V ,其理论值为 5V ,则 D/A 转换后的输出电压就为:

本实验只用到一个端口地址: 05H( 2Y5 ):输出口, DAC0832( IC35 )的地址。

编程与调试 (1) 程序说明 向实验主板上的 DAC0832( IC35 )写入不同的数字( 0 ~

256 ),在其输出端测量其相应的电压值,因实验主板上测试点 AO2 与其输出端口直接相连,只要测量测试点

AO2 ,就可获取经 DAC0832 的转换电压。程序中在 PC 机的

CRT 上还将显示对应的理论电压值,以便实验者参考。

(2) 编程思路

初始化 EPP接口

输入数字( 0~256)

在CRT上显示相应的电压理论值

是否继续测量结束?

开始

结束

测量输出电压并记录

(3) 编程步骤 1 .调用自定义头文件(同实验一)。2 . EPP 接口初始化(同实验一)。3 .启动芯片 DAC0832( 实验主板上的 IC35) 。 epp_write_data(DA2_0832,0x00); /*启动 0832(IC35) 芯片

*/ 4 .向 0832 写入数据。 DAC0832是 8 位的 D/A 转换器,故写入的数据应该在 0 ~ 256之间。 epp_write_data(DA2_0832,number); 5 .在 PC 机的 CRT 上显示转换电压。 volt=(float)(number*5.00/256);/* 电压转换 */ printf("\n%.2f",volt); /* 输出模拟电压值 */

思考和练习题 1. 为什么测得的电压值和理论值有区别? 2. 数字输入“ 0” 时,其输出电压为什么不为 0 ?3. 测量电压时,万用表的负极分别和实验主板上的模拟地和数字地相连接,其测得的结果是不是一样?如不一样,为什么?4. 测得的电压值与输入数字 0 时获得的电压值的差值与其相应的理论电压有什么关系?

(4) 源程序清单 参考程序见实验指导书附录 I-10

实验八 DAC0832 在程控信号源中的应用 实验目的1. 了解数字式信号波形合成的原理和方法。2. 掌握程控信号源的工作原理及实现方法。 实验任务1.根据本实验的电路原理图确定各端口的地址。 2. 通过 EPP 接口控制相应端口,使之产生不同波形、不同频率和幅度的信号。

实验原理 ▼ 波形的数字合成原理 在波形的数字合成中,通常是向 D/A 转换器输入端提供特定的数据流,则在输出端便可获得相应函数波形的信号电压。

如图( a)所示的一个八位二进制的加法计数器对时钟计数 过 程 中 , 计 数 值 N 按 0 、 1 、 2 、 3…255、 0 、 1 、 2 、 3…规律递增变化,得到一串 8 位二进制码的数据流,把它送入 DAC 的输入端,则 DAC 的输出 Uo(t) 呈梯形的增长,获得如图 (b) 所示的波形。若每步跳为 0.01V ,则 Uo(t)从 0 ~ 2.55V 的范围变化。 若采用一个可逆计数器对时钟信号交替地作加、减计数时,N的变化为 0 、 1 、 2 、 3…255、 254、 253…3、 2 、1 、 0 、 1 、 2… ,则 Uo 将获得一个三角波的输出电压。

时钟脉冲f 0 Uo( t )计数器

D/ A转换器 Uo( t )

f o

( a) ( b)

本实验如果采用所示的方案,在计数器和 DAC 之间接入一个 ROM ,先在 ROM 中写入某一函数的幅值数据,根据加法(或减法)计数器提供的地址码,取出相应地址单元的内容,送至DAC 输入端,则可获得任意波形的输出。如三角波、矩形波、正弦波、辛克波( sinx/x )、钟形波等。

地址输入线

数据输入线

D/ A转换器计数器

时钟脉冲f 0

ROM( 256*16)波形 0( 256)波形 1( 256)

波形 15( 256)

Uo( t )

▼ DAC0832工作原理▼ 程控信号源实验电路

D7. . . . . D0D0

D7

CLRCLK

ABCDU/ DCETCEPCLK

Q0 Q1 Q2 Q3 TC

LOAD

ABCDU/ DCETCEPCLK

Q0 Q1 Q2 Q3 TC

LOAD

ABCDU/ DCETCEPCLK

Q0 Q1 Q2 Q3 TC

LOAD

VCC2Y4

Q7

Q4

Q3

Q0

1MHzVCC

VCC

VCC

A11

A8

A7

A0

D7

D0

XFERCS

DI 7....DI 0

WR1WR2

Vr ef

Rf b

I out 1I out 2

I LE VCC

Vr 5V( 5V)

AO1

ADC0832( I C33)EPROM

74LS169

74LS16974LS169

74LS2730832( I C35)的输出端

▼ 程控的实现 在 8KB 的 EPROM 中固化有 16种波形数据,由高 4 位地址 A8~ A11选择;每一种波形的一个周期由 256 个数据代码构成,由低 8 位地址 A0~ A7寻址。 EPROM高 4 位地址 A8~ A11 来自锁存器 74LS273 的高 4位Q5~Q8 ,通过对 74LS273的编程可实现波形的程控。 选择好波形后,该波形的 256 个数据点的 8 位地址 A7~ A0 由一个 8 位地址计数器(二进制计数器)循环计数产生。实验主板上采用了两个 4 位二进制计数器 74LS169级联实现。通过改变地址计数器的输入时钟频率便可控制波形数据从 EPROM 中读出的速率,从而改变输出频率。固定的 2MHz 频率通过一74LS169 向地址计数器提供输入时钟。计数器 74LS169 采用减计数的工作方式,4 位预置初值位 A、 B、 C、 D 与 74LS273 的低 4 位Q1~Q4相连,通过对

74LS273 的编程可实现频率的程控。 DAC0832(IC33) 的数据写入控制端 WR1与 74LS169 的动态进位输出 TC相连,同时 TC又作为波形数据点地址计数器的时钟,这使得每个地址状态对应一个信号周期,从而实现地址计数器、波形 EPROM及DAC0832( IC33 )的同步工作。将 AO1 作为 DAC0832( IC35 )的参考电压(参见实验七的图 7-1 ), DAC0832( IC35 )就构成一个 8 位程控衰减器。通过控制写入 DAC0832( IC35 )的 8 位数字量,可实现对电压幅度的程控。

▼ 输出电压值的计算 在本实验中,第一片 DAC0832( IC33 )的输出电压为:

第二片 DAC0832( IC35 )的输出电压为:

▼ 输出信号及其 对应的控制数据

D 8 D 7 D 6 D 5 D 4 D 3 D 2 D 12Y 4=04H

波 形 设 置0000 正 弦 波0001 方 波0010 锯齿波 ( 1)0011 锯齿波 ( 1)0100 梯 形 波0101 三 角 波0110 台阶波 ( 1)0111 台阶波 ( 1)1000 台阶三角波1001 全波整形波1010 钟 形 波1011 辛 克 波1100 对 数 波1101 M 波1110 调 幅 波1111 窄脉冲波

分频比设置0000 禁止0001 20010 30011 40100 50101 60110 70111 81000 91001 101010 111011 121100 131101 141110 151111 16

程控信号源波形和频率设置

D 7 D 6 D 5 D 4 D 3 D 2 D 1 D 0

D I7 D I6 D I5 D I4 D I3 D I2 D I1 D I02Y 5=05H

程控信号源幅度设置(0-255)

本实验共用到二个端口地址 04H( 2Y4 ):输出口,锁存器 273 地址,对程控信号源波 形、频率控制。05H( 2Y5 ):输出口,第二片 DAC0832( IC35 )地址, 程控信号源幅度控制。

编程与调试 (一)程序说明 程控信号源可输出 16种波形(正弦波、方波。锯齿波( 1 )、锯齿波( 2 )、梯形波、三角波、台阶波( 1 )、

台阶波( 2 )、台阶三角波、全波整流波、钟形波、辛克波、对数波、M波、调幅波、窄脉冲波),幅度范围位0 ~ 5V 。 本实验中,可在 AO1和 AO2 口测量获得的波形。

(二)编程思路 初始化EPP接口

确定波形类型、频率、幅度

向 EPP送波形的类型、频率值

向 EPP送波形的幅度值

开始

结束

(三)编程步骤 1 .调用自定义头文件(同实验一)。2 . EPP 端口初始化(同实验一)。 3 .选择波形和分频数。 例如要选择 1 倍分频的方波 ,则高四位分别为 0001 ,低四位分别为 0001 : epp_write_data(AD1_0832,0x11); 4 .电压幅度的控制。(四)源程序清单 参考程序见实验指导书附录 I-10 。

思考和练习题 1.若分频器的输入数据增大,则产生的波形频率是增大还是减小? 2.若 DAC0832(IC35) 的输入数据增大,产生的信号幅度是增大还是减小? 3. 本实验主板产生的信号频率范围如何?有多少个点频信号输出,其频率值分别为多少? 4. 本实验主板产生的信号幅度范围如何?有多少个幅度值输出,每跳步的幅度间值相同吗?

实验九 LED 点阵显示技术 实验目的 1. 了解 LED 点阵显示的原理及接口驱动方法。 2. 熟悉动态扫描显示方式在显示技术中的应用。 3. 掌握并行接口与点阵显示的硬件接口和软件编程。 实验任务 1. 编写使点阵块全亮和全灭的点阵显示驱动程序段。 2. 编写简单的点阵显示程序,在 LED 点阵板显示汉字。 3. 编写在 LED 点阵显示上显示任意字符的点阵显示程序。

实验原理 ▼ LED 点阵简介 LED 点阵式显示器不仅可以显示数字,也可显示所有西文字母和符号,与由单个发光二极管连成的显示器相比,具有焊点少、连线少,所有亮点在同平面、亮度均匀、外形美观等优点,可以代替数码管、符号管和米字管。如果将多块组合,可以构成大屏幕显示屏,用于汉字、图形、图表等等的显示,因此被广泛用于机场、车站、码头、银行及许多公共场所的指示、说明、广告等场合。

▼ 8×8的 LED 点阵显示器结构 1 2 3 4 5 6 7 8

13 3 4 10 6 11 15 16

1

2

3

4

5

6

7

8

9

14

8

12

1

7

2

5

管脚

管脚

8×8的 LED 点阵显示器,是由 64个 LED 组成 , 内部电路如图 9-1所示。共阳极的 8 × 8的 LED 点阵显示器的典型连接方式是:每一行的阳极连在一起,由行扫描码锁存器和驱动器的一位控制,总共 8 行阳极连线由8 位分别控制;每一列的 8 个阴极连在一起,由字形行码锁存器和驱动器的一位控制,总共 8 列阴极连线由 8 位分别控制。

▼ 点阵字符的字型码00H01H02H03H04H05H06H07H08H09H0AH0B H0C H0D H0E H0FH

00H3FH00H00H00H01H01HFFH01H01H01H01H01H01H05H02H

10HF8H10H20H40H80H04HFE H00H00H00H00H00H00H00H00H

行选通码 前八列数据 后八列数据

在写点阵显示的驱动之前,应知道各显示字符的字形码。上图是四块 8 × 8的 LED 点阵拼成的一个 16 × 16 点阵( 16列 16 行)作为1 位字符显示的点阵码图。(本实验采用相同的显示方式显示一个字符)。

▼ 点阵字符的驱动 点阵式 LED 显示器采用逐行扫描式工作。要使点阵显示出一个的字符的编程方法是:首先向字形行扫描码锁存器输入行码,选通第一行;接着,向行码锁存器写入该行的字型码。然后,按相同的方式选通第二行,写第二行的字型码……由此类推,直到写完所有行的字型码,完成一个字符的显示。 如果要使多个点阵循环显示多个字符,只要把显示的各个字符按顺序安排在显示缓冲区,然后根据显示的字符去查表,再按一定的时序向各个字形行码锁存器和行扫描器输入相应的字形行码和行扫描码,便可达到目的。

▼ 字库原理 led 点阵显示的原理和过程都很简单,只是输入每个字符的显示点阵码很繁琐。多字符的显示采用的方法是读字库,查出显示字的点阵码,再显示到显示屏上。 国标对汉字库(区位码字库)的结构作了统一的规定:将汉字库分为若干个区,每个区有 94 个汉字。每一个汉字在字库中有一个固定的区和位,即每一个汉字有一个区位码。知道了区位码也就相当于知道了汉字在字库中的位置。由于汉字的内码与区位码有一定的关系,所以,只要通过内码就可以得到区位码,从而也就得到了汉字的字模。

由于计算机对西文字符采用一个字节表示,汉字用二个字节( GBK 内码)表示。为了保证中西文兼容,因此规定每个字节只用七位,若两个字节的最高位均为 1 ,则该字符为汉字。即计算机中的数字和一些特殊符号按 ASCⅡ 编码方式,汉字和一些符号是 GBK 内码编码方式来表示。而点阵显示字库是按区位编码方式排列。因此,读字库之前,要完成ASCⅡ 编码与区位编码的转换和 GBK 内码编码与区位编码之间的转换。

▼ UCDOS 16 点字库文件( HZK16j ) 本实验是读 UCDOS 16 点字库文件( HZK16j )。字库中的汉字按共阳极 16×16 点阵模式存储,即每个汉字由 16×16=256 个点组成,占用 16×2=32 个连续的字节单元。字节的每一位( bit )表示一个点的属性: 1 表示亮点, 0 表示暗点。字符点阵是按照汉字区位码排列的,连续的两个字节表示该汉字字模的一行。

▼ GBK 内码与相应区位码的转换 汉字的内码从一些图形字符开始,起始编码为 A1A1H;汉字内码第一位为区码,每区为 94 个汉字,第二位为位码。汉字点阵数据在字库中的偏移量为: ((区码 -A1H)*94 + ( 位码 -A1H)*32L由此可编辑偏移量的源代码为 inter_code.ed[1]=character[count]; point_quwei=inter_code.ed; /*寻找字符在汉字库中的位 */ wei=((point_quwei & 0xff00) >>8 )- 0xa1; /*寻找字符在汉字库中的区 */ qu=(point_quwei & 0x00ff) - 0xa1; rec=(qu*94+wei)*32L;

▼ ASCⅡ 码与相应区位码的转换 ASCⅡ 码的所有符号全在区位码的第三区,位码的偏移量为

0x21H 。ASCⅡ 码在字库中的偏移量为: (区码 *94 + ( 位码 -21H))*32L由此可编辑偏移量的源代码为: inter_code.ed[0]=character[count]; point_quwei=inter_code.ed; /*寻找字符咱汉字库中的位 */ wei= ((point_quwei & 0x00ff)-0x21; qu=0x03-0x01; /*寻找字符在汉字库中的区 */ rec=(qu*94+wei)*32L;

▼ LED 点阵式显示器实验电路

行扫描码锁存器

D 0

D 0

D 7

D 7

00H

0FH

E D 0...E D 3

C 2H

C 3H

C 1H

锁存器

锁存器

锁存器

驱动器

驱动器

驱动器

E D 0...E D 7

.

.

.

.

.

.

本实验共用到的端口地址 (地址跳线选择 1Y6) :C1H( Y0 ):输出口,行扫描码锁存器地址C2H (Y2) :输出口,字形行码左锁存器地址C3H (Y3) :输出口,字形行码右锁存器地址

编程与调试 (一)简单的汉字显示 1 .程序说明 该程序为根据每个字符的点阵码( 16×16 ),直接在 LED 点阵上显示汉字“电子科大”。2 .编程思路

根据字符的点阵码点亮 LED

循环是否结束

开始

结束

N

初始化 EPP口

Y

3 .编程步骤① 根据需要选择自定义头文件(同实验一)。② EPP 端口初始化(同实验一)。③ 选择点亮行。 要点亮某行的 LED ,先要向行地址端口写入行数,例如要点亮第一行: epp_write_out(ROW_DOT,0x00);④ 写入每列的点阵码。 要点亮某行的 LED ,向行地址写入数据后,先向左边列写数据再向右边列写数据。例如我们要点亮第一行的第一、三、五、七、九、十一、十三、十五列: epp_write_out(ROW_DOT,0x00); /*选择第几行 */ epp_write_out(L_DOT,0xaa); /* 向左边列写入数据 */ epp_write_out(H_DOT,0xaa); /* 向右边列写入数据 */

4 .源程序清单 参考程序见实验指导书附录 I-12 。

(二)在点阵上显示任意字符 1 .程序说明 点阵不仅可以显示汉字,任意字符它都可以显示。可以根据字库的存储原理,在字库中查找要显示字符的点阵码,再将这些点阵码写到的实验板子上,就可以在

LED点阵上显示任意想要的字符。

2 .编程思路 开始

结束

N

初始化 EPP接口

根据字符种类获取字符的区位码

循环结束 ?

Y

根据区位码读取字符的点阵码

向实验板写入点阵码点亮 LED点阵

关闭文件

打开文件

读取将要显示的字符

Y

N

3 .编程步骤 ① 根据需要选择自定义头文件(同实验一)。② EPP 端口初始化(同实验一)。③ 输入字符显示速度。printf("Please input the speed within range of 50 and 1000 \

n"); scanf("%d",&speed);④ 打开文件。 例如:当文件 Hzk16j.dot和 hz.txt都存放在 F盘 win98 文件中的dot 子文件中,则:fpk=fopen("F:\\win98\\dot\\Hzk16j.dot","rb")fpt=fopen("F:\\win98\\dot\\hz.txt","r");⑤ 读取将要显示的字符。 word=fgetc(fpt);

⑥ 获取字符的区位码。如果的字符是为数字或者特殊符号: inter_code.ed[1]=word[count1]; point_quwei=(unsigned short *)inter_code.ed; wei=((*point_quwei) & 0x00ff) - 0x21; qu =0x03 - 0x01; rec=qu*94+wei; addr_dot=rec*32L;如果字符是为汉字: inter_code.ed[1]=word[count1]; point_quwei=(unsigned short *)inter_code.ed; wei=(((*point_quwei) & 0xff00) >> 8) - 0xa1; qu=((*point_quwei) & 0x00ff)-0xa1; rec=qu*94+wei; addr_dot=rec*32L;

⑦ 根据区位码读取字符的点阵码。/* 将指针指向字库中将要显示的字符的点阵码的位置 */fseek (fpk, addr_dot, 0);/* 读取所要显示的字符的点阵码,并储存在数组 font 中 */fread (font, 2, 32, fpk);⑧ 向实验板写入点阵码,点亮 LED 点阵。4. 源程序清单 参考程序详见实验指导书附录 I-13 。

思考题和练习 1. 写出以下两个图形的点阵码。

2 .编写一个程序,在点阵面板上显示以上两个图形。3 .思考:相邻两行的扫描时间间隔对显示效果的影响(特 别注意延长相邻两行的扫描时间间隔后的显示效果)。4 .编写显示字符(非汉字)的程序段。5 .编写一个程序,在点阵面板上连续显示多个字符。

实验十 基本并行输入 / 输出在键盘接口中的应用 实验目的 1. 掌握矩阵键盘的接口驱动原理。 2. 掌握基本并行 I/O 和键盘的硬件接口方法。3. 熟悉矩阵键盘的应用编程。 实验任务 1. 写出键盘扫描的选通码。 2. 编写出矩阵键盘识键、判键的程序段。

矩阵式键盘 简介 键盘是由若干按键组合而成的,常采用矩阵式连接,称为矩阵式键盘,即每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。当需要的键数比较多时,采用矩阵连接可以减少 I/O 口的占有。

矩阵式键盘的编程 矩阵式键盘连接可分为编码式和非编码式两种。本键盘共 24 键,采用非编码式连接。其应用编程可分为三部分:判键、识键和键处理。 ▼判键 判键即指判断是否有键按下。 确定矩阵式键盘上何键被按下采用一种“行扫描法”。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。 首先在程序启动时,把 74LS273 输出口(地址为 1Y6= C0H ,作为行扫描输出)初始化到高电平(注意:列线状态由 74LS244 输入口(地址为 1 Y6= C7H )输入,常态下通过拉高电阻为高电平)。这样,所有的行输出都是高电平,列输入也都是高电平,代表无键按下。如果行线输出有低电平,一旦有键按下,则列线输入就会被拉低,这样,通过读入列线的状态就可得知是否有键按下。

▼识键 识键即指在判断有键按下时,识别该键是哪个键。这可根据 3 行扫描输出线哪列为低, 8 列输入线哪一列为低,即由该按下键的行列位置,组合成代表的该键值。 具体编程方法:依次将行线置为低电平,即在置某行线为低电平时,其它线为高电平。在确定某位行线置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键,进而确定该键的键值。 下面给出一个具体的例子: 输入值为 0xFE 、 输出值为 0xBF ,则此键值为第一行第二列的交叉点的键值;若输入值为 0xFD ,则此键值为第二行第八列的交叉点的键值。

▼ 键处理 键处理即在识别到某键按下(由键值表示)后,作出不同的处理。在应用上,一般将键盘分为功能键和数字键(也可两者复用),功能键一般采用散转的办法,让程序执行不同的操作。 实际上,键盘处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,这种复杂并不来自于设备的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再编写代码。 本键盘共 24 个键,定义了功能键 F1、 F2、 F3、 F4; U1、 U2、

U3 、U4 、和 4 个方向键配合功能键使用,数字键定义了 0~9 和小数点,以及“回车 /确认( CR )”共十二个。为了方便,使用者可以自己定义每个键的功能和相应的处理。

矩阵式键盘实验电路 矩阵式键盘连接如下图:

CO H

C 7H

锁存器

接收器

B0

F1

U1

<

F2

U2

>

F3

U3

F4

U4

1

4

7

2

5

8

3

6

9

0

CR

B1

B0B1B2B3B4B5B6B7

D0-D 7

B2

FEH

FDH

FBH

7FH BFH DFH EFH F7H FBH FDH FEH输出位码

输入键码

F1 F2 F2 F3 1 2 3 .

U1 U2 U3

U4

4 5 6 0

< > 7 8 9 CR

键盘对应标志符

键盘控制字

第一列 第二列 第三列 第四列 第五列 第六列 第七列 第八列Y7=C7H

0=本列有键按下1=本列无键按下 (每一位都相同定义 )

输入列码(读)

D7 D6 D5 D4 D3 D2 D1 D0第三行 第二行 第一行Y0=C0H

0=扫描本行1=不扫描本行 (每一位都相同定义 )

输出行扫描码(写)

本实验用到的端口地址(地址跳线都选 1Y6 ): C0H( Y0 ):输出口,通过 74LS273 输出锁存器,控制 扫描键盘的行线。 C7H( Y7 ):输人口,通过 74LS244 总线接收器,读取 扫描键盘的列线。

编程与调试 (一)程序说明 本实验是键盘和点阵综合实验。包含了矩阵式(非编码)键盘编程的三个部分:判键、识键和键处理,其中键处理(在点阵上显示其相应的内容)在此程序中只是为了说明编程思路。例如按下 F1 键,实验主板上的 LED开始显示数字 1 , 2 , 3……9999;在数字显示的过程中按下 F2 键, LED停止显示;按下数字键主板上的 LED 显示相应的数字,按下 CR 键程序退出。 用户在自己编写程序的时候,可以自己定义键盘中按键的功能并加以控制相应的操作。

(二)编程思路 开始

结束

初始化 EPP接口

读取按键值

F1键响应 数字键响应

LED循环显示数字

检测是否有 F2键按下

Y

N

LED上显示相应的数字CR键响应

LED全部熄灭

(三)编程步骤 1 .根据需要选择自定义头文件。 2 . EPP 端口初始化。 3 .编写显示函数 display() 。 当有 F1 键按下,则实验主板上的 LED 要循环显示0 , 1 , 2……9999 ,显示过程中还要判断是否有 F2 键按下。为方便起见,将这一部分功能写成函数( displed ())的形式,当有 F1 键按下的时候,直接调用这个函数。函数内容详见本实验的参考程序。

4 .判断是哪一行有键按下。 根据键盘的行扫描原理,先将第一行置“ 0”,再读取 74LS244 的数据端;如果全部为高就将第二行置“ 0”,再读 74LS244 的数据端;如果全部为高就将第三行置“ 0”,再读取 74LS244 的数据端,依次类推,通过输出的行码和读入的列码中“ 0”的位置确定按下的键。while(keyz==0xff){

flage=1; keyz=epp_key(0xfe); /*判断是否是第一行的按键按下 */ if(keyz==0xff) { flage=2; keyz=epp_key(0xfd); /*判断是否是第二行的按键按下 */ if(keyz==0xff) { flage=3; keyz=epp_key(0xfb); /*判断是否是第三行的按键按下 */ } }

}

5 .判断是哪个键按下,并执行相应的操作。 在判断是哪一行有键按下时,再读 74LS244 的数据端,哪位显示低电平“ 0” ,其对应的那列就有按键按下。知道了哪一行哪一列有键按下,就能确定是哪个键按下,例如当第一行的第一列显示低电平时,就说明有 F1 键按下。 判断有 F1 键按下的语句: if(flage==1 && keyz!=0xff) /*第一行有键按下 */ {

if(keyz==0x7f ) /*判断是否为第一行第一列有键按下 */ {

printf("Keyname: \x46\x31\n"); display(); /* 调用显示函数 */ return;

} }

在显示函数( display() )中,要查询是否有 F2 键按下,如有则实验主板上 LED全部熄灭。判断是否有 F2 键按下的语句为: epp_write_data(OUT_KEY,0xfe); /* 键盘第一行置“ 0”*/ epp_read_data(IN_KEY,&keyz2); /* 读取键盘列的状态 */ if( keyz2==0xbf && falge==1 ) /*判断是否有 F2 键按下 */ { epp_write_data(G_LED,0xaa); /* 如有 F2 键按下, led熄灭 * epp_write_data(D_LED,0xaa); } 当有数字键按下时,在主板的 LED 上直接显示相应的数字,此时直接调用头文件( displed.h )中的 LED 显示函数( displed() )。例如当有“ 5” 键按下时: if(flage==2 && keyz!=0xff) /*第二行有键按下 */ { if(keyz==0xfb) /*判断是否为第二行第六列有键按下 */

{ printf("Keyname: \x35\n");

displed(5); } }

(四)源程序清单 参考程序见实验指导书附录 I-14 。

思考和练习题 1 .去掉去抖延时时间,对按键的实际效果有何影响? 2 .写出 F1――F4 的键值表。 3 .你对本实验的体会,有何收获。 4 .自己编写用按键控制的程序实验,例如当有键盘相应时在点阵上显示相应的字符,参考程序可见实验指导书附录 I-15 。

实验十一 8250 串口通信 实验目的 1. 掌握 8250 的工作原理及应用。 2. 了解串行通信的 RS232协议及电平转换接口芯片。 3.完成对 8250 串口通信的程序设计。

实验任务 1 .熟悉 8250 内部寄存器的设置,编写初始化程序,分析它们对串行通信的管理机能和工作过程。 2 .在分析实验电路的基础上,编写 PC 机和实验平台上的 8250 的串行通信实验程序,并在实验主板上运行成功。 3 .编写 PC 机间通过实验板串行通信程序。

串行通信协议 基本的通信方式分为并行通信和串行通信两种,串行通信又分为同步和异步两种方式,本实验采用的是 RS-232C异步串行通信方式。为发送和接收一个信息字符所需的一切数据和控制信息都应该在单根数据线上传送,每次传一位,这就需要一个格式协议。

逻辑位 1逻辑位 0

起始位 数据位 奇偶位 停止位

异步通信的格式如图所示。每幀信息由四部分组成:1 .起始位,规定为低电平“ 0” 。2 . 5 ~ 8 位数据位,它紧跟在起始位后面,是要传送的有效信息。规定 从低位至高位依次传送。3 . 0 ~ 1 位奇偶校验位。4 . 1 位、 1.5 位或 2 位停止位,规定为高电平。

接口信号 实际上 RS-232-C的 25条引线中有许多是很少使用的,在计算机与终端通信中一般只使用 3-9条信号线。 RS-232-C最常用的 9 条引线的信号内容见下表所示。 引脚序号 信号名称 符号 流向 功能

2 发送数据 T X D D T E ? D C E D T E 发送串行数据

3 接收数据 R X D D T E ? D C E D T E 接收串行数据

4 请求发送 RT S D T E ? D C E D T E 请求 D C E 将线路切换到发送方式

5 允许发送 C T S D T E ? D C E D C E 告诉 D T E 线路已接通可以发送数据

6 数据设备准备好 D S R D T E ? D C E D C E 准备好

7 信号地 GND 信号公共地

8 载波检测 D C D D T E ? D C E 表示 D C E 接收到远程载波

2 0 数据终端准备好 D T R D T E ? D C E D T E 准备好

2 2 振铃指示 R I D T E ? D C E 表示 D C E 与线路接通 ,出现振铃

接口的电气特性 在 RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻 辑“ 1”为 -5~ -15V;逻辑“ 0” 为 +5 ~ +15V 。噪声容限为 2V 。即要求接收器能识别低至+3V 的信号作为逻辑“ 0” ,高到 -3V 的信号作为逻辑“ 1” 。

接口适配器 常 PC 机均配有两个串行接口,分别为 COM1和 COM2 ,通过一个 25

芯和一个 9 芯的 D 型连接器连接(也有些微机采用两个 9 芯 D 型连接器)。 9 芯 D 型连接器外型结构示意图及其信号定义如图所示。

D CD

R XD

TX D

D TR

G N D

D SR

RT S

C TS

R I

1

2

3

4

5

6

7

8

9

引脚序号

1

234

56789

信号名称

载波检测

接收数据

发送数据

数据终端准备好

信号地

数据设备准备好

请求发送

允许发送

振铃指示

符号

DCDRXTTXDDTRGNDDSRRTSCTSRI

本实验平台配备了一个 5 芯连接器(另一头为 9 芯 D 型,可与PC 机

连接),连接图如下图所示。 实验

板RS232插座

微机RS232插座

RX D

TXD

DS R

DTR

G N D

R XD

TX D

D SR

D TR

G N D

RS-232 电平转换接口芯片的应用 RS- 232 接口采用的是负逻辑,其逻辑电平与 TTL 的电平不同,因此,必须进行电平转换。常用的 MAX232 即为单电源工作(内含电源变换)的双通道 RS- 232C 驱动 / 接收器。

8250 的引脚 M RD 0D 1D 2D 3D 4D 5D 6D 7

AD SD ISTR

D ISTRD O STR

D O STR

D D ISA0A1A2C S0C S1C S2

17169

1534312430

1011333238373639

XTAL2XTAL1R C LK

BAU D O U TO U T1O U T2

C SO U TIN TR P T

SINSO U T

D TRRTS

RLSDD SRC TS

R I

实验电路 MRD0D1

D7DI STRDOSTRA0A1A2CS0CS1CS2

XTAL1

OUT1

OUT2I NTRPT

RTSCTS

SOUT

DTR

SI N

DSR

T1i n

T2i N

R1out

R2out

T1out

T2out

R1i n

R2i n

TC232TXT

DTR

RXD

DSR

VCC

I NT

nRESETDB0DB1

DB7RDWRA0A1A2

VCC

A8250

8250

1. 8432MHz晶振

实验主板上 8250 的各寄存器地址如下:E0H : 8250 的片选端 选通地址E3H :线路控制寄存器地址E5H :线路状态寄存器地址E0H : DLAB=0; 接受发送缓冲寄存器地址E1H : DLAB=0; 中断允许寄存器地址E2H :中断识别寄存器地址E4H :调制解调器控制寄存器地址E6H :调制解调器状态寄存器地址E0H : DLAB=1;除数寄存器低字节地址E1H : DLAB=1;除数寄存器高字节地3f8H:PC 机上 COM1 的地址

编程与调试 (一)实验板上自发自收串口通讯1 .程序说明 实验前将串口实验板子上的 RXD和 TXD 直接相连。程序中从键盘输入一个数字,经过实验板上的 8250自发自收,在 PC 机的 CRT 上又将这个数字显示出来

2 .编程思路

读线路状态寄存器

EPP接口、 8250初始化

Y

N

发送数据

置 DTR= 1

开始

发送保持器空?

读线路状态寄存器

读线路状态寄存器

接收数据就绪?N

读取数据并显示

结束

Y

读MSR,检测DSR=1?N

Y

3 .编程步骤 ① 调用自定义头文件。② 初始化 EPP 端口。③ 8250 初始化epp_write_data(LCR,0x80); /*允许访问除数寄存器 */epp_write_data(DLL,0x0c); /* 向除数寄存器的低字节写 0x0c*/epp_write_data(DLH,0x00); /* 向除数寄存器的高字节写 0x00*/epp_write_data(LCR,0x0f); /* 设定串行通讯的数据格式 */epp_write_data(IER,0x00); /*屏蔽多有中断 */④ 发送数据 do{ epp_resd_data(MSR,&msr); /*判断数据中断是否准备就绪 */ msr=msr&0x20;}while(msr==0);do{ delay(20000); /* 为了保证字符被接受,加适当的延时 */ epp_resd_data(LSR,lsr);/* 读通信线状态寄存器的值 */ lsr=lsr&0x20; }while(lsr==0); epp_resd_data(TBR,n); /*检测若发送寄存器空,则发送 */

⑤ 接受数据 /* 设置调制解调控制寄存器,令 DTR=1, 表示准备好接收数据 */epp_write_data(MCR,0x03); Do{ epp_resd_data(LSR,&lsr); /* 读通信线状态寄存器的值 */ lsr=lsr&0x01;}while(lsr==0);epp_resd_data(RBR,&re_chr); /* 读接收缓冲器的值 */⑥ 将读取值显示在 PC 机 的 CRT 上printf("%5d",re_chr);

4. 源程序清单参考程序详见实验指导书附录 I-16 。

(二) PC 机串口通讯 1 .程序说明 用实验箱自带的串口通讯线将实验板与另外 PC 机的串口( COM1 )相连接,实现 PC 机间的通讯。实验前选择发送或者接收数据。选择发送数据,就在本 PC 机上输入数据,在另外的 PC 机上显示已经所发送的数据;选择接收数据,则在本机接收对方发送过来的数据,并将其显示在本 PC 机的 CRT 上。 在两台不通的 PC 机之间通讯时,要将传送方和接受方的数据格式设为相同。

2 .编程思路 EPP接口、 8250初始化

置 DTR= 1

开始

读线路状态寄存器

接收数据就绪?N

读取数据并显示

结束

Y

选择接受或发送

读线路状态寄存器

Y

N

发送数据

发送保持器空?

读线路状态寄存器

读MSR, 检测DSR=1?N

Y

发送 接受

结束

3 .编程步骤 ① 头文件的调用, EPP 端口的初始化都同上(自发自收串口通讯实验)。② 8250 的初始化。 初始化的理论同上,所不同的是,因是在不同 PC 机之间通过串口( COM1 )和实验板的通讯,其端口地址都应在原来的地址基础上加上 PC 机的串口 COM1的地址 base(0x3f8) 。epp_write_data(base+LCR,0x80); /*允许访问除数寄存器 */epp_write_data(base+DLL,0x0c); /* 向除数寄存器的低字节写 0x0c*/epp_write_data(base+DLH,0x00); /* 向除数寄存器的高字节写入 0x00*/epp_write_data(base+LCR,0x0f); /* 设定串行通讯的数据格式 */epp_write_data(base+IER,0x00); /*屏蔽多有中断 */③ 选择发送还是接受。printf(\nPlease enter s or r to choose send or receive!);select=getch();④ 择 s 执行发送函数,选择 r执行接收函数。

4 .源程序清单 参考程序详见实验指导书附录 I-17 。

思考题 1 .在 8250 的收发数实验中,如果不设置调制解调器寄存器,会出现 什么现象?为什么?2 .在 8250 的收发数实验中,当发生接收数据错误时,应如何处理? 试编写一段数据出错处理子程序。3. 要采用中断方式应怎样编程?4. 为了保证 PC 机发送到实验板上的数据完整的被接收,应怎样操作?5 .考虑在实验板内或 PC 机间如何发送多个数据或者连续的数据,程序 应该怎么写?

实验十二 电子称重实验 实验目的 1 .了解传感器的原理。2 .熟悉利用实验主板的做实验。3 .进一步理解 A/D7109 的工作原理。 实验任务1 .根据传感器的原理,分析如何由测得电压计算砝码 重量。2 .利用实验主板上的 A/D 转换器 7109 ,编写出测量砝码 重量的实验程序。

实验原理 金属的电阻应变效应 当金属丝在外力作用下发生机械变形时,其电阻值将发生变化,这种现象称为金属的电阻应变效应设有一根长度为 l、截面积为 S、电阻率为 ρ的金属丝,在未受力时,原始电阻为:

当金属电阻丝受到轴向拉力 F作用时,其长度 L伸长,横截面积 S相应减小,电阻率因晶格变化等因素的影响也要改变,故引起电阻值R的变化。

应变片测量原理 各种电阻应变片的结构大体相同,用应变片测量受力应变时,将应变片粘贴于被测对象表面上。在外力作用下,被测对象表面产生微小机械变形时,应变片敏感栅也随同变形,其电阻值发生相应变化。 应变片应用很广泛,是由于有如下优点: ① 测量应变的灵敏度和精确度高,性能稳定、可靠,可测 1 ~ 2με ,误差小于 1 %。 ② 应变片尺寸小、重量轻、结构简单、使用方便、响应速度快。测量时对被测件的工作状态和应力分布影响较小。既可用于静态测量,又可用于动态测量。 ③ 测量范围大。既可测量弹性变形,也可测量塑性变形。变形范围可从 1 %~ 2 %至 20%。 ④ 适应性强。可在高温、超低温、高压、水下、强磁场以及核辐射等恶劣环境下使用。⑤ 便于多点测量、远距离测量和遥测。

直流电桥的工作原理 R1 R2

R3 R4

RL

I L

U

平衡条件为 :

测量电路原理

REF

I NHI NL

MODE

STATUSCE/ LOAD

ORPOL

B9

B12

B1

B8D0

D7

1Y1( PC2)1Y1( PC4)

RD1Y41Y3

I CL 7109

.

.

.

........

测量放大电路

V+

V-

OI

OO

+5V

- 5V2.048V基准电压

0~ 4. 096V

× 2 运放

26

2

20

18

19

40

28

35

34

21

22

23

36

3. 579MHz

RUN/ HOLD

LBENHBEN

跳线选择被测电压

AI N+

D0. . . . D7

D0. . . . D5

电压与力的关系 本实验所用的压力传感器,加在它上的砝码质量和输出电压成正比例线性关系。在传感器两端加+12V 电压,加入砝码质量M为 5 千克时,其输出电压 V0值为

12mv 。其比例系数 k为:

根据此比例系数,在传感器上加上不同质量M的砝码,就有不同的电压输出 V :

编程与调试 1. 程序说明 实验前将电子秤的红色端接到电源正极(+ 12V )、黑色端接到电源负极( AGND )、蓝色端接到输出正端(实验主板上的 AIN+端)、白色接到输出负端(实验主板上的 AGND )。选择增益倍数为

×300(根据需要可两外选择)。向传感器上加砝码,程序运行后在 PC 机的 CRT 和实验主板的 LED 上将砝码的质量显示出来。

2 .编程思路 开始

结束

N

初始化 EPP接口

启动A/ D转换

转换结束 ?

Y停止 A/ D转换

读取高位字节并暂存

读取低位字节并暂存

提取高位字节的OR, POL

溢出否 ?N

Y

输入为负 ?N

Y

屏蔽高四位

送显示器和 LED

置溢出标志

屏蔽高四位

置负数符号

硬件选择增益和输入端

初始化 8255

3 .编程步骤 1 .调用自定义头文件(同上实验一)。2 . EPP 接口初始化(同上实验一)。3 .初始化 8255 (同上实验二)。epp_write_data(CW_8255, 0x8a); /* 初始化 8255*/4 . PC2 置“ 1” 。8255 的端口 PC2 与芯片 7109 的启动端口 () 直接相连,将 PC2 置“ 1” ,则启动芯片 7109让它开始工作。epp_write_data(CW_8255,0x05);/*PC2置 1 ,启动芯片 7109 的转换 */ 5 .读 PC4 的状态。 do{ epp_read_data(PC_8255,&state);/* 读取转化状态量,端口 PC4 口 */ state=state&0x10; }while(state==1 ); /*判断 status值:为 1 正在转换;为 0 转换完 */

6 . PC2 置“ 0” 。 epp_write_data(CW_8255,0x04); /*PC2 置 0 , R/= 停止转换 */ 7 .读取 7109 转换完毕的数字量,并将其转化成电压值。 epp_read_data(H_7109,&high); /* 读出高位字节 */ epp_read_data(L_7109,&low); /* 读出低位字节 */ v=(high&0x0f)*256+low; 8 .判断极性和溢出 if(high&0x10) /*判断溢出位,若溢出则发出警告提示 */ printf("WARNING:the input volt is over!\n"); if(!(high&0x20)) /*判断符号位 , 显示屏输出 */

printf("- %.3f\n",v);9 .砝码质量的计算和显示。 M=2.4*1000*v; /* 由电压得到砝码质量 */ printf(“%.1f”,M); /*在 CRT 上显示砝码质量 */ d=(int)M; displed(d,0); /* 在实验主板的 LED 上显示砝码质量 */

思考和练习题 1. 向传感器上加砝码的时候,为什么要轻拿轻放?2. 测量传感器在没有添加砝码时,电压值是否为 0 ?如不是,请思考 为什么?3.当传感器的初始电压不为 0V 时,在程序中要怎么设计消除这种误差?4.加入传感器两端的电压不是 +12V,是+5V 时,对输出电压有没有影响? 思考加+5V 时输出电压值和砝码质量怎么换算?

4. 源程序清单 参考程序见实验指导书附录 I-18 。

*END*