,单片机原理与应用技术, 教学课件
第五讲:
接口与系统 扩展( 2)
本讲重点:
键盘接口(键盘种类,矩阵键盘的行扫描与
线反转法的电路、原理与编程) ;
D/A转换接口( DAC0832产生各种波形) ;
A/D转换接口( ADC0809三种读取方式,电路
及单路采集与多路采集编程应用),
,单片机原理与应用技术, 教学课件
?扩展键盘接口
,单片机原理与应用技术, 教学课件
四,键盘接口 P.194
键盘
单片机系统中完成控制参数输入及修改的 基本输
入设备,是人工干预系统的重要手段。
单片机与计算机在键盘规模 /键符设置等方面差别
很大。
键盘分类
@ 按键值 编码方式 分
(硬件 )编码键盘 与 非 (硬件 )编码键盘 。
@ 按键组 连接方式 分
独立连接键盘 与 矩阵连接键盘 。
,单片机原理与应用技术, 教学课件
编码键盘, 采用专用的编码 /译码 器件,被按下的键
由该器件译码输出相应的 键码 /键值 。
特点,增加了硬件开销,编码因选用器件而异,编
码固定,但编程简单。适用于规模大的键盘。
非编码键盘, 单片机系统多采用此类键盘
采用 软件 编 /译码的方式,通过扫描,对每个被按下
的键判别输出相应的 键码 /键值 。
特点,不增加硬件开销,编码灵活,适用于小规模
的键盘,特别是单片机系统。但编程较复杂,占 CPU
时间,还须软件, 消颤, 。
按键值编码方式,编码键盘 与 非编码键盘
,单片机原理与应用技术, 教学课件
按键组连接方式,独立连接键盘 与 矩阵连接键盘
独立连接键盘, 每键相互独立,各自与一条 I/O线相
连,CPU可直接读取该 I/O线的高 /低电平状态。
特点,占 I/O口线多,但判键速度快,多用于设置控
制键、功能键。适用于键数少的场合。
矩阵连接键盘, 键按矩阵排列,各键处于矩阵行 /列
的 结点 处,CPU通过对连在 行 (列 )的 I/O线送已知电平
的信号,然后读取 列 (行 )线的状态信息。逐线扫描,
得出键码。
特点,键多时 占用 I/O口线少,但判键速度慢,多用于
设置数字键。适用于键数多的场合。
独立连接式键盘 例 1:
特点,此子程序需 不断 (或 定时 )调用,否则可能
漏判。 4个键的优先级由指令顺序决定。
P1.0
P1.1
P1.2
P1.3
KEY,JNB P1.0,FUNC1 ;逐键判别
JNB P1.1,FUNC2
JNB P1.2,FUNC3
JNB P1.3,FUNC4
RET ;无任何键按下由此返回
FUNC1,…… ;做 P1.0要求的, 功能 1”
RET
FUNC2,…… ;做 P1.1要求的, 功能 2”
RET
FUNC3,…… ;做 P1.2要求的, 功能 3”
RET
FUNC4,…… ;做 P1.3要求的, 功能 4”
RET
AT89C51
独立连接式键盘 例 2
特点:
@ 此子程序采用 中断
查询 不会漏判,省时。
@ 键的优先级由指令
顺序决定。
@ 为防止一次按键多
次中断,在功能子程
序里应安排, 关 /开中
断指令, 并, 延时, 。
P1.0
P1.1
P1.2
P1.3
ORG 0003H
LJMP KEY
…………
KEY,JNB P1.0,FUNC1 ;逐键判别
JNB P1.1,FUNC2
JNB P1.2,FUNC3
JNB P1.3,FUNC4
RETI ;无任何键按下由此返回
FUNC1,…… ;做 P1.0要求的, 功能 1”
RETI
FUNC2,…… ;做 P1.1要求的, 功能 2”
RETI
FUNC3,…… ;做 P1.2要求的, 功能 3”
RETI
FUNC4,…… ;做 P1.3要求的, 功能 4”
RETI
INT0
&
(上拉 )
AT89C51
矩阵式键盘 P.198例
AT89C51 8155
P0
ALE
CE
RESET
AD0-7
EA
RESET
RD
WR WR
RD
PA7
PA6
PA5
PA4
PA3
PA2
PA1
PA0
PC0
PC1
PC2
PC3
P2.7
ALE
+5v
+5v
行线

