880 likes | 1.05k Views
第九章 应用系统配置及接口技术. 9.1 并行 I/O 口的扩展 9.1.1 简单并行 I/O 口的扩展 9.1.2 8155 带 RAM 和定时器 / 计数器的可编程并行接口芯片 9.2 人 - 机通道配置与接口技术 9.2.1 键盘接口及处理程序 9.2.2 LED 显示器接口及显示程序 9.2.3 串行口控制的键盘 /LED 显示器接口电路 9.3 A/D 转换器及接口技术 9.4 D/A 转换器及接口技术. 9.1 并行 I/O 口的扩展. 9.1.1 简单并行 I/O 口的扩展 在稍微大的系统,单片机片的并行口便不够用,需要扩展。
E N D
第九章 应用系统配置及接口技术 • 9.1 并行I/O口的扩展 • 9.1.1 简单并行I/O口的扩展 • 9.1.2 8155带RAM和定时器/计数器的可编程并行接口芯片 • 9.2 人-机通道配置与接口技术 • 9.2.1 键盘接口及处理程序 • 9.2.2 LED显示器接口及显示程序 • 9.2.3 串行口控制的键盘/LED显示器接口电路 • 9.3 A/D转换器及接口技术 • 9.4 D/A转换器及接口技术
9.1并行I/O口的扩展 9.1.1 简单并行I/O口的扩展 在稍微大的系统,单片机片的并行口便不够用,需要扩展。 所谓简单扩展,就是使用通用的74系列的TTL或4000系列的CMOS芯片扩展。
9.1.1 简单I/O接口的扩展方法 常用74LS244作输入接口芯片,起缓冲作用;用74LS273作输出接口芯片,起锁存作用。
1G,2G为H时,Y为高阻; 1G,2G为L 时,Y=A
扩展的输入输出口地址均为: P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 ⅹⅹⅹⅹⅹⅹⅹⅹ 0 ⅹⅹⅹⅹⅹⅹ 除了P2.0以外均取1,则扩展的输入输出口地址写成16进制数均为: FEFFH 上面电路的功能是:按下某键,对应的LED发光。 其程序为: MOV DPTR,#0FEFFH LP:MOVX A,@DPTR MOVX @DPTR,A SJMP LP
9.1.2 扩展8155可编程外围 并行接口芯片 关于Intel的8155/8156:是一多功能的可编程外围接口芯片,内部资源有256B的RAM,2个8位、1个6位的I/O口和1个14位的“减1”计数器。40脚双列直插封装。
2. 8155的RAM和I/O口地址 其地址按片外RAM统一编址(16位)。 CE、IO/M接单片机的高8位地址。 一、I/O口(即片内寄存器)地址CE=0、IO/M=1,低3位选择寄存器
二、256B RAM的地址 CE=0、 ,由高8位地址控制;低8位选择RAM的256个存储单元。 3 8155的寄存器(6个)
输入 输出 PC3~PC5出 一、命令寄存器 地址:*****000B 工作控制
二、状态寄存器 1、地址:*****000B 2、格式及各位的意义
三、PA寄存器 是PA口引脚PA0~PA7的映射 地址:*****001B 四、PB寄存器 是PB口引脚PB0~PB7的映射 地址:*****010B 五、PC寄存器 是PC口引脚PC0~PC7的映射 地址:*****011B
六、定时器/计数器寄存器 是一14位计数器,对应有两个寄存器,最高两位设定输出波形。 1、地址:两个寄存器的地址分别为:*****100B 2、寄存器格式 *****101B
4 8155芯片的使用 一、作片外256B RAM用 低8位地址范围为:00H~FFH 二、作扩展I/O口用 PA口、PB 口、PC 口 注意:工作方式、地址 三、作定时器扩展用 一般先写计数常数,再写命令字。
5 8031与8155的接口及简单编程 一、8031与8155的连接方法
二、8155的基本操作程序段 1、对8155中的RAM进行操作 例1 (1)向8155RAM中的5FH单元写入数据32H; (2)从8155RAM中的98H单元读取数据。 程序段如下: (1)写数据: MOV DPTR,#7E5FH MOV A,#32H MOVX @DPTR,A (2) 读数据: MOV DPTR,#7E98H MOVX A ,@DPTR
2、对8155中的I/O口和定时器进行操作 例2 设置8155,使用I/O口和定时器:使A口为基本输入方式,B口为基本输出方式;定时器作方波发生器,对输入的脉冲进行24分频。试编程实现之。 思路:先对定时器赋初值和设定输出波形,向定时器/计数器寄存器中写;再设定A、B口的工作方式和传输方向,并启动定时器工作,向命令寄存器中写。 程序段如下:
(1)对定时器赋初值和设定输出波形: 定时器/计数器寄存器地址:7F04H、7F05H MOV DPTR,#7F04H MOV A,#24 MOVX @DPTR,A INC DPTR MOV A,#01000000B MOVX @DPTR,A (2)设定A、B口的工作方式并启动定时器工作: 命令寄存器地址:7F00H MOV DPTR,#7F00H MOV A,#11000010B MOVX @DPTR,A
9.2 人-机通道配置与接口技术 • 9.2.1 键盘接口及处理程序 • 9.2.2 LED显示器接口及显示程序 • 9.2.3 串行口控制的键盘/LED显示器接口电路
9.2.1 键盘接口及处理程序 • 键盘可以分为独立连接式和行列式(矩阵式)两类,每一类按其译码方法又都可分为编码及非编码两种类型. • 1)独立式非编码键盘接口及处理程序
+5v P1.0 P1.1 P1.7 键盘接口形式: (1)独立式键盘电路: 独立式键盘电路:每个按键单独占有一根I/O接口引线。 优点:电路简单;缺点:当键数较多时,要占用较多的I/O线. 程序P/231
“ 1 ” “ 0 ” 抖动时间 <10ms <10ms 开关动作时间 >100ms +5v I/O 接 口 单 片 机 & +5v 开关 消除抖动电路 & 后沿抖动 前沿抖动 检查键盘是否有键被按下,消除按键抖动。 硬件电路消除抖动或软件消除抖动。
下列程序为省略了软件去抖动措施的程序 P0F:LJMP PROM0 P1F:LJMP PROM1 ………. P7F:LJMP PROM7 PROM0:…. LJMP START PROM1:….. LJMP START ….. PROM7:…. LJMP START Start:mov a,#0ffh mov P1,a Mov a,P1 PL1:JNB ACC.0,P0f JNB ACC.1,P1F JNB ACC.2,P2F JNB ACC.3,P3F JNB ACC.4,P4F JNB ACC.5,P5F JNB ACC.5,P6F JNB ACC.6,P7F LJMP START
例9-1 :设计一个有4个独立式按键盘接口,并编写键扫 描程序 CPL A ANL A,#0FH KEY1:JNZ KEY1 LCALL D-10MS MOV A,B JB ACC.0,PKEY1 JB ACC.1,PKEY2 JB ACC.2,PKEY3 JB ACC.3,PKEY4 EKEY:RET PKEY1:LCALL K1 RET PKEY2:LCALL K2 RET PKEY3:LCALL K3 RET PKEY4:LCALL K4 RET D-10MS:MOVR7,#10H DS1:MOV R6,#0FFH DS2:DJNZ R6,DS2 DJNZ R7,DS1 RET KEY:MOV P1,#0FFH MOV A,P1 CPL A ANL A,#0FFH JZ KEY LCALL D-10MS MOV A,P1 CPL A ANL A,#0FH JZ KEY MOV B,A MOV A,P1
C0 C1 R0 R1 +5v 键盘 I/O接口 0 1 (2)矩阵式键盘:
非编码式键盘识别按键的方法有两种: 一是行扫描法, 二是线反转法。 • 1) 行扫描法 • 通过行线发出低电平信号, 如果该行线所连接的键没有按下的话, 则列线所接的端口得到的是全“1”信号, 如果有键按下的话, 则得到非全“1”信号。 • 为了防止双键或多键同时按下, 往往从第 0 行一直扫描到最后 1 行, 若只发现 1 个闭合键, 则为有效键, 否则全部作废。 • 找到闭合键后, 读入相应的键值, 再转至相应的键处理程序。
2) 线反转法 线反转法也是识别闭合键的一种常用方法, 该法比行扫描速度快, 但在硬件上要求行线与列线外接上拉电阻。 先将行线作为输出线, 列线作为输入线, 行线输出全“0”信号, 读入列线的值, 然后将行线和列线的输入输出关系互换, 并且将刚才读到的列线值从列线所接的端口输出, 再读取行线的输入值。那么在闭合键所在的行线上值必为 0。这样, 当一个键被按下时, 必定可读到一对唯一的行列值。
键盘处理程序任务: 1.键输入: 检查键盘是否有键被按下,消除按键抖动。确定被按键的键 号,获取键号。 硬件电路消除抖动或软件消除抖动。 • 键译码: 键号为键盘位置码,根据键号查表得出被按键的键值。 键值:数字键0~9; 字符键0AH~0FH; 功能键10H~ 。 键码=行首键号+列号 (键号必须依次是从左至右书写) 或键码=列首键号+行号 (键号必须依次是从上至下书写)
N 有按键信号? Y 延时等待10ms N 仍有按键信号? Y 键盘处理 N 按键释放? Y 3.键处理: 根据键值转移到不同程序段。 若键值属于数字、字符键,则调用显示数字和字符的子程序。 若键值属于功能键,则进行多分支转移,执行各个功能程序段。 二、键盘接口方法: 1、利用单片机本身的并行口; 2、利用单片机本身的串行口; 3、利用通用接口芯片8155、8255等; 4、利用专用接口芯片8279等。 三、键盘接口的控制方式: 1、随机方式:每当CPU空闲时执行键盘扫描程序。 2、中断方式:键的按下引起中断后,单片机对键盘进行扫描。 3、定时方式:单片机定时地对键盘进行扫描。
有按键输入? 延时消抖 确有按键? 键扫描求键号 延时等待 按键释放? 键译码求键值 是数字键? 跳转各功能程序 修改显示缓冲区 按键处理程序: N Y N Y N Y N Y
键码=行首键号+列号 (键号必须依次是从左至右书写) 或键码=列首键号+行号 (键号必须依次是从上至下书写) 6 7 0 1 14 15 8 9 接口应用: 1、使用8155作键盘接口: 扫描法:列线输出,行线输入。 列线逐列输出0,某行有按键,行线输入就为0; 若无按键,行线输入全部为1。 P2.7=0,P2.0=1: A口地址为:7F01H; C口地址为:7F03H。
2. 键盘接口电路 图 采用8155的键盘接口电路
判定有无键闭合的子程序: KS1: MOV DPTR,#7F01H MOV A,#00H ;A口送00H MOVX @DPTR,A INC DPTR INC DPTR ;建立C口地址 MOVX A,@DPTR ;读C口 CPL A;A取反,无键按下则全“0” ANL A,#0FH ;屏蔽A高半字节(C口只4位) RET 执行KS1子程序的结果是:有闭合键则(A)≠ 0; 无闭合键则(A)=0。 CPL A;负逻辑不直观,常采取行列线加反相器或 软件求反的方法把键盘改成正逻辑。
KEY1:ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 ;有键按下时,(A)≠0转消抖延时 KEY2:ACALL TM6ms AJMP KEY1 ;无键按下返回 LK1: ACALL TM12ms ;调12 ms延时子程序 ACALL KS1 ;查有无键按下,若有则真有键按下 JNZ LK2 ;键(A)≠ 0逐列扫描 AJMP KEY2 ;不是真有键按下,返回 LK2:MOV R2,#0FEH ;初始列扫描字(0列)送入R2 MOV R4,#00H ;初始列(0列)号送入R4 LK4:MOV DPTR,#7F01H ;DPTR指向8155PA口 MOV A,R2 ;列扫描字送至8155PA口 MOVX @DPTR,A INC DPTR ;DPTR指向8155PC口 INC DPTR 键盘扫描子程序如下:(硬件线路如图,8155的A口、B口、C口和控制口地址分别为7F01H、7F02H、7F03H,设8155A已在主程序中初始化。已设定为A口方式0输出,C口的低4位方式0输入。)
MOVX A,@DPTR ;从8155 PC口读入行状态 JB ACC.0,LONE ;查第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,行首键码#00H→A AJMP LKP ;转求键码 LONE: JB ACC.1,LTWO ;查第1行无键按下,转查第2行 MOV A,#08H ;第1行有键按下,行首键码#08H→A AJMP LKP ;转求键码 LTWO:JB ACC.2,LTHR ;查第2行无键按下,转查第3行 MOV A,#10H ;第2行有键按下,行首键码#10H→A AJMP LKP ;转求键码 LTHR:JB ACC.3,NEXT ;查第3行无键按下,转该查下一列 MOV A,#18H ;第3行有键按下,行首键码#18H→A LKP: ADD A,R4 ;求键码,键码=行首键码+列号 PUSH ACC ;键码进栈保护 LK3: ACALL KS1 ;等待键释放 JNZ LK3 ;键未释放,等待 POP ACC ;键释放,键码→A RET ;键扫描结束,出口状态(A)=键码
NEXT: INC R4 ;准备扫描下一列,列号加1 MOV A,R2 ;取列扫描字送累加器A JNB ACC.7,KEND ;判断8列扫描否?扫描完返回 RL A ;扫描字左移一位,变为下一列扫描字 MOV R2,A ;扫描字送入R2保存 AJMP LK4 ;转下一列扫描 KEND:AJMP KEY1 KS1: MOV DPTR,#7F01H;DPTR指向8155PA口 MOV A,#00H ;全扫描字→A MOVX @DPTR,A ;全扫描字送往8155PA口 INC DPTR ;DPTR指向8155PC口 INC DPTR MOVX A,@DPTR ;读入PC口行状态 CPL A ;变正逻辑,以高电平表示有键按下 ANL A,#0FH ;屏蔽高4位,只保留低4位行线值 RET ;出口状态:(A)≠0时有键按下
TM12ms:MOV R7,#18H ;延时12 ms子程序 TM: MOV R6,#0FFH TM6: DJNZ R6,TM6 DJNZ R7,TM RET TM6ms: MOV R7,#0CH ;延时6 ms子程序 TM2: MOV R6,#0FFH TM62: DJNZ R6,TM6 DJNZ R7,TM RET
2、使用8279作键盘接口:P207图7.36 74LS156为双2-4译码器/分配器 0 1 3 4 8 6 5 7 键码=行首键号+列号 (键号必须依次是从左至右书写) P2.7=0时: A0=P2.0=1:命令口地址为:7FFFH; A0=P2.0=0:数据口地址为:7EFFH。 (程序略)
3、使用中断方式作键盘接口: 12 13 14 15 8 9 10 11 4 5 6 7 0 1 2 3 键码=列首键号+行号 (键号必须依次是从上至下书写) 当有键按下时,INT1为低,向CPU发出中断申请,在中断服务 程序中除完成键识别、键功能处理外,仍须有清除键抖动等功能。
BUFF EQU 30H • KEYADR:MOV A,SBUF • CJNE A,#0FH,KYARD1 • AJMP DIGPRO • KYARD1:JC DIGPRO • KEYTBL:MOV DPTR,#JMPTBL • CLR C • SUBB A,#10H • RL A • JMP @A+DPTR • JMPTBL:AJMP AAA • AJMP BBB • AJMP CCC • AJMP DDD • …….
下面的程序是用行扫描法进行键扫描的程序, 其中KS1 为判键闭合的子程序。 有键闭合时(A)=0。 DIR为数码显示器扫描显示子程序, 执行一遍的时间约6 ms。 程序执行后, 若键闭合, 键值存入A中, 键值的计算公式是: 键值=行号×4+列号; 若无键闭合, 则A中存入标志FFH。 KEY1:LCALL KS1 ; 检查有无闭合键? JNZ LK1 ; (A)=0, 有键闭合则转 LJMP LK8 ; 无闭合键则返回 LK1: LCALL DIR ; 延时 12 ms LCALL DIR ; 清抖 LCALL KS1 ; 再检查有键闭合否? JNZ LK2 ; 有键闭合则转 LJMP LK8 ; 无键闭合则返回
LK2: MOV R3, #00H ; 行号初值送R3 MOV R2, #FEH ; 行扫描初值送R2 LK3: MOV DPTR, #0101H ; 指向 8155 口A MOV A, R2 ; 行扫描值送A MOVX @DOTR, A ; 扫描 1 行 INC DPTR INC DPTR ; 指向 8155 口C MOVX A, @DPTR ; 读入列值 ANL A, #0FH ; 保留低 4 位 MOV R4, A ; 暂存列值 CJNZ A, #0FH, LK4 ; 列值非全“1”则转 MOV A, R2 ; 行扫描值送A
JNB ACC.7, LK8 ; 扫至最后一行则转 • RL A ; 未扫完, 则移至下一行 • MOV R2, A ; 行值存入R2 中 • INC R3 ; 行号加 1 • SJMP LK3 ; 转至扫描下一行 • LK4: MOV A, R3 ; 行号送入A • ADD A, R3 ; 行号×2 • MOV R5, A • ADD A, R5 ; 行号×4 • MOV R5, A ; 存入R5 中 • MOV A, R4 ; 列值送A
LK5: RRC A ; 右移一位 JNC LK6 ; 该位为 0 则转 INC R5 ; 列号加 1 SJMP LK5 ; 列号未判完则继续 LK6: MOV 20H, R5; 存键值 LK7: LCALL DIR ; 扫描一遍显示器 LCALL KS1 ; 发扫描信号 JNZ LK7 ; 键未释放等待 LCALL DIR ; 键已释放 LCALL DIR ; 延时 12 ms, 清抖 MOV A, 20H ; 键值存入A中 KND: RET
LK8: MOV A, #FFH ; 无键标志FFH存入A中 RET KS1: MOV DPTR, #0101H ; 判键子程序 MOV A, #00H ; 全扫描信号 MOVX @DPTR, A ; 发全扫描信号 INC DPTR INC DPTR ; 指向8155口C MOVX A, @DPTR ; 读入列值 ANL A, #0FH ; 保留低4位 ORL A, #F0H ; 高4位取“1” CPL A ; 取反, 无键按下则全“0” RET
9.2.2 LED显示器接口及显示程序 1. LED显示器结构与原理