第七章 MCS-51 单片机的系统扩展本章主要介绍 51系列单片机系统扩展问题,在本章中要研究较多的 硬件 方面及 硬软结合方面的问题,本章与第一章关系密切,
在学习本章内容之前,要先明确 51系列单片机本身的系统资源,可先复习一下 前面几章的有关单片机 硬件组成 方面的内容。
本章将介绍以下具体内容:
系统扩展的含义,单片机的 地址总线和数据总线,常见 系统扩展电路举例 。
§ 7.0 前言
1.系统扩展的含义单片机中虽然已经集成了 CPU,I/O口,
定时器,中断系统,存储器 等计算机的基本部件(即系统资源),但是对一些较复杂应用系统来说有时感到以上资源中的一种或几种不够用,这就需要 在单片机芯片外加相应的芯片、电路,使得有关功能得以扩充,我们称为系统扩展 (即系统资源的扩充)。
2.系统扩展分类 ----单一功能的扩展综合功能的扩展
3.系统扩展 需要解决的问题 ----
单片机与相应芯片的 接口 电路连接(即地址总线、数据总线、控制总线的连接)与编程 。
51系列单片机没有专用的对外地址总线和数据总线,其 P0口和 P2口既是通用 I/O
口,同时 P0口还是 分时复用 的 双向数据总线 和 低 8位地址总线 (一般需要加一级锁存器),而 P2口则是 高 8位地址总线 。
4.单片机的地址总线和数据总线
( 1)单一功能的系统扩展存储器的扩展 (程序存储器、数据存储器,E2PROM )
外部中断源 的扩展(简单门电路)
并行口 的扩展( 8155)
( 2) 综合功能 的扩展外部 RAM、定时器、并行口扩展 ( 8155)
存储器、并行口、定时器扩展 ( 多芯片 )
5.常见系统扩展电路
.程序存储器的作用 ----存放程序代码或常数表格
.扩展时所用芯片 ----一般用只读型存储器芯片(可以是 EPROM,E2PROM,FLASH芯片等)。
.扩展电路连接 ---- 用 EPROM 2764扩展程序存储器。
.存储器地址分析 ----究竟单片机输出什么地址值时,可以指向存储器中的某一单元。
§ 7.1 存储器的扩展
7.1.1 程序存储器的扩展
2764----8K EPROM
2764引脚功能
A0~A12 地址线
CE 选片
OE 读
D0~D7 数据线
VPP
A12
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
GND
Vcc
PGM
N.C
A8
A9
A11
OE
A10
CE
D7
D6
D5
D4
D3
2764
.扩展时所用芯片 1
编程脉冲输入PGM
编程电源Vpp
D7
D6
D5
D4
D3
D2
D1
D0
G
74LS373
GND+5V
E
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
.扩展时所用芯片 2
373引脚功能
D0~D6 数据输入
E 输出允许
G
数据输出Q0~Q7
使能端当 E=0,G=1时,
输出 Q=输入 D(透明 );
当 E=0,G=0时,
输出 Q端不变(锁存)
当 E=0,输出高阻态
.扩展电路连接图 7-4 扩展电路单片机
8031
P2.0
:.
A8.
..
ALE PSEN
74LS
373
G
2764
A7
.
.
A0
O0
.
.
O7
P0.0
:
P0.7
OE
CE
Q0
.
.
Q7
D0
.
.
D7
8031 2764
数据 总线的连接:
P0.0-P0.7( 数据总线 ) --------------------------------------O0-O7
地址 总线的连接:
P0.0-P0.7(地址总线低 8位) --------------------------------A0-A7
P2.0-P2.4(地址总线高 8位中的 5位) ------------------------- A8-A12
控制 总线的连接:
PSEN(程序存储器允许,即读指令) -------------------------- OE
ALE(地址锁存允许) --------------------------------接 373的使能端 G
经过锁存器 373
A12
P2.4
一个机器周期
ALE
PSEN
P2
P0
地址 A8~A15 地址 A8~A15
A0~A7 A0~A7
指令码 指令码图 7-2 从外存取指令时序图一个机器周期
ALE
PSEN
P2
P0
地址 A8~A15 地址 A8~A15
A0~A7 A0~A7
指令码 指令码单片机
8031
P2.0
:.
A8.
..
ALE PSEN
74LS
373
G
2764
A7
.
.
A0
O0
.
.
O7
P0.0
:
P0.7
OE
CE
Q0
.
.
Q7
D0
.
.
D7
A12
P2.4
.存储器地址分析 ----究竟单片机输出什么地址值时,
可以 指向存储器中的某一单元。
8031 P2.4 ………… P2.0 P0.7………………… P0.0 选中单元
(2732 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0)
0 0 0 0 0 0 0 0 0 0 0 0 0( 0000H) 0
0 0 0 0 0 0 0 0 0 0 0 0 1( 0001H) 1
0 0 0 0 0 0 0 0 0 0 0 1 0( 0002H) 2
0 0 0 0 0 0 0 0 0 0 0 1 1( 0003H) 3
0 0 0 0 0 0 0 0 0 0 1 0 0( 0004H) 4
.
.
,
1 1 1 1 1 1 1 1 1 1 1 1 1( 1FFFH) 8K-1
可见,当单片机输出地址 0000H~1FFFH时,选中 2764的 0~8K-1号单元,
即按照上面电路扩展的 4K存储器的地址范围是 0000H~1FFFH(共 8K字节)。
请思考,请同学们结合图 7.2来分析图 7.4中 373
的作用,并说明没有它行不行?为什么?
.扩展时所用芯片
.程序存储器的作用
.扩展电路连接
.存储器地址分析程序存储器的扩展
7.1.2 数据存储器的扩展
.数据存储器的作用 ----存放数据,可改写
.扩展时所用芯片 ----一般用静态读写型存储器芯片 SRAM,也可以用 E2PROM,FLASH芯片等
.扩展电路连接 ---- 用 SRAM 6264扩展程序存储器。
.存储器地址分析 ----究竟单片机输出什么地址值时,可以指向存储器中的某一单元。
.扩展时所用芯片 6264----8K SRAM
6264引脚功能
A0~A12 地址线
CE 选片
OE 读
D0~D7 数据线
N.C
A12
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
GND
Vcc
WE
CS
A8
A9
A11
OE
A10
CE
D7
D6
D5
D4
D3
6264
写WE
.扩展电路连接图 7-9 扩展电路数据 总线的连接:
P0.0~P0.7( 数据总线 ) ---------------------D0~D7
地址 总线的连接:
P0.0~P0.7(地址总线低 8位) --------------- A0~A7
P2.0~P2.4(地址总线高 8位中的 5位) ------- A8~A12
控制 总线的连接:
RD(读外部数据) ------------------------- OE
WR(写外部数据) ------------------------- WE
ALE(地址锁存允许) --------------接 373的使能端 G
经过 373
A8
6264
WE
单片机
8031
P2.0
:.
A8.
.
ALE RD
74LS
373
G
A7
.
.
A0
P0.0
:
P0.7 OE CE
Q0
.
.
Q7
D0
.
.
D7
A12
P2.4
WR
8031 6264
一个机器周期
ALE
PSEN
P2
P0
地址 A8~A15
A0~A7
三态数据 D0~D7入图 7-6 读外部数据 RAM时序图
RD
一个机器周期
ALE
PSEN
P2
P0
地址 A8~A15
A0~A7
数据 D0~D7出图 7-7 写外部数据 RAM时序图
WR
一个机器周期
ALE
PSEN
P2
P0
地址 A8~A15
A0~A7 三态数据 D0~D7入
RD
图 4.4 读外部数据 RAM时序图单片机
8031
P2.0P2.1
P2.2
A8
A9
A10
ALE
RD
74LS
373
G
6264
A7
A6
A5
A4
A3
A2
A1
A0
O0
O1
O2
O3
O4
O5
O6
O7
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7 OE
CE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
D0
D1
D2
D3
D4
D5
D6
D7
WE
WR
P2.7
P2.3P2.4
A11
A12
.存储器地址分析 ----究竟单片机输出什么地址值时,可以指向存储器中的某一单元。
8031 P2.7… P2.4 … P2.0 P0.7………………… P0.0 选中单元
(6264 CE A12 A11 … … A8 A7 A6 A5 A4 A3 A2 A1 A0)
0 X X 0 0 0 0 0 0 0 0 0 0 0 0 0( 0000H) 0
0 X X 0 0 0 0 0 0 0 0 0 0 0 0 1( 0001H) 1
0 X X 0 0 0 0 0 0 0 0 0 0 0 1 0( 0002H) 2
0 X X 0 0 0 0 0 0 0 0 0 0 0 1 1( 0003H) 3
0 X X 0 0 0 0 0 0 0 0 0 0 1 0 0( 0004H) 4
.
.
,
0 X X 1 1 1 1 1 1 1 1 1 1 1 1 1( 1FFFH) 8K-1
可见,当单片机输出地址 0000H~1FFFH时,选中 6264的 0~8K-1号单元,即按照上面电路扩展的 4K存储器的地址范围是
0000H~1FFFH(共 8K字节)。
请注意,与扩展程序存储器相比较,有以下不同点:
ⅰ,存储器芯片为可读可写的静态 RAM芯片,有读写控制引脚 OE和 WE。
ⅱ,单片机输出的对数据存储器的读写控制信号分别是
RD(而不再是读程序存储器时的 PSEN)和 WR。
.扩展时所用芯片
.数据存储器的作用
.扩展电路连接
.存储器地址分析数据存储器的扩展
2864----8K E2PROM
2864引脚功能
A0~A12 地址线
CE 选片
OE 读
D0~D7 数据线
N.C
A12
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
GND
Vcc
WE
N.C
A8
A9
A11
OE
A10
CE
D7
D6
D5
D4
D3
2864
.扩展时所用芯片写WE
7.1.3 E2PROM的扩展单片机
8031
P2.4
P2.0 A8
A12
ALE
RD
74LS
373
G
2864
A7
A6
A5
A4
A3
A2
A1
A0
D0
D1
D2
D3
D4
D5
D6
D7
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
OE
CE
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Q7
D0
D1
D2
D3
D4
D5
D6
D7
WEWR
P2.7
PSEN &
图 7-9 2864扩展电路图
★ 请思考,什么情况下图 7-9中的与门输出低电平,使 E2PRAM的内容可以被读出,读出的是什么方面的内容?图中扩展的 E2PRAM是外部数据存储器?外部程序存储器?两者都扩展了?
§ 7.2 并行口的扩展
7.2.1 并行口的简单扩展输出口 ----利用锁存器扩展并行口扩展的分类利用锁存器、缓冲器 进行并行口简单扩展用可编程并行接口芯片进行扩展输入口 ----利用缓冲器扩展
8031
1
1
WR
RD
P2.7
G
Q0
.
.
Q7
P0.0
.
.
P0.7
D0
.
.
D7
Q0
.
.
Q7
D0
.
.
D7
CLK
图 7-10 并行口的简单扩展
273
244
7.2.2 可编程并行接口芯片 8155的扩展一,8155的结构及引脚
8155的结构
8155
256字节 RAM
三个可编程并行口
PA口,8位
PB口,8位
PC口,6位
14位二进制减法计数器
8155芯片的内部结构
256B
静态
RAM
A
定时器
B
C
口 A
PA0~PA7
口 B
PB0~PB7
PC0~PC5
口 C
IO/ M
AD0~AD7
CE
ALE
RD
WR
RESET
定时器输入定时器输出接单片机接外设接外设接外设图 7.11b
8155引脚功能
PC3
PC4
PC5
IO/ M
CE
RD
WR
ALE
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
Vss
Vcc
PC2
PC1
PC0
PB7
PB6
PB5
PB4
PB3
PB2
PB1
PB0
PA7
PA6
PA5
PA4
PA3
PA2
PA1
PA0
8155
TIMER IN
RESET
TIMER OUT
AD0-AD7 三态地址 /数据线
IO/ M 端口 /存储器选择
RD 读
ALE 地址锁存 允许写WR
选片CE
定时器输入
TIMER IN
定时器输出
TIMER OUT
PA0-PA7 A口端口线
PB0-PB7 B口端口线
PC0-PC5 C口端口线 图 7.11a
PA0-PA7 端口 A的 I/O线( 8位,接外设)
PB0-PB7 端口 B的 I/O线( 8位,接外设)
PC0-PC5 端口 C的 I/O线( 6位,接外设)
AD0-AD7
三态地址 /数据复用线( 8位,一般接单片机 P0
口,CPU与 8155之间的地址、数据、命令、状态等信号都通过它来传送)
端口 /存储器 选择控制,0”选择片内 RAM
“1”选择片内 I/O口
TIMER IN 8155片内定时器 /计数器的计数脉冲输入引脚
TIMER OUT 8155片内定时器 /计数器的计满回零输出引脚分别是对 8155片内的 RAM或 I/O口的的读、写控制信号
ALE 地址锁存引脚选片
RESET 复位引脚
IO/ M
RD,WR
CE
I/O口地址 ----当 IO/ M 加高电平时
1,8155的 RAM和 I/O口地址
RAM地址 ----当 IO/ M 加低电平时此时 AD0-AD7上得到的地址值是指 8155的某一 RAM单元的地址,地址范围是
0000 0000--1111 1111
分别指向 8155 RAM 的 256个存储单元。
此时 AD0-AD7 (仅用到低三位 AD2,AD1,AD0)上得到的地址值是指 8155的某一 I/O口的地址,具体端口地址分配是:
二,8155的工作原理
AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 I/O端口
╳ ╳ ╳ ╳ ╳ 0 0 0 命令 /状态口
╳ ╳ ╳ ╳ ╳ 0 0 1 A口
╳ ╳ ╳ ╳ ╳ 0 1 0 B口
╳ ╳ ╳ ╳ ╳ 0 1 1 C口
╳ ╳ ╳ ╳ ╳ 1 0 0 计数器低 8位
╳ ╳ ╳ ╳ ╳ 1 0 1 计数器高 6位
8155的 RAM和 I/O口地址分配
2,8155的使用(分二种情况:片内 RAM的使用各 端口 的使用)
8155内 RAM的使用:
与一般外部数据存储器的使用基本一样,
唯一区别是 事先要使 IO/ M 为低电平 。
8155各 端口 (包括 定时器 )的使用:
A,B,C各端口可工作于不同的工作方式,
使用前要进行 初始化 ( 写命令字到命令口 )。
8155命令字含义
PAPBPC1PC2IEAIEBTM1TM2
PB,PA— A口,B口数据传送方向
0— 输入
1— 输出
00— C口输入,A,B口基本 I/O方式
11— C口输出,A,B口基本 I/O方式
01— PC3-PC5输出,A口选通方式,B口基本 I/O方式
10— A,B口选通方式
PC2,PC1— C口数据传送方向及 AB口工作方式
IEA,IEB — A,B口中断允许控制
0— 禁止
1— 允许
TM1,TM2— 定时器 /计数器控制
00 空操作
01 停止定时器
10 记满回零停止计数
11 启动
8155内部有一个 14位减法计数器,计数脉冲来自其引脚,TIMER IN”,使用定时器前要先装入,时间常数,----14位二进制数。其格式为:
8155定时器 /计数器
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
M2 M1 T13 T12 T11 T10 T9 T8 T7 T6 T5 T4 T3 T2 T1 T0
高 6位计数值 低 8位计数值定时器方式
M2 M1
00 单方波
01 连续方波
10 单脉冲
11 连续脉冲三,扩展电路的连接举例 ----见图 7-12,接口电路非常简单,基本上是相同信号对接。
8031 8155
RESET
RD
WR
ALE
P2.0
P2.7
P0.0
P0.1
P0.2
P.03
P0.4
P0.5
P0.6
P0.7
RESET
RD
WR
ALE
IO/M
CE
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
口 A
PA0~PA7
口 B
PB0~PB7
PC0~PC5
口 C
图 7-12
★ 请思考,对比图 7-4( 2764的扩展),为什么图 7-12中扩展 8155时,单片机 P0口输出的地址信号没有经过 373锁存而是直接接到 8155的地址 /数据复用线上了?
四,应用举例 ----(见教材 p139例)
设 8155与单片机连接电路如图 7-12,现要求其 A口为基本输入方式,B口为基本输出方式,定时器为 方波 发生器,对 8031输入脉冲进行 24分频,编制初始化程序段。
解,首先分析各端口地址 ----见教材 P138
表 7-9。
命令状态口地址为 7F00H
A口地址为 7F01H
B口地址为 7F02H
C口地址为 7F03H
定时器低 8位地址 7F04H
定时器高 6位地址 7F05H
8155的控制字为 0C2H:
PAPBPC1PC2IEAIEBTM1TM2
1 1 0 0 0 0 1 0
补充题 1:
根据图 7-12的电路,把 8155的 PB口设置成输入方式,PA口设置成输出方式,并把 PB口输入的数据与 8031 P1口输入的数据相,异或,,结果从 PA口输出。试写出满足此要求的程序。
MOV DPTR,#7F00H
MOV A,,#0C2H
MOVX @DPTR,A
MOV DPTR,#7F05H
24分频即计数初值为 24(000000 0011000B=18H)加上定时计数控制 01(连续方波),则送往定时计数器的时间常数及定时控制字应为
01000000 00011000B=4018H
MOV A,,#40H
MOVX @DPTR,A
MOV DPTR,#7F04H
MOV A,#18H
MOV DPTR,A
TM2 TM1 IEB IEA PC2 PC1 PB PA
0 0 0 0 0 0 0 1
即控制字为 01H,( 注:此处 PC2 PC1取 1 1也可以)
依图 7-12电路,8155的六个端口地址分配如下
P2.7…………… P2.0 P0.7……………… P0.0 I/O端口
0 X X X X X X 1 X X X X X 0 0 0 命令 /状态口
0 X X X X X X 1 X X X X X 0 0 1 A口
0 X X X X X X 1 X X X X X 0 1 0 B口
0 X X X X X X 1 X X X X X 0 1 1 C口
0 X X X X X X 1 X X X X X 1 0 0 计数器低 8位
0 X X X X X X 1 X X X X X 1 0 1 计数器高 6位地址
7F00H
7F01H
7F02H
7F03H
7F04H
7F05H
解,根据题目要求,要先初始化 8155(设置其端口的输入输出方式 ----这里 PB口输入,PA口输出),其控制字如下:
SJMP $
所以程序如下:
MOV DPTR,#7F00H ;选中 8155命令口
MOV A,#01H ;控制字 01H
MOVX @DPTR,A ;控制字 01H送 8155命令口
MOV DPTR,#7F02H ;选中 8155 PB口
MOVX A,@ DPTR ;从 PB口输入数据
XRL A,P1 ;与 8031 P1口内容,异或,
MOV DPTR,#7F01H ;选中 8155 PA口
MOVX @DPTR,A ;从 PA口输出数据补充题 2,根据图 7-12电路,设计一段程序把 8155
片内 RAM全部填满 FFH。
解,根据图 7-12的电路,8155片内 RAM地址是
0000H~00FFH,又由于是对 8155片内 RAM操作,不需要初始化芯片,
P2.7…………… P2.0 P0.7……………… P0.0 RAM单元
0 X X X X X X 0 0 0 0 0 0 0 0 0 0号地址
0000H
0 X X X X X X 0 1 1 1 1 1 1 1 1 255号00FFH
程序如下:
SJMP $
MOV R7,#00H ; R7作计数器,从 0开始共减 256次再到 0
MOV A,#0FFH ;准备送 FFH
MOV DPTR,#0000H ; DPTR指向第一个单元
LOOP,MOVX @DPTR,A ;送数
INC DPTR ;调整指针,指向下一个单元
DJNZ R7,LOOP ;循环控制
1.综合功能的扩展,使用具有综合功能的芯片、
使用多个芯片扩展。
( 1) 综合功能芯片扩展 ---- 8155
使用具有综合功能的 可编程 芯片 8155来同时扩展单片机的 I/O口、定时器、外部数据存储器
RAM。
补充
( 2) 多芯片扩展 ----使用多个芯片来进行综合功能扩展。
8031
373
G
2716 6116(2) 6116(1)
8155
P0
P2.2--P2.0PSEN
ALE
WR
RD
A
B
C
G2A
G2B
G1
P1.0
A0~A7 A8~A10
D7~D0 D7~D0 D7~D0 CECE
CS
OE
A0~A7 A8~A10
WE WE
OE OE
WE
RD
ALE
AD0~AD7
CE
Y2
Y1
Y0
+5V
IO/ M
PA
PB
PC
P2.3
P2.4
P2.5
P2.6
P2.7
需要弄清以下几个问题:
ⅰ,选片问题 ----
选片 信号的功能是:当某个芯片的 选片 信号接低电平时,意味着该芯片被 选中,而当其接高电平时,
意味着该芯片没有被选中,此时就好象该芯片没有连接到电路中(实际上是其各引脚处于 高阻态 )。
在这部分以前所有扩展电路中所用的芯片的 选片 信号引脚 CE,都是直接接地或者接某一 P2口线的。
芯片 138是 3,8译码器,它在这里的作用是输出选片信号:其输出端 Y0,Y1,Y2分别用来选择 8155
,6116( 1),6116( 2)。 138的引脚及功能见下表:
ⅱ,译码器问题 ----
控 制 引 脚 输 入 引 脚 输 出 引 脚
G1 G2A G2B C B A Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
1 0 0 0 0 0 1 1 1 1 1 1 1 0
1 0 0 0 0 1 1 1 1 1 1 1 0 1
1 0 0 0 1 0 1 1 1 1 1 0 1 1
1 0 0 0 1 1 1 1 1 1 0 1 1 1
1 0 0 1 0 0 1 1 1 0 1 1 1 1
1 0 0 1 0 1 1 1 0 1 1 1 1 1
1 0 0 1 1 0 1 0 1 1 1 1 1 1
1 0 0 1 1 1 0 1 1 1 1 1 1 1
138 功能表
★ 请思考,
b.为什么图中
6116( 1)的地址范围是
0800H-0FFFH?而
6116( 2)的地址范围是
1000H-17FFH?
a.为什么图中的 8155的各端口地址分别是
0000H,0001H,……,0005H,
而其内部 RAM地址范围是
0000H--00FFH?
a.由 图可知图中 8155的 CE接 138的 Y0,138的 G2B,G2A和
CBA分别接到 8031的 P2.7-P2.3,所以要选中
8155,即要 CE=0,则必有 Y0=0,
由 Y0=0得到必有 G1=1,且 G2A=G2B=0,
CBA=000,
即 8031的 P2.7-P2.3=00000时,选中 8155,
在此前提下,当 8031的 P0口输出地址是
00000000-11111111,且 IO/ M=0时,选中
8155的 RAM单元,所以其内部 RAM地址范围是
0000H--00FFH 。
当 8031的 P0口输出地址是
XXXXX000-XXXXX101,且 IO/ M=1时,选中 8155
的各端口,即
P2.7 …………… P2.0 P0.7 … ………… P0.0 端口
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0000H) 命令口
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ( 0001H) PA口
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 ( 0002H) PB口
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ( 0003H) PC口
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ( 0004H)计数器低
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 ( 0005H)计数器高所以 8155的各端口地址分别是
0000H,0001H,……,0005H。
b.同理可得 6116( 1)和 6116( 2) 的地址范围分别是 0800H-0FFFH和 1000H-17FFH:
ⅰ,图中 6116( 1) 的 CE接 138的 Y1,所以要选中 6116( 1),
则必有 Y1=0,由 Y1=0得 必有
G1=1,且 G2A=G2B=0,CBA=001,
即 8031的 P2.7-P2.3=00001时,选中 6116( 1),
在此前提下,当 8031的 P2.2-P2.0,P0.7-P0.0输出地址
000 0000 0000 -111 1111 1111时,选中 6116( 1) 中的某一个单元,也即 6116( 1) 的地址范围是:
0000 1000 0000 0000-0000 1111 1111 1111 即
0800H-0FFFH(共 2K)。
ⅱ 同样分析可知 6116( 2) 的地址范围是 1000H-17FFH
7.4.1 显示器及接口一,LED结构与原理
Dp g f e d c b a
D7 D6 D5 D4 D3 D2 D1 D0
+5V
Dp g f e d c b a
共阳极如共阳极时,输出 1 1 1 1 1 0 0 0 即 F8H时,显示,7”。字型表见表 5.9。
Dp g f e d c b a
共阴极
a b
c
d
e
f
g
7.4 键盘及显示接口 (见教材 p146~153)
二,LED接口(分静态、动态)
ⅰ,静态 LED----亮度大,硬件、软件相对简单,可以用并行或串行方式。
8031
WR
P2.7
P2.6
a
Dp
373P0
a
Dp
373
≥1 1
≥1 1
7-15 并行输出的静态显示电路
ⅱ,动态 LED—分时使各数码管轮流点亮,硬件简单。
8155
同相驱动反向驱动
C5 C4 C3 C2 C1 C0
PB0
PB1
,
.
.
.
PB7
PA0
PA1
.
.
PA5
图 7-17 扫描式显示电路共阴极数码管原理:
8155的 PB口 输出字型码到所有数码管的 a~g各段( 1—亮,0—暗),
PA口 输出位选字,选中某一个数码管
(因为加了一级反相器,所以 1—亮,0—暗),
使该数码管显示相应的字型,其余数码管不亮。
轮流点亮每个数码管并不断扫描,最后各数码管得到稳定的字型显示。
参考程序
MOD,MOV R0,#CWR ;指向 8155命令口
MOV A,#03H ;设命令字,PA口,PB口输出
MOVX @R0,A ;初始化 8155
DIR,MOV R0,#DIS0 ;指向片内显示缓冲区首地址
MOV R3,#01H ;选中 C0数码管 0000 0001
ACALL DL1 ;调延时子程序
MOV A,R3 ;
INC DPTR ;指向 8155的 PB口
LD0,MOV DPTR,#POA ;指向 8155的 PA口
MOV A,@R0 ;取要显示的数
MOVC A,@A+PC ;查表求得字型码
MOVX @DPTR,A ;送字型码(段值)
MOVX @DPTR,A ;送位扫描值
ADD A,#0DH ;加上偏移量
INC R0 ;指向下一个要显示的数
MOV A,R3
JB ACC.5,ELD1 ;判断扫描到 C5数码管没有
ELD1,RET
MOV R3,A
DSEG,DB 3FH,06H,5BH,4FH,66H,6DH
★ 请思考,LED静态、动态接口分别有什么特点?
RL A ;未扫描到 C5,扫描码左移 1位
AJMP LD0
DSEG1,DB 7DH,07H,7FH,67H,77H,7CH
DSEG2,DB 39H,5EH,79H,71H
ELD1,MOV R7,#02H ;延时子程序
DL,MOV R6,#0FFH
DL6,DJNZ R6,DL6
DJNZ R7,DL
RET
7.4.2.键盘及接口
----扫描 (判断哪个键按下),去抖动、判断按键是否抬起 (以防止重复进行键处理)。
前沿抖动 后沿抖动键按下闭合稳定 键释放
a.键盘接口要解决的问题一、键盘工作原理
8031
+5V
I/O
P1
R╳ 8
b.独立式键盘工作原理
★ 请思考,什么是键抖动?为什么键盘要考虑去抖动?一般常用哪两种去抖动的方法?
原理 ----当任何一个键被按下时,与其相连的输入线被置成,0”,平时该线为,1”。
键处理程序 ORG 2000H
START,MOV A,#0FFH ;先置 P1口为,1”
MOV P1,A
MOV A,P1 ;输入键状态
JNB ACC.0,P0F ;查询 0号键
JNB ACC.1,P1F ;查询 1号键
JNB ACC.2,P2F ;查询 2号键
JNB ACC.3,P3F ;查询 3号键
JNB ACC.4,P4F ;查询 4号键
JNB ACC.5,P5F ;查询 5号键
JNB ACC.6,P6F ;查询 6号键
JNB ACC.7,P7F ;查询 7号键
LJMP START
键盘扫描
P0F,LJMP PROM0 ;入口地址表
P1F,LJMP PROM1
P6F,LJMP PROM6
P7F,LJMP PROM7
……
PROM0,………………….,; 0号键功能程序
PROM7,………………….,; 7号键功能程序
…………………..
LJMP START ; 0号键处理完返回键盘扫描
LJMP START ; 7号键处理完返回键盘扫描
…………………..
.
.
.
.
c.行列式键盘工作原理(见教材 p150~151)
+5V
I/O
接口
X3
X2
X1
X0
Y3
Y2
Y1
Y0
5.1KΩ╳ 4
特点:节省 I/O口线过程,先判断有无键按下列线输出 0000,然后输入行线状态,
若没有键按下,则行线状态为全 1( 1111 );
若有任一键按下,则行线状态不为全( 1111);
再确认哪个键被按下列线逐行输出 0(如 1110),然后输入行线状态,
若没有键按下,则行线状态为全 1( 1111 );
若有任一键按下,则行线状态不为全为 1(如 0111,说明右上角那个键被按下)
确定每个键的键值负逻辑表示 ----行列线数据直接组合,上例中的各键值分别为,77H,7BH,7DH,7EH、
B7H,BBH,BDH,BEH、
D7H,DBH,DDH,DEH、
E7H,EBH,EDH,EEH、
负逻辑表示 ----行列线数据求反组合,上例中的各键值分别为,88H,84H,82H,81H、
48H,44H,42H,41H、
28H,24H,22H,21H、
18H,14H,12H,11H、
( 2)键盘扫描的控制方式程序控制扫描方式 ----连续扫描定时控制扫描方式 ----定时扫描中断控制扫描方式 ----中断后扫描
a.程序控制扫描方式 —以 8155扩展 I/O口组成的行列式键盘为例
+5V
8155
PA7
PA6
.
.
.
.
.
PA0
PC0
PC1
PC2
PC3
5.1K?╳ 4
CE
IO/M
WR
RD
ALE
P0
WR
RD
ALE
P2.7
P2.0
8031
0 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23
24 25 26 27 28 29 30 31
8155扩展 I/O口组成的行列式键盘
8155
PA口地址 7F01H
PC口地址 7F03H
8155,PA口输出列扫描信号
PC口输入行状态信号
ⅰ,判断有无键按下
PA口输出 00H
PC口输入行状态信号,若 PC3~PC0≠1111,有键按下
ⅱ,去抖动延时 5~10ms后再判断有无键按下
ⅲ,再确认哪个键被按下及其键号
8155的 PA口依次输出下列扫描字:
PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0
1 1 1 1 1 1 1 0 FEH
1 1 1 1 1 1 0 1 FDH
……
0 1 1 1 1 1 1 1 7FH
8155的 PC口输入行状态,可能为下列之一:
PC5 PC4 PC3 PC2 PC1 PC0
╳ ╳ 1 1 1 0 ╳ EH
╳ ╳ 1 1 0 1 ╳ DH
╳ ╳ 1 0 1 1 ╳ BH
╳ ╳ 0 1 1 1 ╳ 7H
则 每个键的键值(列行组合)
FE ╳ E,FD ╳ E,FB╳ E,F7╳ E,EF ╳ E,DE ╳ E,BF ╳ E,7F╳ E
FE ╳ D,FD ╳ D,FB╳ D,F7╳ D,EF ╳ D,DE ╳ D,BF ╳ D,7F╳ D
FE ╳ B,FD ╳ B,FB╳ B,F7╳ B,EF ╳ B,DE ╳ B,BF ╳ B,7F╳ B
FE ╳ 7,FD ╳ 7,FB╳ 7,F7╳ 7,EF ╳ 7,DE ╳ 7,BF ╳ 7,7F╳ 7
每个键的键号(自己安排)
N=行首键号 +列号
ⅳ,判断按键是否抬起(以防止重复进行键处理)
等待键释放后再进行进一步处理。
键扫描程序框图入口有键按下?
延时 12ms
有键按下?