线
0行 7行
0列
3列
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 26 31
此图参照 P198图 6-26画的,但按照书上给的程序,键值标错了。
P2.0 IO/M
8155 控制寄存器,0100H
8155 A口地址,0101H
8155 C口地址,0103H
A口为输出 C口为输入口
P.198图的标注
0行 1行 2行 3行 4行 5行 6行 7行
行线 (PA0- PA7)

线
PC
0-3
0列
3列
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 26 31
1列
2列
0行 1行 2行 3行 4行 5行 6行 7行
行线 (PA0- PA7)

线
PC
0-3
0列
3列
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
1列
2列
P.198图的 正确 标注
0行 1行 2行 3行 4行 5行 6行 7行
行线 (PA0- PA7)

线
PC
0-3
0列
3列
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 26 31
1列
2列
P.198图的 正确 标注
0行
1行
2行
3行
4行
5行
6行
7行
0列
1列
2列
3列
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
列线 PC0-3
行线
PA0
|
PA7
左右两图是一样的
习惯说, 横行竖列,
矩阵式键盘名词注释
0行 1行 2行 3行 4行 5行 6行 7行
行线 (PA0- PA7)

线
PC
0-3
0列
3列
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 26 31
矩阵式键盘工作原理,
先 由行线送出数据,送全, 0”
或每次只送一位, 0”; 然后
读进列线,判有无键按下或
按键的位置并算出键值。顺
序扫描。
1列
2列
@ 行号,第 0行 —第 7行 → R3
(0,1,2,3,4,5,6,7)
@ 行首值,(R3) X 4→ R5
(0,4,8,12,16,20,24,28)
@ 列值,C口低 4位读进值 → R4
(0F,0E,0D,0B,07)
0F:表示此行无键按下。
0E—07:表示此行的 0—3列
有键按下。
@ 键值:查得最后结果 → R5
等于已知按键所在的 行首值,
再加上所在 列的序号 。
同一行中,键值等于 行首值
连续依次加 1。
KEY1:LCALL KS1 ;查有无键闭合
JNZ LK1 ;有键闭合转消颤
LJMP LK8 ;无键闭合则退出
LK1,LCALL DL6ms ;消颤 12ms
LCALL DL6ms
LCALL KS1 ;再查有无键闭合
JNZ LK2 ;的确有,转 处理
LJMP LK8 ;确实无,退 出去
查有无键闭合的子程序 KS1:
KS1,MOV DPTR,#0101H ;指向 A口
MOV A,#00H ;8条行线都送 0
MOVX,@DPTR,A;送到行线上去
INC DPTR
INC DPTR ;指向 C口
MOVX A,@DPTR ;读列线的电平
ANL A,#0FH ;保留 C口低 4位
若确有键按下,则 Acc中必有, 0”
ORL A,#0F0H ;将 Acc高 4位赋 1
CPL A ;Acc取反后,高 4位 =0;
若有键按下,则低 4位中必有, 1”
RET
检查的结果(出口),
若 (A)≠0,则有键按下;
若 (A)= 0,则无键按下。
行线

