Upload
goro
View
118
Download
6
Embed Size (px)
DESCRIPTION
第五讲: 接口与系统 扩展( 2 ). 本讲重点: 键盘接口(键盘种类 , 矩阵键盘的行扫描与 线反转法的电路、原理与编程) ; D/A 转换接口( DAC0832 产生各种波形) ; A/D 转换接口( ADC0809 三种读取方式 , 电路 及单路采集与多路采集编程应用). 扩展键盘接口. 四、 键盘接口 P.194. 键盘 单片机系统中完成控制参数输入及修改的 基本输入设备 ,是人工干预系统的重要手段。. 单片机与计算机在键盘规模 / 键符设置等方面差别很大。. 键盘分类 - PowerPoint PPT Presentation
Citation preview
第五讲:接口与系统扩展( 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.0P1.1P1.2P1.3
KEY: JNB P1.0,FUNC1 ; 逐键判别 JNB P1.1,FUNC2 JNB P1.2,FUNC3 JNB P1.3,FUNC4 RET ; 无任何键按下由此返回FUNC1: …… ;做 P1.0 要求的“功能1” RETFUNC2: …… ; 做 P1.1 要求的“功能2” RETFUNC3: …… ; 做 P1.2 要求的“功能3” RETFUNC4: …… ; 做 P1.3 要求的“功能4” RET
AT89C51
独立连接式键盘例 2
特点:@此子程序采用中断查询不会漏判 ,省时。@键的优先级由指令顺序决定。@为防止一次按键多次中断,在功能子程序里应安排“关 /开中断指令”并“延时”。
P1.0P1.1P1.2P1.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” RETIFUNC2: …… ; 做 P1.1 要求的“功能2” RETIFUNC3: …… ; 做 P1.2 要求的“功能3” RETIFUNC4: …… ; 做 P1.3 要求的“功能4” RETI
INT0
&
( 上拉 )
AT89C51
矩阵式键盘 P.198 例
AT89C51
8155P
0ALE CE
RESET
AD0-7
EA
RESET
RD
WR
WRRD
PA7PA6PA5PA4PA3PA2PA1PA0
PC0PC1PC2PC3
P2.7ALE
+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 1516 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 34 5 6 78 9 10 11
12 13 14 1516 17 18 1920 21 22 2324 25 26 2728 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,#07HLK5: 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,#0FEHLK3 : 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 LK3LK4 : 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 ; 键值→ ARND : 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 VCCWR1 ILE
AGND WR2D3 XFERD2 D4D1 D5
D0 D6Vref D7Rfb Iout2
DGND Iout1
DAC0832
20 PIN DIP 封装
√8位 D/A ,分辨率 =Vref/256√CMOS低功耗器件, +5 ~ +15V 单电源供电√电流输出型器件 (需外接运放 )√具有双缓冲控制输出√采用 T型电阻解码网络结构√参考电压源, -10~ +10V
DAC 0832 引脚定义 ( P.211 )
CS VCCWR1 ILE
AGND WR2D3 XFERD2 D4D1 D5
D0 D6Vref D7Rfb Iout2
DGND Iout1
DAC0832
20 PIN DIP 封装
D0—D7: 8位数字量输入端/CS: 片选端,低有效ILE : 数据锁存允许 , 高有效/WR1 : 写控制信号 1,低有效/WR2 : 写控制信号 2,低有效/XFER : 数据传送控制信号Iout1 : 电流输出端 1Iout2 : 电流输出端 2Rfb: 内置反馈电阻端Vref: 参考电压源 ,-10~+10VDGND : 数字量地AGND : 模拟量地Vcc: +5 ~ +15V单电源供电端
DAC0832 内部结构框图 ( P.210 )
书上 P.210图有误
与非门应改为与门
&
≥1
≥1
1
10
00
0
1
1
LE2IL
E
CE
WR1WR2XFER
D7
D0 LE
1
输入寄存器
寄存器
DAC 转
换器
D/A
VrefIout2Iout1
Rfb
LE=1 , Q 跟随 D
LE=0 , Q 锁存 D
D0—D7: 8位数字量输入端/CS: 片选端,低有效ILE : 数据锁存允许 , 高有效/WR1 : 写控制信号 1,低有效/WR2 : 写控制信号 2,低有效/XFER :数据传送控制信号Iout1 :电流输出端 1Iout2 :电流输出端 2Rfb: 内置反馈电阻端Vref: 参考电压源 ,-10~ +10VDGND : 数字量地AGND : 模拟量地Vcc: +5 ~ +15V单电源供电端
DAC0832 与单片机的连接 P.21389C51 单片机
DAC 0832
P0.0—P0.7
P2.0
8位
DI0—DI7
EA WRXFERCS
+5V
6MHz
30Px2
对应 P.213图 6-36(C), 是两个寄存器同时选通及锁存方式
WR1WR2
+5V
VccVrefILE
+uA741
-12V
+12V
GND AGNDDGND
Iout1Iout2
Rfb
接示波器
DAC 0832 常 见 的 几 种 用 法
DAC 0832 常 见 的 几 种 用 法
P.213(a): DAC寄存器直通方式 P.213(b): 输入寄存器直通方式 P.213(c): 两个寄存器同时选通及锁存方式
DAC0832 常见的几种用法 ( P.213 )
&
≥1
≥1
1
10
00
0
1
1
LE2IL
E
CE
WR1WR2XFER
D7
D0 LE
1
输入寄存器
寄存器
DAC 转
换器
D/A
VrefIout2Iout1
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,#0FEFFHMM : MOVX @DPTR,A ;送转换 INC A NOP NOP NOP ; 决定坡度 SJMP MM
DAC0832 编程应用举例: P216例 3产生三角波 MOV A , #00H MOV DPTR,#0FEFFHSS1: MOVX @DPTR,A ; 送转换 NOP NOP NOPSS2: INC A ; 等速上升 JNZ SS1SS3: 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,#02HREPT:MOV R6,#00HJIA1: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,#02HREPT:MOV R6,#00HJIA1: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 IN2IN4 IN1IN5 IN0IN6 ADDAIN7 ADDB
START ADDC EOC ALED3 D7OE D6
CLK D5VCC D4Vref+ D0GND Vref-
D1 D2
ADC0809
8 位 CMOS 模数转换芯片 ADC 0809 P.205 √8位 A/D,量化间隔 =Vin/(256-1)√CMOS低功耗器件√8 通道多路开关输入切换电路√单电源 +5,Vref=+5V Vin 范围 : 单极性 0—+5V√逐次逼近结构√每次转换时间: 100S 60 个时钟周期 , fmax=640KHz (推荐 CLK=500KHz)√转换结果读取方式: ①延时读数 ②查询 EOC=1 ③EOC申请中断
IN3 IN2IN4 IN1IN5 IN0IN6 ADDAIN7 ADDB
START ADDC EOC ALED3 D7OE D6
CLK D5VCC D4Vref+ D0GND Vref-
D1 D2
ADC0809
IN0—IN7: 8通道模拟量输入端 D0—D7: 8位数字量输出端ADDC 、 ADDB 、 ADDA : 接地址锁存器的低三位地址ALE : 地址锁存允许控制信号START :清 0内寄存器 ,启动转换OE: 允许读 A/D 结果 , 高有效CLK :时钟输入端 , 应≤ 640KHzEOC :转换结束时为高Vcc: +5VVref+:参考电压, +5VVref-: 0V
ADC 0809引脚定义 :
ADC0809 结构框图 (参见 P.205)
8 通道多路开关
IN0
IN7
地址译码锁存
ADDAADDBADDC
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
EAOE
START
RD
WR
OE
Q1Q2
ADDBADDC+5V
INT1EOC≥1
≥1
6MHz
30Px2
2
CK QD /Q
图中的 2 分频电路可用 D触发器实现
口地址可以为:0FE00~0FE07H 也可为: 0FEF0~ 0FEF7H
ORG 0000H AJMP MAIN ORG 0013H ;外部中断 1的中断矢量 AJMP INTMAIN: 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 INTMAIN: MOV R0,#0A0H MOV R2,#08H SETB IT1 SETB EA SETB EX1 MOV DPTR,#0FEF0H MOVX @DPTR, AHERE : SJMP HERE
INT:MOVX A , @DPTR ; 读数据 MOV @R0, A ; 数据放进缓存单元 INC R0 ; 指向下一缓存 INC DPTR ; 指向下一通道 DJNZ R2 , RTN ; 8 次未完就继续采集 , ; 已完就关中断、停采集 CLR EA CLR EX1 RETIRTN: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 !