N
Y
N
Y
键号入栈保存按键抬起?
N
Y
键号送 A
返回
ORG 1000H
KEY1,ACALL KS1 ;调用判断有无键按下子程序
JNZ LK1 ;有键按下,转去抖动
AJMP KEY1 ;无键按下,返回
LK1,ACALL TM12S ;延时 12ms
ACALL KS1 ;再查有无键按下
JNZ LK2 ;确实有键按下,逐行扫描,确定具体键
AJMP KEY1 ;无键按下,返回
LK2,MOV R2,#0FEH ;首列扫描字送 R2
MOV R4,#00H ;首列号 R4
LK4,MOV DPTR,#7F01H ;首列扫描字送 8155的 PA口
MOV A,R2 ;第一列扫描
MOVX @DPTR,A ;使第 i 列为 0( R2中 Di位为 0)
INC DPTR
INC DPTR ;指向 8155的 PC口
MOVX A,@DPTR ;读入行状态
JB ACC.0,LONE ; 0行无键按下,转查 1行
LONE,JB ACC.1,LTWO ; 1行无键按下,转查 2行
MOV A,#00H ; 0行有键按下,行首键号 #00H送 A
AJMP LKP ;求键号
LTWO,JB ACC.2,LTHR ; 2行无键按下,转查 3行
MOV A,#08H ; 1行有键按下,行首键号 #08H送 A
AJMP LKP ;求键号
LTHR,JB ACC.3,NEXT ; 3行无键按下,转查下一列
MOV A,#10H ; 2行有键按下,行首键号 #10H送 A
AJMP LKP ;求键号
MOV A,#18H ; 3行有键按下,行首键号 #18H送 A
LKP,ADD A,R4 ;求键号 =行首键号 +列号
PUSH ACC ;键号入栈
LK3,ACALL KS1 ;等待键释放
JNZ LK3 ;未释放,继续等待
POP ACC ;已释放,键号送 A
RET
NEXT,INC R4 ;指向下一列,列号加 1
MOV A,R2 ;判断 8列扫描完没有
JNB ACC.7,KND ; 8列扫描完,返回
RL A ;没扫描完,置下一列扫描字
MOV R2,A ;扫描字送 A
AJMP LK4 ;继续下列扫描
KND,AJMP KEY1 ; 8列扫描完,返回
KS1,MOV DPTR,#7F01H ;查有无键按下子程序
MOV A,#00H
MOVX @DPTR,A ; 8155 PA口输出全扫描字 #00H
INC DPTR
INC DPTR ;指向 8155的 PC口
MOVX A,@DPTR ;读入行状态,若有键按下,则 A≠0FFH
CPL A ;改成正逻辑,若有键按下,则 A≠00H
ANL A,#0FH ;屏蔽高四位
RET ;子程序返回,当有键按下时,AA≠00H
T12sm,MOV R7,#18H ; 12sm延时子程序
TM,MOV R6,#0FFH
TM6,DJNZ R6,TM6
DJNZ R7,TM
RET; td=[1+(1+255*2+2)*24+2]*MC
d.键操作及功能处理求出键号后要进行键处理:
先判断是何种键,然后:
对数字键 ----送显示缓冲区显示;
对功能键 ----执行相应的功能键处理程序。
设图 5.36中,0~15号键为数字键,即 键号 <10H的是数字键 ;
16~31号键为功能键,即 键号 ≥ 10H的是功能键,其功能键处理程序入口地址分别为,AAA,BBB,CCC,…… PPP。
则转入功能键处理程序清单如下:
ORG 8000H
KEYADR,MOV A,BUFF ;键号送 A
CLR C
SUBB A,#10H ; Y与 10H比较
JC DIGPRO ; <10H,数字键,转
AJMP @A+DPTR
RL A ;使键值为 0,2,4,6,… 偶数
KEYTBL,MOV DPTR,#JMPTBL
JMPTBL,AJMP AAA ; 2 字节指令散转到 16个功能键处理
AJMP BBB ; 程序入口
AJMP CCC
AJMP DDD
AJMP EEE
AJMP FFF
AJMP GGG
AJMP HHH
AJMP III
AJMP JJJ
AJMP KKK
AJMP LLL
AJMP MMM
AJMP NNN
AJMP OOO
AJMP PPP
D/A电路一般是作成集成电路芯片,使用时要注意 2个问题:
一个是 转换时间 及 转换精度 ; 另一个是转换出来的 模拟量的形式 是什么(电流量还是电压量)。
8.1 D/A转换器及其与单片机接口
----D/A转换即是将数字量转换成相应的模拟量,常用于控制系统中。如单片机输出不同的数字量经 D/A转换后加给直流电机,即可控制电机的转速。
第八章 MCS-51单片机的测控接口本章主要介绍构成单片机测控系统的重要内容,即模拟量和开关量的输入、输出接口技术。
8.1.1 D/A转换原理 --倒 T型电阻网络 D/A转换电路原理图 8-2( a) 倒 T型电阻网络 D/A转换原理图
R 2R 2R 2R 2R
R R R R
D0 D1 D2 D3
节点 3节点 2节点 1节点 0
I VRE
F
+
-
VOUT
I3I2I1I0
图中 D3 D2 D1 D0是 4位二进制数字量输入,当 D3 D2 D1 D0中的某一位状态为 1时,图中开关打向右方,为 0 时,开关打向左方。
R
F
IOUT1
IOUT2
VREF为基准电压输入,
Vout是电压模拟量输出。
由运算放大器概念可知:
Vout=-RF?Iout1
Iout1是开关打向右端的各支路电流 Ii之和,实际上
(其中 就是数字量 D3 D2 D1 D0的某一位)Di
图 8.2 ( b) 等效电路图
R 2R 2R 2R 2R
R R R R
D0 D1 D2 D3
节点 3节点 2节点 1节点 0
I VRE
F
I3I2I1I0
由等效电路图 5.6( b)可知,各支路电流分别为:
i
i
i
R
V
FOUT DRV
REF
3
0
16 2
上式右边
i
i
i D
3
0
2
表示的就是数字量 D3 D2 D1 D0的值(按权展开),而左边是模拟量输出值,可见 模拟量输出正比于数字量输入,即实现了 D/A转换。
★ 请思考,倒 T型电阻网络相对于权电阻网络有什么优势?
8.1.2 DAC0832芯片及其与单片机接口一,DAC0832的引脚及结构
0832----8位 D/A0832引脚功能
IOUT2 电流输出 2
CS 选片
WR1 输入写
DI0~DI7 数据线
CS
WR1
AGND
DI3
DI2
DI1
DI0
VREF
RFR
DGND
Vcc
ILE
WR2
XFER
DI4
DI5
DI6
DI7
IOUT2
IOUT1
DAC
0832DAC写WR2
IOUT1 电流输出 1
数据锁存ILE
数据传送XFER
图 8-4 DAC0832的引脚分布图输入寄存器
DAC
寄存器
D/A
转换器
ILE
CS
WR1
WR2
XFER
IOUT1
IOUT2
DI7~DI0
RF
R
VREF
图 8-3 DAC0832的逻辑结构二,DAC0832与单片机的接口
① 单缓冲方式接口电路
----将两级寄存器的控制信号并接在一起,相当于控制一级寄存器(线选译码地址 7FFFH)。
8031
WR
P2.7
P0 DI7~DI0
CS
XFER
WR1
WR2
DAC0832
IOUT2
IOUT1
+
-
RF
R
图 8-5 DAC0832单缓冲方式接口电路
ILE
+5V
采用单缓冲方式输出锯齿波、矩形波、三角波、梯形波等的 D/A转换程序(见教材 p103~105)
锯齿波
ORG 2000H
START,MOV DPTR,#7FFFH ;选中 0832
MOV A,#00H ; D/A数据初值
LP,MOVX @DPTR,A ;转换
INC A ;修改 D/A数据
SJMP LP ;循环,输出连续模拟量
A=00
A=0FFH
三角波 ORG 2000H
START,MOV DPTR,#00FEH ;选中 0832
MOV A,#00H ; D/A数据初值
UP,MOVX @DPTR,A ;转换
INC A ;修改 D/A数据(上升)
JNZ UP ;未上升到最大值,继续
DOWN,DEC A ;否则,修改 D/A数据(下降)
MOVX @DPTR,A ;转换
JNZ DOWN ;未下降到最小值,继续
SJMP UP ;一个周期结束,继续
A=00
A=0FFH
A=00
A=0FFH
② 双缓冲方式 ----略
----A/D转换即是将模拟量信号转换成数字量信号,常用于数据采集系统,外界的模拟信号经 A/D转换后,读入单片机内部以便进行处理。
8.2 A/D转换器及其与单片机接口常见 A/D转换电路有双积分式和逐次逼近式。 A/D转换的主要指标是 —精度
(位数)、转换时间。
先假设一个数字量,并将其进行 D/A转换,然后将得到的模拟量与输入模拟量进行比较,若前者大于后者,说明所设数字量偏大,将其减小后重复上述过程;若前者小于后者,则说明所设数字量偏小,将其增大后重复上述过程 …… 如此反复调整所设数字量,
使得其 D/A转换后的值逐渐逼近输入模拟量,
此时所设数字量即为转换好的数字量。
8.2.1 A/D转换原理 --逐次逼近式 A/D转换原理一、逐次逼近 A/D转换的基本原理比较器
D/A转换器时序与控制逻辑电路输出缓冲器模拟量输入
VX
VN
时钟启动 EOC OE
N位数字量输出
N位寄存器图 5.16 逐次逼近 A/D转换器原理图转换过程:
模拟量 VX送到比较器后,启动 A/D转换,先设 N位寄存器的最高位( DN-1)为 1,其余位为 0,进行
D/A转换,得到的模拟量 VN与输入 VX比较,
VN ≤VX,再设次高位( DN-2)为 1,继续 ……
若若
VN >VX,先清零 DN-1,再设次高位( DN-2)为 1,继续如此反复,经过 N次比较后,最后一位 D0得到确定,
此时,N位寄存器的内容就是转换好的数字量,而
EOC输出转换结束信号,在输出允许 OE(高电平)
有效时,数字量经输出缓冲器读出。
8.2.2 ADC0809芯片与单片机的接口一,ADC0809的引脚及内部结构
0809----8位 A/D0809引脚功能
VR 参考电源
CLK 时钟
OE 输出允许
D0~D7 数字量输 出
IN3
IN4
IN5
IN6
IN7
START
EOC
D3
OE
CLK
VCC
VR(+)
GND
D1
IN2
IN1
IN0
A
B
C
ALE
D7
D6
D5
D4
D0
VR(-)
D2
0809
转换结束EOC
IN7~IN0 模拟量输 入地址锁存ALE
启动转换START
图 8-14 ADC0809引脚图图 8-13 ADC0809的结构框图
8路模拟量开关地址锁存与译码
8位 A/D
转换器三态输出锁存器
START CLK
IN0
IN7
D0
D7
A
B
C
ALE
VR( +) VR( -)
EOC
OE
二,ADC0809与单片机的接口
① 延时等待方式
8031 0809
≥1
≥1
P0
ALE CLK
ALE
START
OE
RD
P2.7
WR
A
B
C
P0.0
P0.1
P0.2
VR(+)
VR(-)
+5V
GND
IN0
·
·
·
·
INT7
D0~D7
CP
D
Q
Q
AD09,MOV DPTR,#7FFFH ;选中 0809
MOV A,##0 ;选中 IN0
MOVX @DPTR,A ;启动 A/D转换
MOV R7,#50H ;
DJNZ R7,$ ;延时等待
MOVX A,@DPTR ;读入转换好的数据
SJMP $
② 查询与中断方式
8031
0809
373
≥1
≥1
1
P0.7
.
.
.
P0.0
A
B
C
+5V
GND
IN0
·
·
·
·
·
·
INT7
CP
D
Q
Q
ALE
START
OERD
P2.7
WR
P3.3 EOC
ALE
CLK
D7
.
.
.
D0
VR(+)
VR(-)
G
INT
1
MAIN,MOV R1,#DATA ;置数据区首地址查询方式程序 ----8路模拟信号轮流采样一次,并将转换结果分别存入内部 RAM 以 DATA为起始地址的连续 8个单元中。
MOV DPTR,#7FF8H ;选中 IN0通道
MOV R7,#8H ;置通道数
LOOP,MOVX @DPTR,A ;启动 A/D转换
TEST,JB P3.3,TEST ;查询 A/D转换结束否
MOVX A,@DPTR ;转换结束,读入转换结果
MOV @R1,A ;存入内部 RAM存储区
INC DPTR ;指向下一个通道
INC R1 ;修改存储指针
DJNZ R7,LOOP ; 8个通道是否转换完成
……
中断方式程序 ----问题同上,采取中断方式
ORG 0013H
AJMP PINT1
ORG 2000H
MAIN,MOV R1,#DATA
SETB IT1 ;边沿触发
SETB EA
SETB EX1
MOV DPTR,#7FF8H
MOVX @DPTR,A
LOOP,NOP
AJMP LOOP
ORG 2100H
PINT1,PUSH PSW
PUSH ACC
MOVX A,@DPTR
MOV @R1,A
INC R1
INC DPTR
MOVX @DPTR,A;再次启动
POP ACC
POP PSW
RETI
主程序 中断处理程序
----51系列单片机有两个外部中断源( INT0、
INT1),中断源的扩展可用与存储器扩展类似的方法,外接中断控制芯片(如 8259)来进行扩展;
也可以利用单片机中的定时器 T0,T1来扩展(见第一章习题 1.20);还可以外接 门电路 配合相应的 查询软件 进行简单的扩展。这里我们研究最后一种方法。
补充,外部中断源的扩展
8031
1
1
1
1
P1.0P1.1
P1.2P1.3
INT0ITS4
ITS3
ITS2
ITS1
+5V
扩展外部中断源
R
要注意的是:
ⅰ,图中的非门是 OC(即集电极开路)门,图中的电阻是这些非门的上拉负载电阻,注意只有 OC
门才可以象图中那样采取 线与 方式连接。
ⅱ,此处是将一个外部中断源( INT0)扩展成了 4
个( ITS1-ITS4),同理还可以将 INT1进行扩展。
ⅲ,由于经过一级反相,这 4个中断源是上升沿或高电平引起中断。
ⅳ,不管这 4个中断源中的哪一个或哪几个申请中断,都是通过 INT0申请中断,因此处理程序入口地址只有一个即 INT0的入口地址( 0003H)。
中断处理程序
PINT0,PUSH PSW
JB P1.0,PIS1 ;查询 ITS1有无中断请求
JB P1.1,PIS2 ;查询 ITS2有无中断请求
JB P1.2,PIS3 ;查询 ITS3有无中断请求
JB P1.3,PIS4 ;查询 ITS4有无中断请求
REP,POP PSW
RETI
PIS1,…,;进入 ITS1中断处理程序
AJMP REP
PIS2,…,;进入 ITS2中断处理程序
AJMP REP
PIS3,…,;进入 ITS3中断处理程序
AJMP REP
PIS4,…,;进入 ITS4中断处理程序
AJMP REP
★ 请思考,查询软件的作用是什么?没有它行不行?