线
0列
3列
1列
2列
0行 1行 2行 3行 4行 5行 6行 7行
0 4 8 12 16 20 24 28
1 5 9 13 17 21 25 29
2 6 10 14 18 22 26 30
3 7 11 15 19 23 26 31
KEY1:LCALL KS1 ;查有无键闭合
JNZ LK1 ;有键闭合转消颤
LJMP LK8 ;无键闭合则退出
LK1,LCALL DL6ms ;消颤 12ms
LCALL DL6ms
LCALL KS1 ;再查有无键闭合
JNZ LK2 ;的确有,转 处理
LJMP LK8 ;确实无,退 出去
LK2,MOV R3,#00H ;(R3)← 行号初值
MOV R2,#0FEH;(R2)← 行扫描初值
LK3,MOV DPTR #0101H;指向 8155 A口
MOV A,R2 ;取 行扫描值
MOVX,@DPTR,A ;送 到行线上去
INC DPTR
INC DPTR ;指向 8155 C口
MOVX A,@DPTR ;读 列线的电平
ANL A,#0FH ;保留 C口低 4位
MOV R4,A ;列值暂存进 R4
CJNE A,#0FH,LK4;列值 ≠ 全, 1”
表明 此次送 0的行 有键按下,转 LK4处理,
若=全 1,表明 此次送 0的行 无键按下。
@ 行号:第 0行 —第 7行 → (R3)
(0,1,2,3,4,5,6,7)
@ 行扫描值,0FEH →(R2)
(FE,FD,FB,F7,EF,DF,BF,7F)
FEH = 1111 1110 B(首次扫描 )
FDH = 1111 1101 B (2次扫描 )
FBH = 1111 1011 B (3次扫描 )
F7H = 1111 0111 B (4次扫描 )
EFH = 1110 1111 B (5次扫描 )
DFH = 1101 1111 B (6次扫描 )
BFH = 1011 1111 B (7次扫描 )
7FH = 0111 1111 B (8次扫描 )
@ 列值,(0F,0E,0D,0B,07)
从 C口低 4位读进 → (R4)
0F:表示此行无键按下。
0E—07:此行的 0—3列有键按下。
KEY1:LCALL KS1 ;查有无键闭合
JNZ LK1 ;有键闭合转消颤
LJMP LK8 ;无键闭合则退出
LK1,LCALL DL6ms ;消颤 12ms
LCALL DL6ms
LCALL KS1 ;再查有无键闭合
JNZ LK2 ;的确有,转 处理
LJMP LK8 ;确实无,退 出去
LK2,MOV R3,#00H ;(R3)← 行号初值
MOV R2,#0FEH;(R2)← 行扫描初值
LK3,MOV DPTR #0101H;指向 8155 A口
MOV A,R2 ;取 行扫描值
MOVX,@DPTR,A ;送到行线上去
INC DPTR
INC DPTR ;指向 8155 C口
MOVX A,@DPTR ;读列线的电平
ANL A,#0FH ;保留 C口低 4位
MOV R4,A ;列值暂存进 R4
CJNE A,#0FH,LK4;列值 ≠ 全, 1”
表明此次送 0的行有键按下,转 LK4处理,
若=全 1,表明此次送 0的行无键按下。
MOV A,R2 ;取出此次 行扫描值
JNB ACC.7,LK8 ;若已扫过最后
一行就 退出扫描,否则扫下一行。
RL A ;Acc中的, 0”左移一

MOV R2,A ;新扫描值 仍存进 R2
INC R3 ;行号加 1指向下一行
SJMP LK3 ;转 LK3去扫描下一行
@ 行号:第 0行 —第 7行 → (R3)
(0,1,2,3,4,5,6,7)
@ 行扫描值,0FEH→ (R2)
(FE,FD,FB,F7,EF,DF,BF,7F)
FEH = 1111 1110 B(首次扫描 )
……………
BFH = 1011 1111 B (7次扫描 )
7FH = 0111 1111 B (8次扫描 )
注意:
只有 第 8次 扫描值 最高位 = 0
KEY1:LCALL KS1 ;查有无键闭合
JNZ LK1 ;有键闭合转消颤
LJMP LK8 ;无键闭合则退出
LK1,LCALL DL6ms ;消颤 12ms
LCALL DL6ms
LCALL KS1 ;再查有无键闭合
JNZ LK2 ;的确有,转 处理
LJMP LK8 ;确实无,退 出去
LK2,MOV R3,#00H ;(R3)← 行号初值
MOV R2,#0FEH;(R2)← 行扫描初值
LK3,MOV DPTR #0101H;指向 8155 A口
MOV A,R2 ;取 行扫描值
MOVX,@DPTR,A ;送到行线上去
INC DPTR
INC DPTR ;指向 8155 C口
MOVX A,@DPTR ;读列线的电平
ANL A,#0FH ;保留 C口低 4位
MOV R4,A ;列值暂存进 R4
CJNE A,#0FH,LK4;列值 ≠ 全, 1”
表明此次送 0的行有键按下,转 LK4处理,
若=全 1,表明此次送 0的行无键按下。
MOV A,R2 ;取出此次 行扫描值
JNB ACC.7,LK8 ;若已扫过最后
一行就退出扫描,否则扫下一行。
RL A ;Acc中的, 0”左移一

