第 9章 常用外围设备接口电路本章要点,
LED数码管及编码方式静态显示方式及其典型应用电路动态显示方式及其典型应用电路虚拟 I2C总线串行显示电路键盘去抖动和连接,控制方式独立式按键及其接口电路矩阵式键盘及其接口电路并行 A/D ADC0809及其接口电路串行 A/D ADC0832及其接口电路
I2C串行 A/D典型应用电路
DAC0832及其接口电路
I2C串行 D/A典型应用电路开关量驱动输出接口电路
§ 9-1 LED数码管显示接口一,LED数码管
LED显示器的扩展 (结构 )
LED数码管的 结构,①共阳与共阴
@ 单片机系统扩展 LED数码管时 多用 共阳 LED:
共阳数码管每个段笔画是用低电平 (“0”)点亮的,要求驱动功率很小;而共阴数码管段笔画是用高电平 (“0”)点亮的,
要求驱动功率较大。
@ 通常每个段笔画要串一个数百欧姆的 降压电阻 。
公共 阳 极
h g f e d c b a
a b
cd
g
e
f
h
公共 阴 极
h g f e d c b a
a b
cd
g
e
f
hh g f …… a
h g f …… a
高电平点亮低电平点亮接高电平接地
LED数码管的软件译码八段 LED数码管 段代码编码表 (连线不同可有多种表 ):
公共阳极
h g f e d c b a
a b
cd
g
e
f
h
公共阴极
h g f e d c b a
a b
cd
g
e
f
hh g f …… a
h g f …… a
高电平点亮低电平点亮接高电平接地字形 0 1 2 3 4 5 6 7 8 9 黑共阳 0C0 0F9 0A4 0B0 99 92 82 0F8 80 90 0FF
共阴 3F 06 5B 4F 66 6D 7D 07 7F 6F 00
LED数码管分类:
按 其内部结构可分为 共阴型 和 共阳型 ;
按 其外形尺寸有多种形式,使用较多的是 0.5"和 0.8";
按 显示颜色也有多种形式,主要有 红色和 绿色 ;
正向压降一般为 1.5~ 2V,额定电流为
10mA,最大电流为 40mA。 静态显示 时取 10mA
为宜,动态扫描显示,可加大脉冲电流,但一般不超过 40mA。
按 亮度强弱可分为 超亮,高亮 和 普亮 。
二,LED数码管编码方式表 9-1 共阴和共阳 LED数码管几种八段编码表显示数字共阴顺序小数点暗 共阴逆序小数点暗 共阳顺序小数点亮共阳顺序小数点暗Dp g f e d c b a 16进制 a b c d e f g Dp 16进制
0 0 0 1 1 1 1 1 1 3FH 1 1 1 1 1 1 0 0 FCH 40H C0H
1 0 0 0 0 0 1 1 0 06H 0 1 1 0 0 0 0 0 60H 79H F9H
2 0 1 0 1 1 0 1 1 5BH 1 1 0 1 1 0 1 0 DAH 24H A4H
3 0 1 0 0 1 1 1 1 4FH 1 1 1 1 0 0 1 0 F2H 30H B0H
4 0 1 1 0 0 1 1 0 66H 0 1 1 0 0 1 1 0 66H 19H 99H
5 0 1 1 0 1 1 0 1 6DH 1 0 1 1 0 1 1 0 B6H 12H 92H
6 0 1 1 1 1 1 0 1 7DH 1 0 1 1 1 1 1 0 BEH 02H 82H
7 0 0 0 0 0 1 1 1 07H 1 1 1 0 0 0 0 0 E0H 78H F8H
8 0 1 1 1 1 1 1 1 7FH 1 1 1 1 1 1 1 0 FEH 00H 80H
9 0 1 1 0 1 1 1 1 6FH 1 1 1 1 0 1 1 0 F6H 10H 90H
【 例 9-1】 已知显示数存在内 RAM 30H( 高位 ),
31H中,试将其转换为 5位共阴字段码 ( 顺序 ),
存在以 30H( 高位 ) 为首址的内 RAM中 。
⑴ 从显示数中分离出显示的每一位数字方法是将显示数除以十进制的权显示数 转换 为显示字段码的 步骤,
⑵ 将分离出的显示数字转换为显示字段 码方法是查表
SPRT,MOV R0,#30H ;置万位 BCD码间址
MOV A,30H ;置被除数
MOV B,31H ;
MOV R6,#27H ;置除数 10000 = 2710H
MOV R5,#10H ;
LCALL SUM ;除以 10000,万位商存 30H,余数存 A,B
MOV R6,#03H ;置除数 1000 = 03E8H
MOV R5,#0E8H ;
INC R0 ;指向千位商间址 (31H)
LCALL SUM ;除以 1000,千位商存 31H,余数存 A,B
MOV R6,#0 ;置除数 100
MOV R5,#100 ;
INC R0 ;指向百位商间址 (32H)
LCALL SUM ;除以 100,百位商存 32H,余数存 A(B=0)
MOV B,#10 ;置除数 10
DIV AB ;除以 10
INC R0 ;指向十位商间址 (33H)
MOV @R0,A ;十位商存 33H
XCH A,B ;读个位数
INC R0 ;指向个位间址 (34H)
MOV @R0,A ;个位存 34H
RET ;
解:连续调用下列二个子程序即可。
⑴ 分离显示数字子程序说明,SUM是 16位除以 16位子程序,(A,B)÷ (R6,R5)=商 @R0,余数 (A,B)。 (参阅例 4-9)
⑵ 转换显示字段码子程序
CHAG,MOV DPTR,#TAB ;置共阴字段码表首址
MOV R0,#30H ;置显示数据区首址
CGLP,MOV A,@R0 ;取显示数字
MOVC A,@A+DPTR ;读相应显示字段码
MOV @R0,A ;存显示字段码
INC R0 ;指向下一显示数字
CJNE R0,#35H,CGLP ;判 5个显示数字转换完否?未完继续
RET ;转换完毕,结束
TAB,DB 3FH,06H,5BH,4FH,66H ;共阴字段码表
DB 6DH,7DH,07H,7FH,6FH ;
三,静态显示方式及其典型应用电路
⑵ 动态显示方式,在某一瞬时显示一位,依次循环扫描,轮流显示,由于人的视觉滞留效应,人们看到的是多位同时稳定显示。
特点,占用 I/O端线少,电路较简单,编程较复杂,CPU要定时扫描刷新显示。一般适用于显示位数较多的场合。
LED数码管显示分类:静态显示方式和动态显示方式。
⑴ 静态显示方式,每一位字段码分别从 I/O控制口输出,保持不变直至 CPU刷新。
特点,编程较简单,但占用 I/O口线多,一般适用于显示位数较少的场合。
LED显示器的扩展 (显示方式 )
LED数码管的 显示方式,③静态与动态动态显示特点,
有闪烁,用 元器件少,占 I/O线少,必须扫描,花费 CPU时间,
编程复杂。 (有多个 LED时尤为突出)
静态显示特点,
无闪烁,用 元器件多,占 I/O线多,无须扫描,节省 CPU时间,
编程简单。
静态显示,
各数码管在显示过程中 持续 得到送显信号,与各数码管接口的 I/O口线 是 专用 的。
动态显示,
各数码管在显示过程中 轮流 得到送显信号,与各数码管接口的 I/O口线 是 共用 的。
1,并行扩展静态显示电路
【 例 9-2】 按图 9-3编制显示子程序,显示数( ≤ 255)存在内 RAM 30H中。
解:
DIR1,MOV A,30H ;读显示数
MOV B,#100 ;置除数
DIV AB ;产生百位显示数字
MOVC A,@A+DPTR ;读百位显示符
MOV DPTR,#0DFFFH ;置 74377(百位 )地址
MOVX @DPTR,A ;输出百位显示符
MOV A,B ;读余数
MOV B,#10 ;置除数
DIV AB ;产生十位显示数字
MOV DPTR,#TAB ;置共阳字段码表首址
MOVC A,@A+DPTR ;读十位显示符
MOV DPTR,#0BFFFH ;置 74377(十位 )地址
MOVX @DPTR,A ;输出十位显示符
MOV A,B ;读个位显示数字
MOV DPTR,#TAB ;置共阳字段码表首址
MOVC A,@A+DPTR ;读个位显示符
MOV DPTR,#7FFFH ;置 74377(个位 )地址
MOVX @DPTR,A ;输出个位显示符
RET ;
TAB,DB 0C0H,0F9H,0A4H,0B0H,99H;共阳字段码表
DB 92H,82H,0F8H,80H,90H;
2,串行 扩展静态显示电路
DIR2,MOV SCON,#00H ;置串口方式 0
CLR ES ;串口禁中
SETB P1.0 ;“与,门开,允许 TXD发移位脉冲
MOV SBUF,30H ;串行输出个位显示字段码
JNB TI,$ ;等待串行发送完毕
CLR TI ;清串行中断标志
MOV SBUF,31H ;串行输出十位显示字段码
JNB TI,$ ;等待串行发送完毕
CLR TI ;清串行中断标志
MOV SBUF,32H ;串行输出百位显示字段码
JNB TI,$ ;等待串行发送完毕
CLR TI ;清串行中断标志
CLR P1.0 ;“与,门关,禁止 TXD发移位脉冲
RET ;
【 例 9-3】 按图 9-4编制显示子程序,显示字段码已分别存在 32H~ 30H内 RAM中。
解:
要求,根据上图编写通过串行口和 74LS164驱动 共阳 LED数码管 查表显示的子程序。
条件,系统有 6个 LED数码管,待显数据 (00H—09H)
已放在 35H—30H单元中 (分别对应 十万位 → 个位 ),
DSPLY:MOV DPTR,#TABLE ;共阳 LED数码管译码 表首址
MOV R0,#30H ;待显数据缓冲区的 个位 地址
REDO,MOV A,@R0 ;通过 R0实现寄存器 间接寻址
MOVC A,@A+DPTR ;查表
MOV SBUF,A ;经串行口 发送 到 74LS164
JNB TI,$ ;查询 送完一个字节的第 8位?
CLR TI ;为下一字节发送 作准备
INC R0 ;R0指向下一个 数据缓冲单元
CJNE R0,#36H,REDO ;判断 是否发完 6个数?
RET ;发完 6个数就 返回
TABLE,DB 0C0H,0F9H,0A4H,0B0H,99H ;共阳 LED译码表
DB 92H,82H,0F8H,80H,90H
3,BCD码输出静态显示电路 CD4511是,BCD码
→ 七段共阴译码 /
驱动,IC; 4511是
4线 -7段锁存 /译码 /
驱动电路,能将
BCD码译成 7段显示符输出。图中:
4511 ABCD为 0~ 9
二进制数输入端 (A
是低位 ),abcdefg
为显示段码输出端,
LE为输入信号锁存控制 (低电平有效 ),
数码管为共阴数码管。
利用 4511实现静态显示与一般静态显示电路不同,一是 节省 I/ 0端线,段码输出只需 4根; 二是 不需专用驱动电路,可直接输出; 三是 不需译码,直接输出二进制数,编程简单; 缺点是 只能显示数字,不能显示各种符号。
解:编程如下:
DIR3,MOV P1,#11100000B ;选通个位
ORL P1,30H ;输出个位显示数
MOV P1,#11010000B ;选通十位
ORL P1,31H ;输出十位显示数
MOV P1,#10110000B ;选通百位
ORL P1,32H ;输出百位显示数
RET ;
【 例 9-4】 按图 9-5试编制显示子程序(小数点固定在第二位),已知显示数存在内 RAM 30H~ 32H
中。
动态显示电路连结形式:
① 显示各位的所有相同字段线连在一起,
共 8段,由一个 8位
I/O口控制;
② 每一位的公共端
(共阳或共阴 COM)
由另一个 I/O口控制。
四,动态显示方式及其典型应用电路
LED数码管 动态 显示举例
P1.5
P1.4
P1.3
P1.2
P1.2
P1.0
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
7406 OC门 X 3
上拉电阻
× 14
+5V
AT89C51
工作原理,从 P0口送段代码,P1口送位选信号 。段码虽同时到达 6个 LED,但 一次仅一个 LED被选中 。利用,视觉暂留,,每送一个字符并选中相应位线,延时一会儿,再送 /
选下一个 …… 循环扫描 即可。
共阴数码管位选线段代码
P1.5
P1.4
P1.3
P1.2
P1.2
P1.0
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
7406 OC门 X 3 +5V
AT89C51
位选线段代码要求,此处为共阴数码管,P0口送段代码,P1口送位选信号。
通过查表实现动态显示。
条件,待显数据 (00H—09H)已放在,7FH—7AH单元中 (分别对应 十万位 ~ 个位 )
说明,由于用了 反相驱动器 7406,要用共阳译码表。
共阴数码管上拉电阻
× 14
7406 OC门 X 3 +5V
(7FH) (7EH) (7DH) (7CH) (7BH) (7AH)
十万 万位 千位 百位 十位 个位数据缓冲区 / 显示缓冲区
P0口 送段代码,P1
口 送位选信号。
待显数据已经放在,
7FH—7AH
单元 (分别对应 十万位 → 个位 )
使用共阳译码表 。
DIR,MOV DPTR,#DSEG ;数码管译码 表首址
MOV R0,#7AH ;待显缓冲区 个位 地址
MOV R3,#01H ;个位的 位选信号 =01H
LD1,MOV A,@R0 ;通过 R0间接寻址
MOVC A,@A+DPTR ;查表
MOV P0,A ;字段码送到 P0口
MOV P1,R3 ;字位选择送到 P1口
LCALL DELY ;调延时 1ms子程序
INC R0 ;R0 指向下一字节
MOV A,R3
JB ACC.5,LD2 ;判 是否发完 6个数?
RL A ;R1指向下一个位
MOV R3,A ;位选信号存回 R1
SJMP LD1 ;跳去再显示下一个数
LD2,RET ;发完 6个数就 返回
DSEG,DB 0C0H,0F9H,0A4H,0B0H,99H;共阳译码表
DB 92H,82H,0F8H,80H,90H
P0口 送段代码,P1
口 送位选信号。
待显数据已经放在,
7FH—7AH
单元 (分别对应 十万位 → 个位 )
使用共阳译码表 。
动态 显示举例 (循环显示,8”的实验 )
实验箱 从 P0口扩展了两个 8位的简单 I/O口,
一个送段代码 (字形状 ),地址是 0DCH;
一个送位选信号 (字位置 ),地址是 0DDH。
ORG 0000H
MOV R0,#0DCH ;指向 字形口
MOV A,#80H ;送,8”的字形代码
MOVX @R0,A ;输出字形代码
MOV R1,#0DDH ;指向 字位口
MOV A,#20H ;从最高位开始
LEDO:MOVX @R1,A ;输出字位代码
ACALL DEYS ;调延时子程序
RR A ;右移一位
SJMP LEDO ;循环显示,8”
1,共阴型 8位动态显示电路
DIR4:MOV R2,#10 ;置循环扫描次数
MOV DPTR,#7FFFH ;置 74377口地址
DLP1:ANL P1,#11111000B ;第 0位先显示
MOV R0,#30H ;置显示字段码首址
DLP2:MOV A,@R0 ;读显示字段码
MOVX @DPTR,A ;输出显示字段码
LCALL DY2ms ;调用延时 2ms子程序 (参阅例 4.13)
INC R0 ;指向下一位字段码
INC P1 ;选通下一位显示
CJNE R0,#38H,DLP2 ;判 8位扫描显示完否?未完继续
DJNZ R2,DLP1 ;8位扫描显示完毕,判 10次循环完否?
CLR A ;10次循环完毕,显示暗
MOVX @DPTR,A ;
RET ;子程序返回
【 例 9-5】 按图 9-7,试编制循环扫描( 10次)显示子程序,
已知显示字段码存在以 30H(低位)为首址的 8字节内 RAM中。
解:编程如下:
2,共阳型 3位动态显示电路
DIR5,MOV DPTR,#0BFFFH ;置 74377地址
MOV R2,#100 ;置循环显示次数
DIR50,SETB P1.2 ;百位停显示
MOV A,40H ;取个位字段码
MOVX @DPTR,A ;输出个位字段码
CLR P1.0 ;个位显示
LCALL DY2ms ;调用延时 2ms子程序 (参阅例 4.13)
DIR51,SETB P1.0 ;个位停显示
MOV A,41H ;取十位字段码
MOVX @DPTR,A ;输出十位字段码
CLR P1.1 ;十位显示
LCALL DY2ms ;延时 2ms
DIR52,SETB P1.1 ;十位停显示
MOV A,42H ;取百位字段码
MOVX @DPTR,A ;输出百位字段码
CLR P1.2 ;百位显示
LCALL DY2ms ;延时 2ms
DJNZ R2,DIR50 ;判循环显示结束否?未完继续
ORL P1,#00000111B ;3位灭显示
RET ;
【 例 9-6】 根据图 9-8电路,试编制 3位动态扫描显示程序 (循环 100
次 ),已知显示字段码存在以 40H(低位 )为首址的 3字节内 RAM中。
解:编程如下:
1,SAA1064引脚功能五,虚拟 I2C总线串行显示电路
① VDD,VEE:电源,接地端 。 电源 4.5~ 15V;
② P1~ P16:段驱动输出端 。 分为两个 8位口:
P1~ P8; P9~ P16。 P8,P16为高位 。 口锁存器具有反相功能,置 1时,端口输出 0。
③ MX1,MX2:位码驱动端 。 静态显示驱动时,一片
SAA1064可驱动二位 LED数码管;动态显示驱动时,按图 9-10
连接方式,一片 SAA1064可驱动四位 LED数码管;
④ SDA,SCL,I2C总线数据端,时钟端;
⑤ CEXT:时钟振荡器外接电容,典型值 2700pF
⑥ ADR:地址引脚端 。 SAA1064引脚地址 A1,A0采用 ADR模拟电压比较编址 。 当 ADR引脚电平为 0,3VDD/8,5VDD/8,VDD
时,相应引脚地址 A2,A1,A0 分别为 000,001,010,011;
2,硬件电路设计
⑴ 片内寄存器符号 COM data1 data2 data3 data4
装载内容 控制命令 显示段码 1 显示段码 2 显示段码 3 显示段码 4
片内地址 00H 01H 02H 03H 04H
3,片内可编程功能
⑵ 控制命令 COM
COM D7 D6 D5 D4 D3 D2 D1 D0
00H — C6 C5 C4 C3 C2 C1 C0
CO,静动态控制,C0=1,动态显示,动态显示时,data1、
data2轮流从 P8~ P1输出,data3,data4轮流从 P16~ P9输出;
C1,显示位 1,3亮暗选择,C1=1,选择亮;
C2,显示位 2,4亮暗选择,C2=1,选择亮;
C3,测试位,C3=1,所有段亮;
C4,C5,C6,驱动电流控制位,C4,C5,C6分别为 1时,驱动电流分别为 3mA,6mA,12mA; C4,C5,C6全为 1时,驱动电流最大,可达 21mA。
⑶ 写数据操作格式
S SLAW A SADR A COM A data1 A data2 A data3 A data4 A P
红色 部分由 80C51发送,SAA1064接收;
黑色部分由 SAA1064发送,80C51接收。
SLAW为写 SAA1064寻址字节,
按图 9-10所示连接电路,SAA1064( 1) SLAW=01110000B;
SAA1064( 2) SLAW=01110110B。
其中 0111( D7~ 4)为 SAA1064器件地址,
D3~ 1为 A2A1A0寻址字节,
末位 D0为 R/W;
SADR为片内寄存器地址;
COM为控制命令。
解,VSAA,MOV MTD,#00H ;置 SAA1064控制命令寄存器 COM片内子地址
MOV 31H,#01000111B;置控制命令字,动态显示,驱动电流 12mA
MOV NUMB,#6 ;置发送数据数,SADR+COM+data1~ 4=6
SAA1,MOV RO,#51H ;将 51H~ 54H显示符数据移至 32H~ 35H
LCALL MOVB ;
MOV SLA,#01110000B;置 SAA1064(1)写寻址字节 SLAW
LCALL WRNB ;发送给 SAA1064(1)
SAA2,MOV R0,#55H ;将 55H~ 58H显示符数据移至 32H~ 35H
LCALL MOVB ;
MOV SLA,#01110110B;置 SAA1064(2)寻址字节 SLAW
LCALL WRNB ;发送给 SAA1064(2)
RET ;
MOVB,MOV R1,#32H ;显示符数据移至 32H~ 35H子程序
MOVB1:MOV A,@R0 ;读出
MOV @R1,A ;存入
INC RO ;指向下一读出单元
INC R1 ;指向下一存入单元
CJNE R1,#36H,MOVB1 ;判 4个数据移完否?未完继续
RET ;
【 例 9-7】 已知 8位显示符 (共阴编码 )已依次存入内 RAM 51H~ 58H中,试按图 9-
10编程将其输入 SAA1064(1),(2)动态显示,驱动电流为 12mA。设 VIIC软件包已装入 ROM,VSDA.VSCL.SLA.NUMB.MTD.MRD均已按 8.3.2软件包小结中协议定义。
4,程序设计
1,按键开关去抖动问题
§ 9-2 键盘接口一,键盘接口概述键盘的抖动时间一般为 5~ 10ms,抖动现象会引起 CPU
对一次键操作进行多次处理,从而可能产生错误 。
⑴ 硬件去抖动消除抖动不良后果的方法:
其中 RC滤波电路去抖动电路简单实用,效果较好 。
⑵ 软件去抖动检测到按键按下后,执行 延时 10ms子程序后再确认 该键是否确实按下,消除抖动影响。
2,按键连接方式
⑴ 独立式按键独立式按键是每个按键占用一根 I/O端线 。
特点:
① 各按键相互独立,电路配置灵活;
② 按键数量较多时,I/O端线耗费较多,电路结构繁杂;
③ 软件结构简单。
适用于按键数量较少的场合 。
⑵ 矩阵式键盘
I/O端线分为行线和列线,按键跨接在行线和列线上,按键按下时,行线与列线发生短路 。
特点:
① 占用 I/O端线较少;
② 软件结构教复杂。
适用于按键较多的场合 。
3,键盘扫描控制方式
⑴ 程序控制扫描方式键处理程序固定在主程序的某个程序段。
特点,对 CPU工作影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。
⑵ 定时控制扫描方式利用定时 /计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描 。
特点,与程序控制扫描方式的区别是,在扫描间隔时间内,
前者用 CPU工作程序填充,后者用定时 /计数器定时控制。定时控制扫描方式也应考虑定时时间不能太长,否则会影响对键输入响应的及时性。
⑶ 中断控制方式中断控制方式是利用外部中断源,响应键输入信号。
特点,克服了前两种控制方式可能产生的空扫描和不能及时响应键输入的缺点,既能及时处理键输入,又能提高 CPU运行效率,但要占用一个宝贵的中断资源。
1,按键直接与 I/O口连接二,独立式按键及其接口电路
【 例 9-8】 按图 9-13(a),(b),试分别编制按键扫描子程序。
解:按图 9-13(a)编程如下:
KEYA:ORL P1,#07H ;置 P1.0~ P1.2为输入态
MOV A,P1 ;读键值,键闭合相应位为 0
CPL A ;取反,键闭合相应位为 1
ANL A,#00000111B;屏蔽高 5位,保留有键值信息的低 3位
JZ GRET ;全 0,无键闭合,返回
LCALL DY10ms ;非全 0,有键闭合,延时 10ms,软件去抖动
MOV A,P1 ;重读键值,键闭合相应位为 0
CPL A ;取反,键闭合相应位为 1
ANL A,#00000111B;屏蔽高 5位,保留有键值信息的低 3位
JZ GRET ;全 0,无键闭合,返回 ;非全 0,确认有键闭合
JB Acc.0,KA0 ;转 0#键功能程序
JB Acc.1,KA1 ;转 1#键功能程序
JB Acc.2,KA2 ;转 2#键功能程序
GRET:RET
KA0,LCALL WORK0 ;执行 0#键功能子程序
RET
KA1,LCALL WORK1 ;执行 1#键功能子程序
RET
KA2,LCALL WORK2 ;执行 2#键功能子程序
RET
按图 9-13(b)编程如下,
KEYB:ORL P1,#07H ;置 P1.0~ P1.2为输入态
MOV A,P1 ;读键值,键闭合相应位为 1
ANL A,#00000111B ;屏蔽高 5位,保留有键值信息的低 3位
JZ GRET ;全 0,无键闭合,返回
LCALL DY10ms ;非全 0,有键闭合,延时 10ms,软件去抖动
MOV A,P1 ;重读键值,键闭合相应位为 1
ANL A,#00000111B ;屏蔽高 5位,保留有键值信息的低 3位
JZ GRET ;全 0,无键闭合,返回 ;非全 0,确认有键闭合
JB Acc.0,KB0 ;转 0#键功能程序
JB Acc.1,KB1 ;转 1#键功能程序
JB Acc.2,KB2 ;转 2#键功能程序
GRET:RET
KB0,LCALL WORK0 ;执行 0#键功能子程序
RET
KB1,LCALL WORK1 ;执行 1#键功能子程序
RET
KB2,LCALL WORK2 ;执行 2#键功能子程序
RET
⑴ 按键与并行扩展 I/O口连接
2,按键与扩展 I/O口连接
【 例 9-9】 按图 9-14,试编制按键扫描子程序,将键信号存入内 RAM 30H。
解:编程如下:
KEY99,MOV DPTR,#7FFFH ;置 74373口地址
MOVX A,@DPTR ;输入键信号 (“0” 有效 )
MOV 30H,A ;存键信号数据
RET ;
参阅 8.2.4,图 8-6,【 例 8-2】 。
⑵ 按键与串行扩展 I/O口连接三,矩阵式键盘及其接口电路
【 例 9-10】 按图 9-15及图 9-16,试编制矩阵式键盘扫描程序。
解,KEY,MOV P1,#0F0H ;行线置低电平,列线置输入态
KEY0,MOV A,P1 ;读列线数据
CPL A ;数据取反,“1”有效
ANL A,#0F0H ;屏蔽行线,保留列线数据
MOV R1,A ;存列线数据 (R1高 4位 )
JZ GRET ;全 0,无键按下,返回
KEY1,MOV P1,#0FH ;行线置输入态,列线置低电平
MOV A,P1 ;读行线数据
CPL A ;数据取反,“1”有效
ANL A,#0FH ;屏蔽列线,保留行线数据
MOV R2,A ;存行线数据 (R2低 4位 )
JZ GRET ;全 0,无键按下,返回
JBC F0,WAIT ;已有消抖标志,转
SETB F0 ;无消抖标志,置消抖标志
LCALL DY10ms ;调用 10ms延时子程序 (参阅例 4.13),消抖
SJMP KEY0 ;重读行线列线数据
GRET,RET ;
WAIT,MOV A,P1 ;等待按键释放
CPL A ;
ANL A,#0FH ;
JNZ WAIT ;按键未释放,继续等待
KEY2,MOV A,R1 ;取列线数据 (高 4位 )
MOV R1,#03H ;取列线编号初值
MOV R3,#03H ;置循环数
CLR C ;
KEY3,RLC A ;依次左移入 C中
JC KEY4 ;C=1,该列有键按下,(列线编号存 R1)
DEC R1 ;C=0,无键按下,修正列编号
DJNZ R3,KEY3 ;判循环结束否?未结束继续寻找有键按下的列线
KEY4,MOV A,R2 ;取行线数据 (低 4位 )
MOV R2,#00H ;置行线编号初值
MOV R3,#03H ;置循环数
CLR C ;
KEY5,RRC A ;依次右移入 C中
JC KEY6 ;C=1,该行有键按下,(行线编号存 R2)
INC R2 ;C=0,无键按下,修正行线编号
DJNZ R3,KEY5 ;判循环结束否?未结束继续寻找有键按下的行线
KEY6,MOV A,R2 ;取行线编号
CLR C ;
RLC A ;行编号 × 2
RLC A ;行编号 × 4
ADD A,R1 ;行编号 × 4+列编号 =按键编号
KEY7,CLR C ;
RLC A ;按键编号 × 2
RLC A ;按键编号 × 4(LCALL+ RET共 4字节 )
MOV DPTR,#TABJ ;
JMP @A+DPTR ;散转,执行相应键功能子程序
TABJ,LCALL WORK0 ;调用执行 0#键功能子程序
RET ;
LCALL WORK1 ;调用执行 1#键功能子程序
RET ;
… …
LCALL WORK15 ;调用执行 15#键功能子程序
RET ;
【 例 9-11】 按图 9-17,试编制中断方式键盘扫描程序,将键盘序号存入内 RAM 30H。
ORG 0000H ;复位地址
LJMP STAT ;转初始化
ORG 0003H ;中断入口地址
LJMP PINT0 ;转中断服务程序
ORG 0100H ;初始化程序首地址
STAT,MOV SP,#60H ;置堆栈指针
SETB IT0 ;置为边沿触发方式
MOV IP,#00000001B ;置为高优先级中断
MOV P1,#00001111B ;置 P1.0~ P1.3置为输入态,置 P1.4~ P1.7输出 0
SETB EA ;CPU开中
SETB EX0 ;开中
LJMP MAIN ;转主程序,并等待有键按下时中断解:
OGR 2000H ;中断服务程序首地址
PINT0,PUSH Acc ;保护现场
PUSH PSW ;
MOV A,P1 ;读行线 (P1.0~ P1.3)数据
CPL A ;数据取反,“1”有效
ANL A,#0FH ;屏蔽列线,保留行线数据
MOV R2,A ;存行线 (P1.0~ P1.3)数据 (R2低 4位 )
MOV P1,#0F0H ;行线置低电平,列线置输入态
MOV A,P1 ;读列线 (P1.4~ P1.7)数据
CPL A ;数据取反,“1”有效
ANL A,#0F0H ;屏蔽行线,保留列线数据 (A中高 4位 )
MOV R1,#03H ;取列线编号初值
MOV R3,#03H ;置循环数
CLR C ;
PINT01:RLC A ;依次左移入 C中
JC PINT02 ;C=1,该列有键按下,(列线编号存 R1)
DEC R1 ;C=0,无键按下,修正列编号
DJNZ R3,PINT01 ;判循环结束否?未结束继续寻找有键按下列线
PINT02:MOV A,R2 ;取行线数据 (低 4位 )
MOV R2,#00H ;置行线编号初值
MOV R3,#03H ;置循环数
PINT03:RRC A ;依次右移入 C中
JC PINT04 ;C=1,该行有键按下,(行线编号存 R2)
INC R2 ;C=0,无键按下,修正行线编号
DJNZ R3,PINT03 ;判循环结束否?未结束继续寻找有键按下行线
PINT04:MOV A,R2 ;取行线编号
CLR C ;
RLC A ;行编号 × 2
RLC A ;行编号 × 4
ADD A,R1 ;行编号 × 4+列编号 =按键编号
MOV 30H,A ;存按键编号
POP PSW ;
POP Acc ;
RETI ;
§ 9-3 A/D转换接口电路一,A/D转换的基本概念
A/D转换的功能是把模拟量电压转换为 N位数字量。
设 D为 N位二进制数字量,UA为电压模拟量,
UREF为参考电压,无论 A/D或 D/A,其转换关系为:
UA = D× UREF / 2N
( 其中,D=D0× 20+D1× 21+? +DN-1× 2N-1)
1,A/D转换器的主要性能指标:
⑴ 转换精度 。转换精度通常用分辨率和量化误差来描述。
① 分辨率 。分辨率 = UREF / 2N
表示输出数字量变化一个相邻数码所需输入模拟电压的变化量。 N为 A/D转换的位数,N越大,分辨率越高,习惯上分辨率常以 A/D转换位数 N表示。
② 量化误差 。量化误差是指零点和满度校准后,在整个转换范围内的最大误差。
⑵ 转换时间 。指 A/D转换器完成一次 A/D转换所需时间。转换时间越短,适应输入信号快速变化能力越强。
2,A/D转换器分类
A/D转换器分类:
按 转换原理形式 可分为逐次逼近式、双积分式和 V/F变换式;
按 信号传输形式 可分为并行 A/D和串行 A/D。
二,并行 A/D
ADC0809及其接口电路
1,引脚功能和典型连接电路
⑴ IN0~ IN7,8路模拟信号输入端 。
⑵ C,B,A,8路模拟信号转换选择端 。
与低 8位地址中 A0~ A2连接 。 由 A0~ A2地址 000~ 111选择 IN0~ IN7八路
A/D通道 。
⑶ CLK,外部时钟输入端 。
时钟频率高,A/D转换速度快 。 允许范围为 10~ 1280KHz 。
通常由 80C51 ALE端直接或分频后与 0809 CLK端相连接 。
⑷ D0~ D7,数字量输出端 。
⑸ OE,A/D转换结果输出允许控制端 。
OE=1,允许将 A/D转换结果从 D0~ D7端输出 。 通常由 80C51的端与 0809片选端 ( 例如 P2.0) 通过或非门与 0809 OE端相连接 。
⑹ ALE,地址锁存允许信号输入端 。
0809 ALE信号有效时将当前转换的通道地址锁存 。
⑺ START,启动 A/D转换信号输入端 。
当 START端输入一个正脉冲时,立即启动 0809进行 A/D转换 。 START端与
ALE端连在一起,由 80C51WR与 0809片选端 ( 例如 P2.0) 通过或非门相连 。
⑻ EOC,A/D转换结束信号输出端,高电平有效 。
⑼ UREF( +),UREF( -),正负基准电压输入端 。
⑽ Vcc,正电源电压 ( +5V) 。 GND,接地端 。
2,ADC 0809应用实例
⑴ 中断方式
【 例 9-12】 按图 9-20,用中断方式对 8路模拟信号依次 A/D转换一次,并把结果存入以 30H为首址的内 RAM中,试编制程序。
解:
ORG 0000H ;复位地址
LJMP STAT ;转初始化程序
ORG 0013H ;中断服务子程序入口地址
LJMP PINT1 ;中断,转中断服务子程序 ;
ORG 0100H ;初始化程序首地址
STAT,MOV R1,#30H ;置数据区首址
MOV R7,#8 ;置通道数
SETB IT1 ;置边沿触发方式
SETB EX1 ;开中
SETB EA ;CPU开中
MOV DPTR,#0FEF8H ;置 0809通道 0地址
MOVX @DPTR,A ;启动 0通道 A/D
LJMP MAIN ;转主程序,并等待 A/D中断
ORG 0200H ;中断服务子程序首地址
PINT1,PUSH Acc ;保护现场
PUSH PSW ;
MOVX A,@DPTR ;读 A/D值
MOV @R1,A ;存 A/D值
INC DPTR ;修正通道地址
INC R1 ;修正数据区地址
MOVX @DPTR,A ;启动下一通道 A/D
DJNZ R7,GORETI ;判 8路采集完否?未完继续
CLR EX1 ;8路采集已完,关中
GORETI:POP PSW ;恢复现场
POP Acc ;
RETI ;中断返回
⑵ 查询方式工作在查询方式时,0809 EOC端可不必通过反相器与或相连,
直接与 80C51 P1口或 P3口中任一端线相连。
【 例 9-13】 图 9-20中,用 P1.0直接与 0809 EOC端相连,试用查询方式编制程序,对 8路模拟信号依次 A/D转换一次,并把结果存入以 40H为首址的内 RAM中。
解:
MAIN,MOV R1,#40H ;置数据区首址
MOV R7,#8 ;置通道数
SETB P1.0 ;置 P1.0输入态
MOV DPTR,#0FEF8H ;置 0809通道 0地址
LOOP,MOVX @DPTR,A ;启动 A/D
JNB P1.0,$ ;查询 A/D转换结束否?未完继续查询等待
MOVX A,@DPTR ;A/D已结束,读 A/D值
MOV @R1,A ;存 A/D值
INC DPTR ;修改通道地址
INC R1 ;修改数据区地址
DJNZ R7,LOOP ;判 8路采集完否?未完继续
RET ;8路采集完毕,返回
⑶ 延时等待方式工作在延时等待方式时,0809 EOC端可不必与 80C51相连,是根据时钟频率计算出 A/D转换时间,略微延长后直接读 A/D转换值。
【 例 9-14】 图 9-20中,0809 EOC端开路,fosc=6MHz,试用延时等待方式编制程序,对 8路模拟信号依次 A/D转换一次,并把结果存入以 50H为首址的内 RAM中。
解:编程如下:
MAIN:MOV R1,#50H ;置数据区首址
MOV R7,#8 ;置通道数
MOV DPTR,#0FEF8H;置 0809通道 0地址
LOOP:MOVX @DPTR,A ;启动 A/D
MOV R6,#17 ;
DJNZ R6,$ ;延时 68?S:2机周 × 17=34机周,2?S× 34=68?S
MOVX A,@DPTR ;读 A/D值
MOV @R1,A ;存 A/D值
INC DPTR ;修正通道地址
INC R1 ;修正数据区地址
DJNZ R7,LOOP ;判 8路采集完否?未完继续
RET ;8路采集完毕,返回三,串行 A/D
ADC0832及其接口电路
ADC 0832是 8位串行 A/D转换器;
转换速度较高( 250KHz时转换时间 32?s);
单电源供电,功耗低( 15mw)。
1,引脚功能
VDD,VSS:电源接地端,VDD同时兼任 UREF;
CS:片选端,低电平有效;
DI:数据信号输入端;
DO:数据信号输出端;
CLK:时钟信号输入端,要求低于 600KHz;
CH0,CH1:模拟信号输入端 ( 双通道 ) ;
2,典型应用电路
P1.0片选 CS;
TXD发送时钟信号输入 ADC0832 CLK;
RXD与 DI,DO端连接在一起。
编码 通道选择
CH0 CH1
00 + -
01 - +
10 +
11 +
表 9-3
3,串行 A/D转换工作时序工作时序分为二个阶段:
⑴ 起始和通道配置,由 CPU发送,从 ADC0832 DI端输入;
⑵ A/D转换数据串行输出,由 ADC 0832从 DO端输出,CPU接收 。
4,软件编程
【 例 9-15】 按图 9-21( b)电路,试编制程序,将 CH0,CH1通道输入的模拟信号 A/D转换,分别存入 30H31H中。
解:
AD0832:MOV SCON,#00H ;置串口方式 0,禁止接收
CLR ES ;串口禁中
MOV R0,#30H ;置 A/D数据存储区首址
CLR P1.0 ;片选 0832
MOV A,#06H ;置 CH0通道配置
ADC0,MOV SBUF,A ;启动 A/D
ADC1,JNB TI,ADC1 ;串行发送启动及通道配置信号
CLR TI ;清发送中断标志
SETB REN ;允许 (启动 )串行接收
ADC2,JNB RI,ADC2 ;接收第一字节
CLR RI ;清接收中断标志,同时启动接收第二字节
MOV A,SBUF ;读第一字节数据
MOV B,A ;暂存说明,
① 接收第一字节的 8位数据为(注意先接收低位 D4):
② 清串行接收中断标志后,启动串行接收第二字节,其数据为:
③ 组合后的 8位数据为:
④ 高低 4位互换后的 8位数据为:
ADC3,JNB RI,ADC3 ;接收第二字节
CLR RI ;清接收中断标志
MOV A,SBUF ;读第二字节数据
ANL A,#0FH ;第二字节屏蔽高 4位
ANL B,#0FOH ;第一字节屏蔽低 4位
ORL A,B ;组合
SWAP A ;高低 4位互换,组成正确的 A/D数据
MOV @R0,A ;存 A/D数据
INC R0 ;指向下一存储单元
MOV A,#0EH ;置 CH1通道配置
CJNE R0,#32H,ADC0 ;判两通道 A/D完毕否?未完继续
CLR REN ;两通道 A/D完毕,禁止接收
SETB P1.0 ;清 0832片选
RET ;
D3 D2 D1 D0 D1 D2 D3 D4
× × × × D7 D6 D5 D4
D3 D2 D1 D0 D7 D6 D5 D4
D7 D6 D5 D4 D3 D2 D1 D0
四,I2C串行 A/D典型应用电路
I2C串行 A/D芯片 PCF8591,
同时具有 A/D,D/A转换功能 。
1,PCF8591引脚功能
SDA,SCL,I2C总线数据线、时钟线;
A2,A1,A0:引脚地址输入端;
AIN0~ AIN3:模拟信号输入端,
OSC:外部时钟输入端,内部时钟输出端;
EXT:内外部时钟选择端,EXT=0时选择内部时钟;
VDD,VSS:电源、接地端;
AGND:模拟信号地;
UREF:基准电压输入端;
AOUT,D/A转换模拟量输出端;
该芯片既可用于 A/D转换 ( 模拟信号从 AIN0~ AIN3输入 ),又可用于 D/A转换 ( D/A转换模拟量从 AOUT输出 ),
器件地址为 1001,若 A2A1A0接地,D/A转换写寻址字节
SLAW=90H,A/D转换读寻址字节 SLAR=91H。
2,硬件电路设计
3,片内可编程功能
⑴ 控制命令字
PCF8591内部有一个控制寄存器,用来存放控制命令,其格式如下:
COM D7 D6 D5 D4 D3 D2 D1 D0
D1,D0,A/D通道编号
00:通道 0; 01:通道 1; 10:通道 2; 11:通道 3;
D2,自动增量选择
D2=1时,A/D转换将按通道 0~ 3依次自动转换;
D3,D7:必须为 0;
D5,D4,模拟量输入方式选择位,
00:输入方式 0( 四路单端输入 );
01:输入方式 1( 三路差分输入 );
10:输入方式 2( 二路单端一路差分输入 );
11:输入方式 3( 二路差分输入 )。
D6,模拟输出允许 。 D6=1,模拟量输出有效;
① 输入方式 0(四路单端输入):
ANI0 —— 通道 0(单端输入)
ANI1 —— 通道 1(单端输入)
ANI2 —— 通道 2(单端输入)
ANI3 —— 通道 3(单端输入)
② 输入方式 1(三路差分输入):
③ 输入方式 2(二路单端一路差分输入):
④ 输入方式 3( 二路差分输入 ),
⑵ ADC数据操作格式
S SLAW A COM A S SLAR A Data0 A Data1 A
发出控制命令(写操作) A/D转换(读操作)
其中红色部分由 80C51发送,PCF8591接收;
黑色部分由 PCF8591发送,80C51接收;
4,软件编程
【 例 9-16】 按图 9-23( b)编程将 AIN0~ AIN3 4个通道的模拟信号 A/D转换后,依次存入以 50H为首址的内 RAM中。设 VIIC软件包已装入 ROM,VSDA,VSCL,SLA,NUMB,MTD,MRD均已按
8.3.2 软件包小结中协议定义。
解:
VADC,MOV SLA,#90H ;置发送寻址字节
MOV MTD,#00000100B;置 A/D转换控制命令,通道自动增量
MOV NUMB,#1 ;置发送字节数
LCALL WRNB ;发送控制命令字
MOV R0,#50H ;置 A/D数据区首址
VADC0,MOV SLA,#91H ;置接收寻址字节
MOV NUMB,#2 ;置接收字节数
LCALL RDNB ;读 A/D转换数据
MOV @R0,41H ;存 A/D转换数据 (存在 50H~ 53H)
INC R0 ;修改 A/D数据区地址
CJNE R0,#54H,VADC0 ;判 4通道 A/D完成否?未完继续
RET ;
§ 9-4 D/A转换接口电路一,D/A转换的基本概念
1,D/A转换的基本概念
D/A转换的基本原理是应用电阻解码网络,将 N位数字量逐位转换为模拟量并求和,从而实现将 N位数字量转换为相应的模拟量。
设 D为 N位二进制数字量,UA为电压模拟量,UREF为参考电压,
无论 A/D或 D/A,其转换关系为:
UA = D× UREF / 2N
(其中,D=D0× 20+D1× 21+? +D N-1× 2N-1)
2,D/A转换器的主要性能指标
⑴ 分辨率,相对分辨率 = 1/2N,N越大,分辨率越高。
⑵ 线性度
⑶ 转换精度
⑷ 建立时间
⑸ 温度系数二,DAC0832及其接口电路
DAC 0832是 8位 D/A芯片,由美国国家半导体公司生产,
是目前国内应用最广的 8位 D/A芯片(请特别注意 ADC0832与
DAC0832的区别)。
1,结构和引脚功能
① DI0~ DI7,8位数据输入端 。
② ILE:输入数据允许锁存信号,高电平有效 。
③ CS:片选端,低电平有效 。
④ WR1:输入寄存器写选通信号,低电平有效 。
WR2,DAC寄存器写选通信号,低电平有效 。
⑤ XFER:数据传送信号,低电平有效 。
⑥ IOUT1,IOUT2:电流输出端 。
⑦ RFB:反馈电流输入端 。
⑧ UREF:基准电压输入端 。
⑨ Vcc:正电源端; AGND:模拟地; DGND:数字地 。
2,DAC 0832工作方式用软件指令控制这 5个控制端,ILE,CS,WR1,WR2,XFER,
可实现三种工作方式:
⑴ 直通工作方式,5个控制端均有效,直接 D/A;
⑵ 单缓冲工作方式,5个控制端一次选通;
⑶ 双缓冲工作方式,5个控制端分二次选通 。
三,DAC 0832应用实例
1、单缓冲方式
【 例 9-17】 电路按图 9-27,要求输出锯齿波如图 9-29( a)
所示,幅度为 UREF/2=2.5V。
解:程序如下:
START,MOV DPTR,#7FFFH ;置 DAC0832地址 ;
LOOP1,MOV R7,#80H ;置锯齿波幅值 ; 1机周
LOOP2,MOV A,R7 ;读输出值 ; 1机周
MOVX @DPTR,A ;输出 ; 2机周
DJNZ R7,LOOP2 ;判周期结束否? 2机周
SJMP LOOP1 ;循环输出 ; 2机周
2,双缓冲方式
【 例 9-18】 按图 9-28( a)编程,DAC0832⑴ 和⑵输出端接运放后,分别接图形显示器 X轴和 Y轴偏转放大器输入端,实现同步输出,更新图形显示器光点位置。已知 X轴信号和 Y轴信号已分别存于 30H,31H中。
解:
DOUT:MOV DPTR,#0DFFFH ;置 DAC0832(1)输入寄存器地址
MOV A,30H ;取 X轴信号
MOVX @DPTR,A ;X轴信号 → 0832(1)输入寄存器
MOV DPTR,#0BFFFH ;置 DAC0832(2)输入寄存器地址
MOV A,31H ;取 Y轴信号
MOVX @DPTR,A ;Y轴信号 → 0832(2)输入寄存器
MOV DPTR,#7FFFH ;置 0832(1),(2)DAC寄存器地址
MOVX @DPTR,A ;同步 D/A,输出 X,Y轴信号
RET ;
四,I2C串行 D/A典型应用电路
1,典型应用连接电路
2,写操作数据格式
S SLAW A COM A data A
其中红色部分由 80C51发送,PCF8591接收;
黑色部分由 PCF8591发送,80C51接收;
3,软件编程
【 例 9-19】 按图 9-23( b)设计一个 D/A转换子程序,已知 D/A
转换数据已存入内 RAM 50H中。设 VIIC软件包已装入 ROM,VSDA、
VSCL,SLA,NUMB,MTD,MRD均已按 8.3.2 软件包小结中协议定义。
解:
VDSA:MOV SLA,#90H ;置发送寻址字节
MOV MTD,#40H ;置 D/A转换控制命令
MOV 31H,50H ;D/A转换数据装入 MTD+1单元
MOV NUMB,#2 ;置发送数据字节数
LCALL WRNB ;调用 I2C总线发送 N字节数据子程序
RET ;
§ 9-5 开关量驱动输出接口电路一,驱动发光二极管二,驱动继电器三,光电隔离接口四,驱动可控硅