第8章 单片机接口技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、简单并行输出接口的扩展
由数据锁存器实现的并行I/O口扩展
常用电路芯片: 74LS 273、377 、244、373等
1、用74LS273扩展并行输出口
带清除功能的8D触发器,MR =0 → Q=0 上升沿触发, MR=1, CLK =↑→ Q=D 具有数据锁存功能, MR=1, CLK=1→Q=QD 74LS273
(LE)
允许(G)
(/OE)
用法:OE端接地(输出端常通),由LE端的电平控制D与Q 的导通或关断
74LS373典型应用——存储器扩展
ALE引脚电平(地址锁存使能输出)——373的下降沿触发源
8.2 简单并行IO口扩展
当系统需要较多I/O端口时,往往需要进行I/O端口的扩展。
扩展I/O端口可以通过各种集成接口芯片: 可编程I/O扩展芯片(如8255、8155等)和具有锁存或缓 冲功能的接口芯片(如74LS273、74LS244等)。
一、8255A结构
A组 控制
A组 端口A
PA0~PA7
D0~D7
数据 总线 缓冲器
内部数据 线
A组 端口C 上部 B组 端口B
PC4~PC7
RD WR A0 A1 CS RESET
B组 控制 读写 控制 逻辑
PB0~PB7
内部控制 线
B组 端口C 下部
PC0~PC3
CPU接口
内部逻辑
外设接口
二、8255A与80C51的典型接线方法(总线方式)
80C51
/WR /RD P2.7 P0.0 P0.1
8255A
/WR /RD /CS A0 A1
寄存器的地址:
0xxx 0xxx 0xxx 0xxx
xxxx xxxx xx00 → 7FFCH xxxx xxxx xx01 → 7FFDH xxxx xxxx xx10 → 7FFEH xxxx xxxx xx11 → 7FFFH
2、用74LS244扩展并行输入口
三态输出的双4位总线缓冲器 无锁存功能
1G = 0 → Y = A 1G = 1 → 高阻态
接线:A1-A4接外设输入端; Y1-Y4接单片机IO口; 1G接控制端
实例2
分析如下电路接线原理,编程实现键控LED的功能。
【分析】 芯片273和244的片选均由 P2.0实现,故访问地址均 为 xxxx xxx0 xxxx xxxx ( 0xFEFF ) 读操作:/RD=0,/WR=1,故U3:A=0, U3:B=0,芯片244被选中。 写操作: /RD=1,/WR=0,故U3:A=1, U3:B=1,CLK=0,芯片273被选中。
二、D/A转换器的主要技术指标 (1)、分辨率 输入数字量的最低有效位发生变化时,所对应的输 出模拟量的变化量。
常用 FS 2n 表示: n:二进制位数 FS:满量程输入值
(2)、偏移误差 它是指输入数字量为0时,输出模拟量对0的 偏移值 (3)、线性度 是指D/A转换器的实际转移特性与理想直线之间 的最大误差或最大偏移
C51访问外部RAM的方法2
将访问的外部端口用指针变量表示,指针变量的存储类型 设置为xdata,在程序中为指针变量设置访问单元。 例如,同样针对上述举例,程序设计如下:
unsigned char xdata *PORT; //定义xdata指针变量 unsigned char temp1,temp2; …… PORT = 0x1000; //指向0x1000地址 …… temp = *PORT; //读0x1000端口 *PORT = temp2; //写0x1000端口 ……
I4 R I3 2R 1 0
I3 R I2 2R 1 0
I2 R I1 2R 1 0
I1 R I0 2R 1 0
I0
2R 1 Rfb IO1 IO2
2R
0
+
VO
D7
D6
D5
D4
D3
D2
D1
n 1
D0
运放输出电压 V
O
I 01 R fb B D i 2
0
i
B R fb
2R 1 Rfb IO1 IO2
2R
0
+
VO
D7
D6
D5
D4
D3
D2
D1
D0
总电流 分支电流
I
V
REF
R
……
n 1 n 1
输出电流 I D i I i D i
01 0 0
I
2
ni
I VREF
I7
I7 R I6 2R 1 0
I6 R I5 2R 1 0
I5 R I4 2R 1 0
一、访问外设端口的软件设置
扩展端口的地址需要占用外部RAM空间(0000~FFFFH) 对于汇编语言,需要利用MOVX指令访问端口 MOVX A,@DPTR MOVX A,@Ri (读,RD)
MOVX @DPTR,A
MOVX @Ri,A
(写,WR)
规则——都要使用16位地址→P0+P2 DPTR:高8位地址(DPH)→P2, 低8位地址(DPL)→P0 Ri: 当前P2值=高8位地址 ,低8位地址(Ri) →P0 例如:MOV DPTR,#1000H MOVX A,@DPTR ;指针赋值 ;P2←10H,P0← 00H
V
REF
Βιβλιοθήκη Baidu
1
R
2
n
转换原理——利用电子开关形成T型电阻网络的输出电流 I01,再利用反相运算放大器转换成输出电压Vout。
V
O
I 01 R fb B D i 2
0
n 1
i
数字输入 00000000 00000001 …… 01111111 10000000 10000001 …… 11111111
8.3 可编程并行接口芯片8255A
可编程接口——功能可由计算机指令改变的接口芯片 特点:使用灵活,不需要或只需要很少的外加硬件 常用芯片(INTEL系列): 8259——可编程中断控制器 8253——可编程计数/定时器 8250——可编程串行接口(异步) 8251——可编程串行接口(异步+同步) 8255——可编程并行扩展接口 8279——可编程键盘显示接口 8237——可编程DMA控制器 8155——可编程多功能接口
第8章 单片机接口技术
8.1 单片机的系统总线
8.2 简单并行IO口扩展
8.3 可编程并行接口芯片8255A 8.4 数模转换芯片DAC0832及其接口设计 8.5 模数转换芯片ADC0809及其接口设计 8.6 开关量功率接口技术
8.1 单片机的系统总线
一、三总线结构
外部总线方式的典型应用——存储器扩展
P2 P0
(若其余位均取1,则 U2 = 0x7fff)
为满足CLK要求→采用/WR引脚信号
ALE /PSEN
/WR
P0
P2
地址
数据
地址
数据 地址
地址
P2.7为0时,或门→ “解锁”;/WR →CLK的选通要求
完整程序 #include <reg51.h> #include <absacc.h> #define port XBYTE [0x7FFF] unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};//设置数码块显示数据表 void delay(void) { unsigned int i; for(i=0;i<40000;i++); } void main(void) { unsigned int i; while(1) { for(i=0;i<10;i++) { port=table[i]; //读取数据,通过74273输出显示 delay(); } } }
8.4 数模转换芯片DAC0832及其接口设计
温度测控原理示意图
→传感器测温→CPU决策→变压器输出→电炉丝加热→ 1、CPU怎样识别模拟量? 2、CPU怎样控制模拟量? →模拟/数字转换(AD)
→数字/模拟转换(DA)
一、数模转换器的工作原理
DA转换原理(电流输出型)
I VREF
I7 I7 R I6 2R 1 0 I6 R I5 2R 1 0 I5 R I4 2R 1 0 I4 R I3 2R 1 0 I3 R I2 2R 1 0 I2 R I1 2R 1 0 I1 R I0 2R 1 0 I0
MOVX指令访问端口(读)的时序
ALE /PSEN /RD
P0 P2
地址
地址
数据
地址 地址
数据
要点:P0分时输出低8位地址和8位数据; 写端口时RD(P3.7)引脚自动产生负脉冲信号
C51访问外部RAM的方法1
在程序中加入专用语句: #include <absacc.H> //含有宏定义的包含语句,用 其定义的宏来访问绝对地址 #define 变量名 XBYTE [地址常数] //地址定义语句 此后,便可通过对已定义变量访问所需的端口 例如,对占用片外RAM 1000H的端口进行读操作: #include <absacc.h> #define port XBYTE [0x1000]; unsigned char temp1,temp2; …… temp1 = port; //读端口操作 port = temp2; //写端口操作 ……
(CLK) (MR)
典型用法:MR接Vcc,利用CLK的上跳沿选通,低电 平进入锁存状态
实例1
利用74LS273扩展单片机的输出端口,并实现LED 数码管顺序显示0-9字符的功能。
【分析】 硬件电路的关键在于既要能体现出端口地 址要求,又要能满足CLK选通要求 地址分析:
U2地址:0xxx xxxx xxxx xxxx
完整程序
#include <reg51.h> unsigned char xdata *PORT; //定义访问的外部端口变量 void main() { unsigned char tmp; PORT=0xFEFF; //根据原理图,定义外部端口的地址 while(1){ tmp = *PORT; //从74244端口读取数据 *PORT =tmp; //将读取的数据通过74273锁存输出, //通过硬件电路在发光二极管上显示 } }
模拟输出 0V 0.039V … 4.96V 5.00V 5.039V … 9.96V
B R fb
V
REF
1
R
2
n
若取 n=8位 Rfb = R VREF=10V
满量程输出电压 = VREF-VLSB LSB(Least Significant Bit)——最低有效位 MSB(Most Significant Bit)——最高有效位
二、地址锁存与地址译码
地址锁存器——74LS373,74LS273,74LS377
思路:
1、P0口先将低8位地址信号锁存在373中; 2、373的输出端与输入端(P0口)隔离;
3、373送低8位地址信号+ P0口送8位数据信号+ P2口送高8位地址信号
同时产生16位地址信号+8位数据信号
74LS373——带有三态输入/出门的8D触发器
三、倒T型电阻网络集成DAC
DAC0832的主要性能参数
① ② ③ ④ ⑤ 并行8位DAC; TTL标准逻辑电平; 可单缓冲、 双缓冲或直通数据输入 单一电源供电5~15 V; 参考电压源-10~+10 V;
PA口 PB口 PC口 控制口
实例3
用8255A的PA口作为输出口, PB口作为输入口。将 PB口读入的开关信号送PA口外接的8位LED上显示 出来。
完整程序
#include <absacc.h> #include <reg51.h> #define COM8255 XBYTE[0x7FFF] //控制寄存器地址 #define PA8255 XBYTE[0x7FFC] //端口A的访问物理地址 #define PB8255 XBYTE[0x7FFD] //端口B的访问物理地址 unsigned char temp; void main(void) { COM8255=0x82; //初始化8255内部寄存器,将B口输入,A口输出,方式0。 while(1) { temp = PB8255; //读入B口数据 PA8255 = temp; //从A口输出 } }
单片机端口访问要点汇总:
扩展端口的地址占用片外RAM空间; 读、写端口需要使用寄存器间接寻址指令; 读、写端口需要使用16位地址(P0为低8位,P2为高8位); P0口分时输出低8位地址和8位数据; 采用C51读写端口时,需要包含<absacc.h>头文件; 采用宏定义端口: #define 变量名 XBYTE [地址常数] 采用地址指针定义端口: xdata *变量名