MOV R2,A ;新扫描值 仍存进 R2
INC R3 ;行号加 1指向下一行
SJMP LK3 ;转 LK3去扫描下一行LK4,MOV A,R3 此行有按键,取行号
ADD A,R3 ;行号乘 4
MOV R5,A ;得 行首值
ADD A,R5 ;即,0,4,8,12…
MOV R5,A ;暂存进 R5
KEY1:LCALL KS1 ;查有无键闭合
JNZ LK1 ;有键闭合转消颤
LJMP LK8 ;无键闭合则退出
LK1,LCALL DL6ms ;消颤 12ms
LCALL DL6ms
LCALL KS1 ;再查有无键闭合
JNZ LK2 ;的确有,转 处理
LJMP LK8 ;确实无,退 出去
LK2,MOV R3,#00H ;(R3)← 行号初值
MOV R2,#0FEH;(R2)← 行扫描初值
LK3,MOV DPTR #0101H;指向 8155 A口
MOV A,R2 ;取 行扫描值
MOVX,@DPTR,A ;送到行线上去
INC DPTR
INC DPTR ;指向 8155 C口
MOVX A,@DPTR ;读列线的电平
ANL A,#0FH ;保留 C口低 4位
MOV R4,A ;列值暂存进 R4
CJNE A,#0FH,LK4;列值 ≠ 全, 1”
表明此次送 0的行有键按下,转 LK4处理,
若=全 1,表明此次送 0的行无键按下。
MOV A,R2 ;取出此次 行扫描值
JNB ACC.7,LK8 ;若已扫过最后
一行就退出扫描,否则扫下一行。
RL A ;Acc中的, 0”左移一位
MOV R2,A ;新扫描值 仍存进 R2
INC R3 ;行号加 1指向下一行
SJMP LK3 ;转 LK3去扫描下一行
LK4,MOV A,R3;此行有按键,取行号
ADD A,R3 ;行号乘 4
MOV R5,A ;得 行首值
ADD A,R5 ;即,0,4,8,12…
MOV R5,A ;暂存进 R5
MOV A,R4 ;列值只可能=
#0F,#0E,#0D,#0B,#07H
LK5,RRC A ;取列值的最低位到 Cy
JNC LK6 ;Cy=0就找到了,即 R5
INC R5 ;否则行值增 1,即同
行中的下一个键值
SJMP LK5 ;再转 LK5判 C键值
LK6,PUSH 05H ;将找到的键值压栈
保存起来。
KEY1:LCALL KS1
JNZ LK1
LJMP LK8
LK1,LCALL DL6ms
LCALL DL6ms
LCALL KS1
JNZ LK2
LJMP LK8
LK2,MOV R3,#00H
MOV R2,#0FEH
LK3,MOV DPTR #0101H
MOV A,R2
MOVX,@DPTR,A
INC DPTR
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
MOV R4,A
CJNE A,#0FH,LK4
MOV A,R2
JNB ACC.7,LK8
RL A
MOV R2,A
INC R3
SJMP LK3
LK4,MOV A,R3
ADD A,R3
MOV R5,A
ADD A,R5
MOV R5,A
MOV A,R4
LK5,RRC A ;取列值的最低位到 Cy
JNC LK6 ;Cy=0就找到了,即 R5
INC R5 ;否则行值增 1,即同
行中的下一个键值
SJMP LK5 ;再转 LK5判 C键值
LK6,PUSH 05H ;将找到的键值压栈
保存起来。
LK7,LCALL DL6ms;延 6ms
LCALL KS1;键释放?
JNZ LK7;未释放,等
LCALL DL6ms ;消颤
LCALL DL6ms
POP ACC ;键值 → A
RND,RET
LK8,MOV A,#0FFH;无键闭合标志 → A
RET
矩阵式键盘 线反转法 (P.202)
AT89C51
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
+5v
P202图 6-28
0行
1行
2行
3行
0列
1列
2列
3列
原理,
@ 由 行线输出 全,0”, 读入
列线,判有无键按下。
@ 若有键按下,再将读入的列
线值由 列线输出,读进行线
的值。
@ 第一步读进的列线值与第
二步读进的行线值 相加,
从而得到代表此键的唯一
的 特征值 。
@ 线反转法因 输入与输出线
反过来 用而得名。
@ 优点 是判键速度 快,两次
即可。
矩阵式键盘 线反转法 图例
AT89C51
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
+5v
① MOV P1,#0F0H ;低位送全, 0”
MOV A,P1 ;读进 P1口电平
ANL A,#0F0H ;保留高 4位
CJNE A,#0F0H,MK3(② );若有键按下则 P1.4—P1.7必
有, 0”位,跳转到 MK3去处理 ;
若无键按下 则退出键扫描。
0行
1行
2行
3行
0列
1列
2列
3列
设,第 3行 /第 1列结点有键按下
首先,,1111 0000” → P1
然后读 P1,P1←,1101 xxxx”
只留高 4位, A =, 1101 0000”
因为有键按下,A≠11110000
P202图 6-28
AT89C51
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
+5v
① MOV P1,#0F0H ;低位送全, 0”
MOV A,P1 ;读进 P1口电平
ANL A,#0F0H ;保留高 4位
CJNE A,#0F0H,MK3(② )
0行
1行
2行
3行
0列
1列
2列
3列
此时,R2 ←,1101 0000”
然后,A ←,1101 1111”
返送 P1口,,1101 1111” → P1
再读 P1口,P1←,xxxx 0111”
只留低 4位, A ←,0000 0111”
特征值, A+R2=,1101 0111”
② MOV R2,A ;暂存回 R2
ORL A,#0FH ;高 4位保留 ;
低 4位充, 1”
MOV P1,A ;新值返送 P1口
MOV A,P1 ;再 读进 P1口电平
ANL A,#0FH ;只留低 4位
ADD A,R2 ;得到键特征值
P202图 6-28
矩阵式键盘 线反转法 图例
D/A转换接口扩展
五,D/A转换器接口 ( P.209)
D/A转换的一般工作原理,
常用 电阻分压 /分流 来实现 D/A转换。
D/A转换器将数字信息转换成与数值成正比的电压 /
电流。 有权电阻解码网络 与 T型解码网络 两种构建
方法,又以 T型解码网络 最为常用。
权电阻解码网络
简单 。但随着 D/A转换的位数增加,权电阻值跨度增
大,在集成电路中 难于实现 。
T 型解码网络
电阻 数量大 一倍。但电阻值归一化程度高,容易集成,
精度高 。应用最为普遍。
权电阻解码网络
?
+I Iout
R0
R1
R2
R3
R4
R5
R6
R7
若,R0 = R
R1 = R/2
R2 = R/4
R3 = R/8
…………
R7 = R/128
从而,I0 = Vref/R
I1 = 2 Vref/R
I2 = 4 Vref/R
I3 = 8 Vref/R
…………
I7 =128Vref/R
开关控
制电路
开关控制电路的作用:
将, 0”值 对应的开关打到 地,
将, 1”值 对应的开关接通 Vref
加法器电路
简单,权电阻值跨度大,
在集成电路中难于实现
D7
D6
D5
D4
D3
D2
D1
D0
Vref
?
+ Iout
2R
2R
2R
2R
2R
2R
2R
2R
每个 2R支路的电流均为
上一支路的 1/2:
I7 = (Vref/2R)
I6 = (Vref/2R)/2
I5 = (Vref/2R)/4
…………
I0 = (Vref/2R)/128开关控制电路
开关控制电路,“0”值 将开关打到 地 ;, 1”值 将开关接通 Vref
加法器电路
T 型解码网络
2R
R
R
R
R
R
R
R
深度负反馈条件下,运放的, 虚短特性,,
Vd ? 0,(因开环增益极大,输入端之间压差极小 )
Ii ? 0,(因输入阻抗极大,输入电流极小 )
从而, 由节点 向下看 去阻值均为 2R
由节点 向下向右看 去阻值均为 R
Vref
“1”
“0”
I7
I6
I5
I4
I3
I2
I0
I1
电阻数量增大一倍,但阻值归一,集成容易,精度高
D7
D0
8位 CMOS数模转换芯片 DAC 0832:
CS VCC
WR1 ILE
AGND WR2
D3 XFER
D2 D4
D1 D5
D0 D6
Vref D7
Rfb Iout2
DGND Iout1
DAC0832
20 PIN DIP封装
√ 8位 D/A,分辨率 =Vref/256
√ CMOS低功耗器件,+5~ +15V
单电源供电
√ 电流输出型器件 (需外接运放 )
√ 具有双缓冲控制输出
√ 采用 T型电阻解码网络结构
√ 参考电压源,-10~ +10V
DAC 0832 引脚定义 ( P.211)
CS VCC
WR1 ILE
AGND WR2
D3 XFER
D2 D4
D1 D5
D0 D6
Vref D7
Rfb Iout2
DGND Iout1
DAC0832
20 PIN DIP封装
D0—D7,8位数字量输入端
/CS,片选端,低有效
ILE,数据锁存允许,高有效
/WR1,写控制信号 1,低有效
/WR2,写控制信号 2,低有效
/XFER,数据传送控制信号
Iout1,电流输出端 1
Iout2,电流输出端 2
Rfb,内置反馈电阻端
Vref,参考电压源,-10~+10V
DGND,数字量地
AGND,模拟量地
Vcc,+5~ +15V单电源供电端
DAC0832 内部结构框图 ( P.210)
书上 P.210图有误
与非门 应改为 与门
&
≥1
≥1
1
10
0
0
0
1
1
LE2
ILE
CE
WR1
WR2
XFER
D7
D0
LE1








