第六章
MCS-51单片机扩展技术
1 MCS-51内部并行 I/O端口
4个双向、并行,8位输入 /出端口( P0~P3)
每个 I/O端口都有一个 8位数据锁存器和 2个 8位数据缓冲器。
P0~P3 ( 8位锁存器)是 SFR,各有自己的端口地址,可直接用指令寻址,用于存放需要输出的数据。
数据输入时只有缓冲没有锁存,各引脚上输入的数据必须一直保持到 CPU把它读走为止。
1) P0口 字节地址 80H,位地址 80H~87H
① 地址和数据分时复用,扩展外存储器和 I/O时,低
8位 地址输出和 8位数据 输出。 CPU发控制信号,打开与门,使 MUX打向上边,形成推拉式结构,提高了负载能力,数据输入时,数据信号可直接读入内部总线。
② 通用 I/O,准双向口,CPU发控制信号,封锁与门,
使上拉管截止,MUX打向下边,与 D触发器 Q 连接。
输出,漏极开路,需加上拉电阻,以确保输出,1”。
MOV P0,A输出通用 I/O,P0口作输入
MOV P0,#FFH
MOV A,P0
输入
2) P1口 字节地址 90H,位地址 90H~97H
P1口只传送数据,无 MUX
内部有上拉电阻,准双向口 MOV P1,#FFH
MOV A,P1
输入
MOV A,P1输出
3) P2 口 字节地址 A0H,位地址 A0H ~ A7H
① 地址,扩展外存储器和 I/O时,高 8位 地址输出
CPU发控制信号,使 MUX打向上边。
数据输入时,数据信号可直接读入内部总线
② 通用 I/O,准双向口,CPU发控制信号,MUX
打向下边,与 D触发器 Q 连接。
MOV P2,#FFH
MOV A,P2
输入MOV A,P2输出
4) P3口 字节地址 B0H,位地址 B0H~B7H
① 通用 I/O口,准双向口第二功能端保持高电平
MOV P3,#FFH
MOV A,P3
输入MOV A,P3输出
② 第二功能输出,Q=1
2 I/O端口的应用举例
ORG 0500H
D BIT 00H
E BIT 01H
G BIT 02H
LOOP1,ORL P1,#08H
LOOP2,MOV C,P1.3
JC LOOP2
ORL P1,#03H
MOV C,P1.0
MOV D,C
MOV C,P1.1
MOV E,C
ANL C,D
MOV G,C
MOV C,E
ORL C,D
ANL C,/G
MOV P1.2,C
SJMP LOOP1
END
3,MCS-51 单片机存储器扩展技术在 51单片机中 ROM和 RAM的寻址空间是严格分开 的,称为“哈佛”结构,单独编址,指令不一样。
内外 ROM统一编址( MOVC)
内外 RAM分开编址( 内 MOV 外 MOVX)
外设和外 RAM要统一编址( MOVX)占用一部分地址单元地址译码方式与地址译码电路凡是挂在总线上的存储器芯片或外设,为了区分,必须由地址译码电路为每个存储芯片或外设提供一个与地址信息有关的片选信号。
当 CPU访问存储器或外设时,出现在 AB总线上的地址信号可划分为两部分,直接与存储器或外设连接的地址线可称为 片内地址线,其所用根数与存储器的容量有关,容量 =2n;其中 n为片内地址线的根数;剩余的地址线称为 片外地址线,可做译码电路的片选地址线。
n
译码方式译码器方式线选方式全译码方式部分译码方式全译码方式,指所有片外址线都参加译码,其特点是:存储器的每一个存储单元只有唯一的一个地址与之对应,不存在地址重叠现象。
部分译码方式,只有部分片外地址线参加译码,剩余线状态任意,所以会出现地址重叠现象,即一个存储单元将有多个地址与之对应,对于剩余 AB线,尽量按,0”选取。
·线选法,利用片外地址线或某端口的 I/O线直接与存储器芯片或接口的片选引脚线连接,此种方法简单,不需附加译码电路,适用于芯片较少,而且片选线充足的系统。
注意,若有多条片选线时,在 CPU访问存储器期间只能有一根处于有效状态,不允许出现多条片选线同时有效的现象。
1#2716的地址范围为 0000H~ 07FFH
2#2716的地址范围为 2000H~ 27FFH。
地址分析
2764的地址范围是,0000H~ 1FFFH,
6264( 1)的地址范围是,8000H~ 9FFFH
6264( 2)的地址范围是,A000H~ BFFFH
4,MCS-51 单片机系统并行接口的扩展技术例 1 8255A与 51单片机的连接
8255A的 PA,PB,PC、控制口的地址分别为:
FF7CH,FF7DH,FF7EH,FF7FH,
假设要求 8255A工作方式 0,且 PA口做输入,
PB,PC口做输出
ORG 0100H
MOV A,#90H
MOV DPTR,#0FF7FH
MOVX @DPTR,A
MOV DPTR,#0FF7CH
MOVX A,@DPTR
MOV DPTR,#0FF7DH
MOV A,#DATA1
MOVX @DPTR,A
INC DPTR
MOV A,#DATA2
MOVX @DPTR,A
SJMP $
例 2、利用 8031单片机通过 8255A和字符打印机连接
PA,PB,PC、控制口地址分别为:
00H,01H,02H,03H
要求,8255A工作于方式 1,做输出,将 8031内部 RAM以 20H为始址的连续 50个存储单元中的数据输出打印,要求 PA口工作于中断方式。
① 主程序 ORG 1000H┇
SETB EA
SETB EX0
SETB PX0
SETB IT0
MOV R0,#03H
MOV A,#0A8H
MOVX @R0,A
MOV R1,#20H
MOV R2,#32H
MOV R0,#00H
MOV A,#00H
MOVX @R0,A
MOV R0,#03H
MOV A,#01H
MOVX @R0,A
MOV A,#00H
MOVX @R0,A
LOOP:SJMP $
② 中断服务程序
ORG 0003H
LJMP PINT0
ORG 2000H
PINT0,MOV R0,#00H
MOV A,@R1
MOVX @R0,A
INC R1
MOV R0,#02H
MOV A,#01H
MOVX @R0,A
MOV A,#00H
MOVX @R0,A
DJNZ R2,NEXT
CLR EX0
SJMP DONE
NEXT,SETB EX0
DONE,RETI
END
可编程并行接口芯片 Intel 8155A/8156A
8155A芯片内有 256个字节 RAM,1个 14
位减 1定时 /计数器,2个 8位、双向、并行 I/O
接口 (PA,PB)和一个 6位双向、并行,I/O接口 (PC),8155A的最主要特点是内部有一个 8
位“地址锁存器”,所以可以直接与 51单片机的 P0口连接。
AD7~AD0,地址 /数据线,用于分时传送地址和数据信息,可与 51单片机的 P0口直接相连。 8位地址线可对片内 256个字节地址寻址。
IO/ M
当 IO/ M=0时,CPU可对 8155A片内 256个字节的存储器进行操作。
当 IO/ M=1时,CPU可对 8155A片内各寄存器进行操作。
CE:片选信号线(低电平有效,而 8156A是高电平有效)
ALE:地址锁存器信号,高电平有效,利用下降沿将地址信息锁住。
RD:读信号线,由 MOVX A,@DPTR
(或 MOVX A,@ Ri)指令产生。
WR:写信号线,由 MOVX @DPTR,A
(或 MOVX @ Ri,A)指令产生
RESET:复位信号线,在 RESET引脚输入一个大于 600ns的正脉冲,可与系统复位连接,
8155A总清零状态时,PA,PB,PC三个端口均处于输入方式。
TIN,定时 /计数器的计数脉冲输入引脚。
TOUT:当 14位计数器减,1”到零时,可以在该引脚上输出脉冲波形信号,输出脉冲的形状与计数器的工作方式有关。
8155A的工作方式及工作方式命令字基本输入输出方式,PA,PB,PC均可工作于此方式,
它们可各自独立与外设连接,做并行数据的输入或输出操作。
选通输入输出方式:只有 PA,PB口工作于此种方式,
此时由 PC口提供联络信号线。
ALT1方式,PA,PB口做基本 I/O,PC口做输入;
ALT2方式,PA,PB口做基本 I/O,PC口做输出;
ALT3方式,PA口做选通 I/O,PB口做基本 I/O,
PC.3~PC.5做输出;
ALT4方式,PA,PB口均做选通 I/O,PC口做联络信号线。
8155A内部定时 /计数器实际上,8155A内部有一个 14位的减 1计数器,
既可用做定时,也可用做外部计数,计数器的启、
停控制由命令字的高两位实现,计数器的工作方式由计数寄存器的高八位中的最高两位( M2,M1)
来设置初值范围为,2~3FFFH; 8155A定时器有四种工作方式,由 M2,M1两位来设定,不同工作方式下,
TOUT引脚输出的波形也不同 。
当 M2M1=00时,定时器在计数值的后半周期内使 TOUT
输出低电平,低电平的宽度与计数初值有关;若计数初值为偶数,TOUT线上低电平的宽度占计数值的一半;
若为奇数,则高电平持续时间比低电平多一个计数脉冲时间,所以,计数初值应 ≥2H,当计数器减,1”到
,0”时,TOUT输出高电平,表示计数结束。
当 M2M1=01时,计数器每当减,1”到,0”时将自动装入,
计数初值,故 TOUT线上将输出连续方波,方波周期与定时常数有关,若计数值为偶数,正、负方波是对称的,
否则,正方波将比负方波宽一个计数脉冲周期当 M2M1=10时,计数器每当减,1”到,0”时,便会在 TOUT输出一个负单脉冲,脉冲宽度与计数值无关。
当 M2M1=11时,计数器每当减,1”到,0”时,将自动装入计数初值,故 TOUT将输出一串连续的负脉冲,脉冲周期与计数值有关,而脉冲宽度与计数值无关。0INT
1INT 8155A定时器的工作是由 CPU通过程序控制的,通常需要设置三个初始化控制字,应首先设置计数常数值,
后送命令控制字,因为由命令字负责启动计数器,当计数器减,1”到,0”时做两件事:一是使状态字中 TIMR位置位( TIMR=1)可供 CPU查询;二是在 TOUT引脚上输出矩形波或脉冲,可作为定时器的溢出中断请求信号。
当 TOUT输出连续方波或连续脉冲时,可做方波发生器或脉冲发生器,不需 CPU查询或引起中断申请。
在计数器计数期间,CPU可随时读出定时器的状态,以了解定时器的工作情况,读计数器状态时,应停止计数器计数,读出的值并不直接表示外部输入的脉冲数,8155A的计数器最高计数频率为 4MHZ。
8155A的应用举例命令 /状态端口地址为 0100H
PA口地址为 0101H
PB口地址为 0102H
PC口地址为 0103H
定时器低 8位地址为 0104H
定时器高 8位地址为 0105H
片内 RAM地址范围为 0000H~00FFH
若使 8155A用作 I/O口和定时器工作方式,PA
口定义为基本输入方式,PB口定义为基本输出方式,
定时器最为方波发生器,对输入脉冲进行 24分频,
则 8155A的初始化程序如下,MOV DPTR,#0104H
MOV A,#18H
MOVX @DPTR,A
INC DPTR
MOV A,#40H( 01000000B)
MOVX @DPTR,A
MOVX DPTR,#0100H
MOV A,#C2H( 11000010B)
MOVX @DPTR,A
ORG 0100H
MAIN:MOV R0,#20H
MOV R1,#30H
MOV R7,#10H
LOOP:MOV @R0,#00H
MOV @R1,#0FFH
INC R0
INC R1
DJNZ R7,LOOP
SJMP $
END
习题 4
NEXT:JNB ACC.7,POS
NEG,INC NUM
INC R0
DJNZ R7,LOOP
SJMP STOP
POS,INC NUM+1
INC R0
DJNZ R7,LOOP
STOP:SJMP STOP
END
ORG 0100H
BLOCK DATA 32H
LONG DATA 35H
NUM DATA 30H
MOV R0,#BLOCK
MOV R7,#LONG
MOV NUM,#00H
MOV NUM+1,#00H
LOOP:MOV A,@R0
CJNE A,#00H,NEXT
INC R0
DJNZ R7,LOOP
SJMP STOP
习题 5
NEXT2:CJNE A,#32H,NEXT3
NEXT3:JNC STOP
RL A
RL A
ADD A,@R0
STOP:MOV FUNC,A
SJMP $
END
ORG 0100H
VAX DATA 30H
FUNC DATA 31H
MOV R0,#VAX
MOV A,@R0
CJNE A,#14,NEXT1
NEXT1:JNC NEXT2
RL A
SJMP STOP
习题 6
ORG 0100H
SOUCE DATA 2500H
DIST DATA 30H
MAIN:MOV DPTR,#SOUCE
MOV R0,#DIST
LOOP:MOVX A,@DPTR
MOV @R0,A
CJNE A,'$',NEXT
STOP:SJMP $
NEXT:INC DPTR
INC R0
SJMP LOOP
END
习题 7
DJNZ R6,LOOP
MOV DPTR,#2100H
MOVX A,@DPTR
MOV DPTR,#3100H
MOVX @DPTR,A
SJMP $
END
ORG 0100H
MAIN:MOV R6,#0FFH
MOV DPL,#00H
LOOP:MOV DPH,#20H
MOVX A,@DPTR
MOV DPH,#30H
MOVX @DPTR,A
INC DPTR
习题 9
NEXT1:JNB ACC.0,NEXT3
SJMP EXIT
NEXT2:INC NAOE
SJMP EXIT
NEXT3:INC PAPE
EXIT:DJNZ R7,LOOP
SJMP $
ORG 0100H
FIRST DATA 32H
PAPE DATA 30H
NAOE DATA 31H
MAIN,MOV R0,#FIRST
MOV A,@R0
MOV R7,A
LOOP,INC R0
MOV A,@R0
JNB ACC.7,NEXT1
JNB ACC.0,NEXT2
SJMP EXIT
习题 10
习题 11
NEXT1:JC NEXT2
INC R0
SJMP NEXT3
NEXT2:MOV MIN,A
INC R0
NEXT3:DJNZ R7,LOOP
SJMP $
END
ORG 0100H
BLOCK DATA 11H
MIN DATA 10H
MAIN:MOV R7,#64H
MOV R0,#BLOCK
MOV MIN,@R0
LOOP:MOV A,@R0
CJNE A,MIN,NEXT1
MOV A,@R0
ADDC A,@R1
MOV SUM+1,A
INC R0
INC R1
DJNZ R7,LOOP
SJMP $
END
ORG 0100H
FIRST DATA 30H
SECOND DATA 50H
SUM DATA 60H
MAIN:MOV R7,#06H
MOV R0,#FIRST
MOV R1,#SECOND
LOOP:MOV A,@R0
ADD A,@R1
MOV SUM,A
INC R0
INC R1
习题 12
键盘与显示技术
1 BCD拨盘接口技术十进制数输入拨盘,其输出是 BCD码
PA,PB,PC、控制端口的地址分别为:
0000H,0001H,0002H,0003H
MOV DPTR,#0003H ;8255控制口地址 → DPTR
MOV A,#92H ;8255控制字
MOVX @DPTR,A ;输出控制字 → 8255控制寄存器
DEC DPL
DEC DPL ;DPTR指向 PB口
MOVX A,@DPTR ;从 PB口取入低 2位 BCD码
MOV R0,A
DEC DPL ;DPTR指向 PA口
MOVX A,@DPTR ;从 PA口取入高 2位 BCD码
MOV R1,A
SJMP $
2 七段数码显示器( LED)接口技术
( 1) LED工作原理:
LED是利用发光二极管显示字段,并组成字型;
( 2) LED的显示方式:
LED显示方式有两种:静态显示和动态显示。
静态显示采用 MC14495芯片作为 LED的静态显示接口;
MC14495内部有 锁存、译码、驱动功能 ;
输出电流为 10mA;
输入四位二进制数,输出一位十六进制数。
MC1415,CD4511和串行输入芯片 MC14499
驱动四位 LED的 COMS ICM7212系列芯片动态显示:为了减少驱动芯片的数量,提高可靠性和降低成本,通常采用动态扫描显示
8000H 命令 /状态口
8001H A口
8002H B口(字型口)
8003H C口(字位口)
8004H 定时器低 8位口
8005H 定时器高 8位口
8000H~FFFFH 8155 I/O重叠地址区
0000H~00FFH 8155RAM基本地址区
0000H~7FFFH 8155RAM重叠地址区经对电路分析,得出 8155A各端口的地址分配如下在 RAM区建立一个显示缓冲区,每一只 LED对应缓冲区中的一个存储单元,缓冲区中各存储单元地址连续,每个存储单元存放一个欲显示的十六进制数,
CPU执行显示程序时,顺序的从缓冲区中取出数据,
并通过查表程序,将数据转换为字型码,然后由 PB
口输出。
动态显示程序清单:
ORG 0600H
DISPLAY,MOV A,#06H
MOV DPTR,#8000H
MOVX @DPTR,A
DISPLAY1,MOV R0,#70H
MOV R3,#0FEH
MOV A,R3
LD0,MOV DPTR,#8003H
MOVX @DPTR,A
MOV DPTR,#8002H
MOV A,@R0
ADD A,#13
MOVC A,@A+PC
MOVX @DPTR,A
ACALL DELAY
INC R0
MOV A,R3
JNB ACC.5,LD1
RL A
MOV R3,A
LJMP LD0
LD1,RET
DTAB,DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H
DB 8EH,0FFH,0CH,89H,7FH
DB 0BFH
DELAY,MOV R7,#02
DELAY1,MOV R6,#0FFH
DELAY2,DJNZ R6,DELAY2
DJNZ R7,DELAY1
RET
END
3 键盘接口技术
1)键输入过程与软件结构:
系统中的每一个键都对应一个功能,也就是说每一只键都对应一个有一定功能的子程序,
检测到被按下键的位置后,利用软件转换成对应的键号,并转入该键的子程序中。
消抖的方法有硬件和软件两种方法,硬件消抖主要用触发器或单稳态电路构成消抖电路;软件去抖的方法是在检测到有键按下时,利用程序延时
10ms左右,然后再次检测键的状态,确认无误后,
再执行后续操作
2)按键与 51单片机的连接编码键盘和非编码键盘编码键盘通过硬件电路,自动的产生一个与被按下键的位置有关的“键码”和一个选通脉冲(作为中断请求信号);可直接根据“键码”,转入相应键的子程序;所需程序简单,但电路复杂。在 51
单片机系统中常采用非编码键盘,由软件确定被按下键的位置。
非编码键盘与单片机的连接方式独立连接方式:每个键都单读占用一根线系统中若按键数量较少,而 I/O线较多,可采用独立式连接方式,硬件、软件均简单,容易实现;
但对于按键较多的系统,常采用行列连接方式。
行列式连接方式(矩阵式键盘):行列式键盘结构是把 I/O线分成两组,因此,m行 n列可设置
m× n个按键,这种方式可节省 I/O口线。
8155控制口地址为 7F00H;
PA口地址为 7F01H;
PB口地址为 7F02H;
PC口地址为 7F03H;
定时器低 8位口为 7F04H;
定时器高 8位口为 7F05H。
由 8155的 PA口提供8根 I/O线作为键盘列扫描线,
PC口提供4根 I/O线作为行输入线,并接上拉电阻,
构成4 × 8行列式结构键盘。首先判断“有键闭合否?”,其方法是由 PA口输出全扫描字 00H;从 PC
口读入行输入状态,若 PC0~3全为“1”,则无键按下,继续扫描,若不为全“1”,则说明有键按下,转入去抖延时程序,延时一段时间后再次判断状态,如仍处于闭合状态,则确认为有键按下,
转入“判闭合键键号”程序;否则按键抖动处理。
求按下键的键号:
当判断完确实有键闭合后,下一步要做的工作是被按下键的键值(键号);每一个键都对应一个键号(0~ 31),4行 × 8列,每行都有一个首键号,它们分别是0、8,16,24;键号的确定方法是“行首键号”+“被按下键的列号”=键号,实现的方法是利用逐位扫描的算法实现。
子程序出口条件:累加器A返回键号,
8155初始化程序如下(置 8155PA口为基本输出口、
PC口为基本输入口)。
MOV DPTR,#7F00H
MOV A,#00000001B
MOVX @DPTR,A
键盘扫描子程序如下:
判键子程序 KJA
KJA,MOV DPTR,#7F01H ;指向 8155A口
MOV A,#00H ;送全扫描字 00H
MOVX @DPTR,A
INC DPTR ;指向 8155C口
INC DPTR
MOVX A,@DPTR ;读入行输入状态
CPL A ;取反,以高电平表示有键按下
ANL A,#0FH ;屏蔽高 4位
RET
此程序出口条件:累加器A返回键盘状态。
(A) ≠0时有键按下,否则无键下。
KEY,LCALL KJA ;调用判键子程序
JNZ KJ1 ;有键按下,转消抖延时
LJMP KEY ;无键按下,返回继续查询
KJ1,LCALL DELAY10ms ;延时 10去抖
LCALL KJA ;再次判键
JNZ KJ2 ;确有键按下,转逐列扫描形成键值
LJMP KEY ;是抖动返回
KJ2,MOV R2,#0FEH ;列扫描初值送入 R2
MOV R4,#00H ;初始列号送入 R4
KJ4,MOV DPTR,#7F01H ;送列扫描字入 PA口
MOV A,R2
MOVX @DPTR,A
INC DPTR ;从 PC口读入行输入状态
INC DPTR
MOVX A,@DPTR
JB ACC.0,ONE
MOV A,#00H
LJMP KJP
ONE,JB ACC.1,TWO
MOV A,#08H
LJMP KJP
TWO,JB ACC.2,THR
MOV A,#10H
LJMP KJP
THR,JB ACC.3,NEXT
MOV A,#18H
KJP,ADD A,R4
PUSH ACC
KJ3,LCALL KJA
JNZ KJ3
POP ACC
RET
NEXT,INC R4
MOV A,R2
JNB ACC.7,KJ5
RL A
MOV R2,A
LJMP KJ4
KJ5,LJMP KEY
为了解脱 CPU负担,也常采用专用的可编程键盘 /显示器接口芯片 Intel8279,它独立于 CPU工作,
并对显示 /键盘自动扫描、识别键盘上闭合键的键号,
大大提高 CPU工作效率,是被广泛应用的方式之一。
2S方波查询法:
ORG 0000H
LJMP START
ORG 1000H
START,MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
MOV R7,#14H
LOOP:JBC TF0,NEXT1
SJMP LOOP
NEXT1,DJNZ R7,NEXT2
CPL P1.0
MOV R7,#14H
NEXT2,MOV TH0,#3CH
MOV TL0,#0B0H
SJMP LOOP
ORG 0000H
LJMP START
ORG 1000H
START,MOV TMOD,#60H
MOV TH1,#64H
MOV TL1,#64H
SETB EA
SETB ET1
SETB TR1
LOOP:SJMP LOOP
ORG 001BH
CPL P1.7
RETI
中断法