DAC



D/A
Vref
Iout2
Iout1
Rfb
LE=1,Q 跟随 D
LE=0,Q 锁存 D
D0—D7,8位数字量输入端
/CS,片选端,低有效
ILE,数据锁存允许,高有效
/WR1,写控制信号 1,低有效
/WR2,写控制信号 2,低有效
/XFER:数据传送控制信号
Iout1:电流输出端 1
Iout2:电流输出端 2
Rfb,内置反馈电阻端
Vref,参考电压源,-10~ +10V
DGND,数字量地
AGND,模拟量地
Vcc,+5~ +15V单电源供电端
DAC0832 与单片机的连接 P.213
89C51单片机 DAC 0832
P0.0—P0.7
P2.0
8位 DI0—DI7
EA WR XFER
CS+5V
6MHz
30Px2
对应 P.213图 6-36(C),是两个寄存器同时选通及锁存方式
WR1
WR2
+5V
Vcc
Vref
ILE
?
+uA741
-12V
+12V
GND AGND DGND
Iout1
Iout2
Rfb




DAC
0832







DAC
0832







P.213(a),DAC寄存器直通方式
P.213(b),输入寄存器直通方式
P.213(c),两个寄存器同时选通及锁存方式
DAC0832 常见的几种用法 ( P.213)
&
≥1
≥1
1
10
0
0
0
1
1
LE2
ILE
CE
WR1
WR2
XFER
D7
D0
LE1








DAC



D/A
Vref
Iout2
Iout1
Rfb
LE=1,Q 跟随 D
LE=0,Q 锁存 D
P.213(a),DAC寄存器直通方式
P.213(b),输入寄存器直通方式
P.213(c),两个寄存器同时选通及锁存方式
≥1
&
或非门
非与门
输入任一为, 1”输出皆为, 0”
输入全为, 0”,输出才为, 1”
输入全为, 0”,输出才为, 1”
输入任一为, 1”输出皆为, 0”
DAC0832 的编程应用举例
P215例 1 产生矩形波 P215例 2 产生锯齿波
LL:MOV A,#00H ;低电平
MOV DPTR,#0FEFFH
MOVX @DPTR,A ;送转换
LCALL DMS1 ;低宽度
MOV A,#0FFH ;高电平
MOVX @DPTR,A ;送转换
LCALL DMS2 ;高宽度
SJMP LL
MOV A,#00H ;起始值
MOV DPTR,#0FEFFH
MM,MOVX @DPTR,A ;送转换
INC A
NOP
NOP
NOP ;决定坡度
SJMP MM
DAC0832编程应用举例,P216例 3产生三角波
MOV A,#00H
MOV DPTR,#0FEFFH
SS1,MOVX @DPTR,A ;送转换
NOP
NOP
NOP
SS2,INC A ;等速上升
JNZ SS1
SS3,DEC A
MOVX @DPTR,A
NOP
NOP
NOP ;等速下降
JNZ SS3
SJMP SS2
同样的编程思路,若要产生
如下的梯形波也很容易:
三角波
梯形波
DAC0832 的编程应用举例 (硬件实验十)
SE13:MOV SP,#60H
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#03H
MOV 7BH,#02H
REPT:MOV R6,#00H
JIA1:MOV DPTR,#0FFE0H
MOV A,R6
MOVX @DPTR,A;送 D/A转换
MOV R0,#79H;显缓最低位
LCALL PTDS ;拆字
MOV R2,#10H
XS1:LCALL DIS ;显示
DJNZ R2,XS1
INC R6 ;加 1
显示
缓冲
区初

PTDS——
单字节拆字子程序:
功能:
将 A中的单字节
16进制数拆开:
出口:
低 4位 放进 R0间接寻址
指向的单元 ( 79H)
高 4位 放进 R0+ 1后指向
的单元 ( 7AH)
DAC0832 的编程应用举例 (硬件实验十)
SE13:MOV SP,#60H
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#03H
MOV 7BH,#02H
REPT:MOV R6,#00H
JIA1:MOV DPTR,#0FFE0H
MOV A,R6
MOVX @DPTR,A;送 D/A转换
MOV R0,#79H;显缓最低位
LCALL PTDS ;拆字
MOV R2,#10H
XS1:LCALL DIS ;显示
DJNZ R2,XS1
INC R6 ;加 1
CJNE R6,#0FFH,JIA1;不到 0FF则继续加
JIAN:MOV DPTR,#0FFE0H
DEC R6
MOV A,R6
MOVX @DPTR,A ;送转换
MOV R0,#79H
LCALL PTDS
MOV R2,#10H
XS2:LCALL DIS ;显示
DJNZ R2,XS2
CJNE R6,#00H,JIAN;不为 0继续减
SJMP REPT ;循环
显示
缓冲
区初

A/D转换接口扩展
六,A/D转换器接口 ( P.204)
A/D转换的一般工作模式常用的有:
逐次逼近式
双积分式
并行式
Σ -Δ 式
尤以前两种最为普遍。
控制逻辑与时序
D/A转换器
SAR
Vin
比较器





START CLK
EOC
D0
D7
+Vref -Vref OE
Vst
逐次逼近式 A/D转换器结构
+
-
D/A转换器的输出,从二进制数据的最高位起,依次
逐位置 1,与待转换的 模拟量 比较,若前者小于 后者,
该位置 1并保留下来,若前者大于 后者,该位
清 0;然后再照此
比较下一位,……
直至比完最低位。
最后得到的结果
即 A/D转换的值。
控制逻辑与时序
D/A转换器
SAR
Vin
比较器





START CLK
EOC
D0
D7
+Vref -Vref OE
Vst
逐次逼近式 A/D转换器工作原理
?转换速度较快(比较次数等于 A/D的位数)通常
在 几 ?S至 几百 ?S数量级 。
?被转换的模拟量若频率很高(变化较快)则要
加 S/H电路 。
?被转换的模拟量若幅度过小(信号微弱)则需
要加 信号调理电路 。
逐次逼近式 A/D转换器 特点
双积分式 A/D转换器结构与工作原理
比较器
积分器
+
- +
-
-标准电压
时钟
控制逻辑
计数器
+ Vin
T T?
时间固定 斜率固定
Vin
t
输出
电路对未知输入电压先进行固定时间 T的积分 (充
电 ),然后对已知标准电压进行反向积分 (放电 ),
直至放电为 0,放电所花时间 T?(正比于输入电压 )
例如,ICL7107
双积分式 A/D转换器 特点
?转换速度较 慢 (因为 A/D转换的过程要两次积分)
通常在 几十 mS至几百 mS数量级 。
?适用于转换变化较缓慢的模拟量(频率较低)输
入端一般 不需要在加 S/H电路 。
?抗干扰性强 (信号波动对精度影响不大)。
?性价比高,与逐次比较型相比,同样价格条件下
转换精度较高,常用于数字多用表。
IN3 IN2
IN4 IN1
IN5 IN0
IN6 ADDA
IN7 ADDB
START ADDC
EOC ALE
D3 D7
OE D6
CLK D5
VCC D4
Vref+ D0
GND Vref-
D1 D2
ADC0809
8位 CMOS模数转换芯片 ADC 0809 P.205
√ 8位 A/D,量化间隔 =Vin/(256-1)
√ CMOS低功耗器件
√ 8 通道 多路开关输入切换电路
√ 单电源 +5,Vref=+5V
Vin范围,单极性 0—+5V
√ 逐次逼近 结构
√ 每次转换时间, ?100?S
60个时钟周期,fmax=640KHz
(推荐 CLK=500KHz)
√ 转换结果读取方式,
① 延时读数 ② 查询 EOC=1 ③ EOC申请中断
IN3 IN2
IN4 IN1
IN5 IN0
IN6 ADDA
IN7 ADDB
START ADDC
EOC ALE
D3 D7
OE D6
CLK D5
VCC D4
Vref+ D0
GND Vref-
D1 D2
ADC0809
IN0—IN7,8通道模拟量输入端
D0—D7,8位数字量输出端
ADDC,ADDB,ADDA:
接地址锁存器的低三位地址
ALE,地址锁存允许控制信号
START:清 0内寄存器,启动转换
OE,允许读 A/D结果,高有效
CLK:时钟输入端,应 ≤ 640KHz
EOC:转换结束时为高
Vcc,+5V
Vref+:参考电压,+5V
Vref-,0V
ADC 0809
引脚定义,
ADC0809 结构框图 (参见 P.205)
8 通
道多
路开

IN0
IN7
地址
译码
锁存
ADDAADDB
ADDC
ALE
控制逻辑与时序
D/A转换器
SAR
Vin
比较器





START CLK
EOC
D0
D7
+Vref -Vref OE
Vst
+
-
ADC0809 与单片机的连接 P.207
89C51单片机 ADC 0809
锁存器
74LS373
P0.0-P0.7
ALE
P2.0
8D Q0
ALE
CLK
ADDA
D0-D7
G
EA OE
START
RD
WR
OE
Q1
Q2
ADDB
ADDC+5V
INT1 EOC≥1
≥1
6MHz
30Px2
?2
CK Q
D /Q图中的 2 分频电路可用 D触发器实现
口地址
可以为:
0FE00~
0FE07H
也可为:
0FEF0~
0FEF7H
ORG 0000H
AJMP MAIN
ORG 0013H ;外部中断 1的中断矢量
AJMP INT
MAIN,MOV R0,#0A0H ;存结果的缓冲区,A0H-A7H
MOV R2,#08H ;待采集的 通道数为 8
SETB IT1 ;选择 下降沿 触发中断
SETB EA ;开中断
SETB EX1
MOV DPTR,#0FEF0H ;通道 0的地址
MOVX @DPTR,A ;启动转换。 注意,A=?
HERE,SJMP HERE ;等待中断
ADC0809八路巡回中断式数据采集 P.209
ORG 0000H
AJMP MAIN
ORG 0013H
AJMP INT
MAIN,MOV R0,#0A0H
MOV R2,#08H
SETB IT1
SETB EA
SETB EX1
MOV DPTR,#0FEF0H
MOVX @DPTR,A
HERE,SJMP HERE
INT:MOVX A,@DPTR ;读数据
MOV @R0,A;数据放进缓存单元
INC R0 ;指向下一缓存
INC DPTR ;指向下一通道
DJNZ R2,RTN; 8 次未完就继续采集,;已完就关中断、停采集
CLR EA
CLR EX1
RETI
RTN:MOVX @DPTR,A;启动采集
RETI
ADC0809八路巡回中断式数据采集 P.209
SE11:MOV SP,#60H ;设 SP堆栈从 61H开始
MOV 7EH,#00H
MOV 7DH,#08H
MOV 7CH,#00H 显示缓冲区 79H—7EH
MOV 7BH,#09H 赋初值,0809黑黑,
MOV 7AH,#10H
MOV 79H,#10H












SE11,MOV SP,#60H
(显缓 79H~ 7EH赋初值, 0809黑黑, ——略

ADC:LCALL DIS;通过调显示也延时 >100uS
MOV A,#00H ;累加器里任意赋一个值
MOV DPTR,#0FFE0H ;0809通道 0口地址
MOVX @DPTR,A ;启动 0809的 0通道采样
LCALL DIS ;显示 & 延时
MOVX A,@DPTR ;取出采样值
MOV R0,#79H ;R0指向显示缓冲区首址
LCALL PTDS ;采样值拆开并送显缓
SJMP ADC ;连续转换












OVER !