510 likes | 777 Views
第五讲: 接口与系统 扩展( 2 ). 本讲重点: 键盘接口(键盘种类 , 矩阵键盘的行扫描与 线反转法的电路、原理与编程) ; D/A 转换接口( DAC0832 产生各种波形) ; A/D 转换接口( ADC0809 三种读取方式 , 电路 及单路采集与多路采集编程应用). 扩展键盘接口. 四、 键盘接口 P.194. 键盘 单片机系统中完成控制参数输入及修改的 基本输入设备 ,是人工干预系统的重要手段。. 单片机与计算机在键盘规模 / 键符设置等方面差别很大。. 键盘分类
E N D
第五讲:接口与系统扩展(2) 本讲重点: 键盘接口(键盘种类,矩阵键盘的行扫描与 线反转法的电路、原理与编程); D/A转换接口(DAC0832产生各种波形); A/D转换接口(ADC0809三种读取方式,电路 及单路采集与多路采集编程应用).
四、键盘接口P.194 键盘 单片机系统中完成控制参数输入及修改的基本输入设备,是人工干预系统的重要手段。 单片机与计算机在键盘规模/键符设置等方面差别很大。 键盘分类 @按键值编码方式分 (硬件)编码键盘与非(硬件)编码键盘。 @按键组连接方式分 独立连接键盘与矩阵连接键盘。
按键值编码方式:编码键盘与非编码键盘 编码键盘:采用专用的编码/译码器件,被按下的键由该器件译码输出相应的键码/键值。 特点:增加了硬件开销,编码因选用器件而异,编码固定,但编程简单。适用于规模大的键盘。 非编码键盘:单片机系统多采用此类键盘 采用软件编/译码的方式,通过扫描,对每个被按下的键判别输出相应的键码/键值。 特点:不增加硬件开销,编码灵活,适用于小规模的键盘,特别是单片机系统。但编程较复杂,占CPU时间,还须软件“消颤”。
按键组连接方式:独立连接键盘与矩阵连接键盘按键组连接方式:独立连接键盘与矩阵连接键盘 独立连接键盘:每键相互独立,各自与一条I/O线相连,CPU可直接读取该I/O线的高/低电平状态。 特点:占I/O口线多,但判键速度快,多用于设置控制键、功能键。适用于键数少的场合。 矩阵连接键盘: 键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。 特点:键多时占用I/O口线少,但判键速度慢,多用于设置数字键。适用于键数多的场合。
独立连接式键盘例1: 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 P1.0P1.1P1.2P1.3 AT89C51 特点:此子程序需不断(或定时)调用,否则可能漏判。4个键的优先级由指令顺序决定。
独立连接式键盘例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” RETI FUNC2: ……;做P1.1要求的“功能2” RETI FUNC3: ……;做P1.2要求的“功能3” RETI FUNC4: ……;做P1.3要求的“功能4” RETI & AT89C51 INT0 特点: @此子程序采用中断 查询不会漏判,省时。 @键的优先级由指令 顺序决定。 @为防止一次按键多 次中断,在功能子程 序里应安排“关/开中 断指令”并“延时”。
矩阵式键盘 P.198例 PA7PA6PA5PA4PA3PA2PA1PA0 AT89C51 8155 AD0-7 P0 ALE ALE P2.7 CE P2.0 IO/M WR WR +5v RD RD RESET RESET 0 4 8 12 16 20 24 28 EA PC0PC1PC2PC3 0列 1 5 9 13 17 21 25 29 列线 +5v 2 6 10 14 18 22 26 30 3 7 11 15 19 23 26 31 8155 控制寄存器:0100H 8155 A口地址: 0101H 8155 C口地址: 0103H A口为输出 C口为输入口 3列 0行 行线 7行 此图参照P198图6-26画的,但按照书上给的程序,键值标错了。
P.198图的标注 P.198图的正确标注 行线(PA0-PA7) 行线(PA0-PA7) 0行 1行 2行 3行 4行 5行 6行 7行 0行 1行 2行 3行 4行 5行 6行 7行 0 1 2 3 4 5 6 7 0 4 8 12 16 20 24 28 0列 0列 8 9 10 11 12 13 14 15 1 5 9 13 17 21 25 29 列 线 PC 0-3 列 线 PC 0-3 1列 1列 16 17 18 19 20 21 22 23 2 6 10 14 18 22 26 30 2列 2列 24 25 26 27 28 29 30 31 3 7 11 15 19 23 26 31 3列 3列
列线PC0-3 P.198图的正确标注 0 1 2 3 0行 1行 2行 3行 4行 5行 6行 7行 行线(PA0-PA7) 4 5 6 7 8 9 10 11 行线PA0 | PA7 0行 1行 2行 3行 4行 5行 6行 7行 12 13 14 15 16 17 18 19 0 4 8 12 16 20 24 28 0列 20 21 22 23 1 5 9 13 17 21 25 29 列 线 PC 0-3 1列 24 25 26 27 2 6 10 14 18 22 26 30 28 29 30 31 2列 3 7 11 15 19 23 26 31 3列 0列 1列 2列 3列 左右两图是一样的 习惯说“横行竖列”
行线(PA0-PA7) 矩阵式键盘名词注释 0行 1行 2行 3行 4行 5行 6行 7行 @ 行号:第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。 0 4 8 12 16 20 24 28 0列 1 5 9 13 17 21 25 29 列 线 PC 0-3 1列 2 6 10 14 18 22 26 30 2列 3 7 11 15 19 23 26 31 3列 矩阵式键盘工作原理: 先由行线送出数据,送全“0”或每次只送一位“0”;然后读进列线,判有无键按下或按键的位置并算出键值。顺序扫描。
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行 1行 2行 3行 4行 5行 6行 7行 0 4 8 12 16 20 24 28 0列 1 5 9 13 17 21 25 29 1列 列线 2 6 10 14 18 22 26 30 2列 3 7 11 15 19 23 26 31 3列
KEY1:LCALL KS1;查有无键闭合 JNZ LK1 ;有键闭合转消颤 LJMP LK8;无键闭合则退出 LK1:LCALL DL6ms;消颤12ms LCALL DL6ms LCALL KS1;再查有无键闭合 JNZ LK2;的确有,转处理 LJMP LK8;确实无,退出去 @ 行号:第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列有键按下。 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去扫描下一行 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(首次扫描) …………… BFH = 1011 1111 B (7次扫描) 7FH = 0111 1111B(8次扫描) 注意: 只有第8次扫描值最高位= 0
MOV A,R2 ;取出此次行扫描值 JNB ACC.7,LK8;若已扫过最后 一行就退出扫描,否则扫下一行。 RL A ;Acc中的“0”左移一位 MOV R2,A;新扫描值仍存进R2 INC R3;行号加1指向下一行 SJMP LK3 ;转LK3去扫描下一行 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的行无键按下。 LK4:MOV A, R3;此行有按键,取行号 ADD A, R3 ;行号乘 4 MOV R5, A ;得行首值 ADD A, R5 ;即:0,4,8,12… MOV R5, A ;暂存进R5
MOV A,R2 ;取出此次行扫描值 JNB ACC.7,LK8;若已扫过最后 一行就退出扫描,否则扫下一行。 RL A ;Acc中的“0”左移一位 MOV R2,A;新扫描值仍存进R2 INC R3;行号加1指向下一行 SJMP LK3 ;转LK3去扫描下一行 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的行无键按下。 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 LK7:LCALL DL6ms;延6ms LCALL KS1;键释放? JNZ LK7;未释放,等 LCALL DL6ms;消颤 LCALL DL6ms POP ACC ;键值→A RND:RET LK8:MOV A,#0FFH ;无键闭合标志→A RET 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;将找到的键值压栈 保存起来。
矩阵式键盘线反转法(P.202) +5v 原理: @ 由行线输出全“0”,读入 列线,判有无键按下。 @ 若有键按下,再将读入的列 线值由列线输出,读进行线 的值。 @ 第一步读进的列线值与第 二步读进的行线值相加, 从而得到代表此键的唯一 的特征值。 @ 线反转法因输入与输出线 反过来用而得名。 @ 优点是判键速度快,两次 即可。 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 0行 1行 2行 3行 AT89C51 0列 1列 2列 3列 P202图6-28
①MOV P1,#0F0H ;低位送全“0” MOV A, P1 ;读进P1口电平 ANL A,#0F0H ;保留高4位 CJNE A, #0F0H, MK3(②) ;若有键按下则P1.4—P1.7必 有“0”位,跳转到MK3去处理; 若无键按下则退出键扫描。 矩阵式键盘线反转法图例 +5v P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 0行 1行 2行 设:第3行/第1列结点有键按下 首先: “1111 0000”→ P1 然后读P1: P1←“1101 xxxx” 只留高4位: A= “11010000” 因为有键按下, A≠11110000 3行 AT89C51 0列 1列 2列 3列 P202图6-28
①MOV P1,#0F0H ;低位送全“0” MOV A, P1 ;读进P1口电平 ANL A,#0F0H ;保留高4位 CJNE A, #0F0H, MK3(②) 矩阵式键盘线反转法图例 +5v ②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;得到键特征值 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 0行 1行 2行 3行 AT89C51 此时: R2 ← “1101 0000” 然后: A ← “11011111” 返送P1口: “1101 1111” → P1 再读P1口:P1← “xxxx 0111” 只留低4位: A ← “0000 0111” 特征值: A+R2= “1101 0111” 0列 1列 2列 3列 P202图6-28
五、D/A转换器接口 (P.209) D/A转换的一般工作原理: 常用电阻分压/分流来实现D/A转换。 D/A转换器将数字信息转换成与数值成正比的电压/电流。有权电阻解码网络与 T型解码网络两种构建方法,又以T型解码网络最为常用。 权电阻解码网络 简单。但随着D/A转换的位数增加,权电阻值跨度增大,在集成电路中难于实现。 T 型解码网络 电阻数量大一倍。但电阻值归一化程度高,容易集成,精度高。应用最为普遍。
权电阻解码网络 若: 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 简单, 权电阻值跨度大,在集成电路中难于实现 Vref D7 R7 D6 R6 D5 R5 D4 R4 I D3 Iout + R3 D2 加法器电路 R2 D1 R1 D0 开关控制电路的作用: 将“0”值对应的开关打到地, 将“1”值对应的开关接通Vref R0 开关控制电路
T 型解码网络 电阻数量增大一倍, 但阻值归一,集成容易,精度高 Vref 深度负反馈条件下,运放的“虚短特性”: Vd 0 ,(因开环增益极大,输入端之间压差极小) Ii 0 ,(因输入阻抗极大,输入电流极小) 从而:由节点向下看去阻值均为2R 由节点向下向右看去阻值均为R “1” I7 D7 2R “0” R I6 2R R I5 2R R I4 每个2R支路的电流均为上一支路的1/2: I7 = (Vref/2R) I6 = (Vref/2R)/2 I5 = (Vref/2R)/4 ………… I0 = (Vref/2R)/128 2R R I3 2R R + I2 Iout 2R R I1 加法器电路 2R R I0 D0 开关控制电路 2R 2R 开关控制电路:“0”值将开关打到地;“1”值将开关接通Vref
8位CMOS数模转换芯片 DAC 0832: DAC0832 √8位D/A,分辨率=Vref/256 √CMOS低功耗器件,+5~+15V 单电源供电 √电流输出型器件(需外接运放) √具有双缓冲控制输出 √采用T型电阻解码网络结构 √参考电压源,-10~+10V CS VCC WR1ILE AGND WR2 D3 XFER D2 D4 D1 D5 D0 D6 Vref D7 RfbIout2 DGND Iout1 20 PIN DIP封装
DAC 0832引脚定义(P.211) D0—D7:8位数字量输入端 /CS: 片选端,低有效 ILE: 数据锁存允许,高有效 /WR1: 写控制信号1,低有效 /WR2: 写控制信号2,低有效 /XFER: 数据传送控制信号 Iout1:电流输出端1 Iout2:电流输出端2 Rfb: 内置反馈电阻端 Vref: 参考电压源,-10~+10V DGND: 数字量地 AGND: 模拟量地 Vcc: +5~+15V单电源供电端 DAC0832 CS VCC WR1ILE AGND WR2 D3 XFER D2 D4 D1 D5 D0 D6 Vref D7 RfbIout2 DGND Iout1 20 PIN DIP封装
DAC0832内部结构框图(P.210) Vref D0—D7:8位数字量输入端 /CS: 片选端,低有效 ILE: 数据锁存允许,高有效 /WR1: 写控制信号1,低有效 /WR2: 写控制信号2,低有效 /XFER:数据传送控制信号 Iout1:电流输出端1 Iout2:电流输出端2 Rfb: 内置反馈电阻端 Vref: 参考电压源,-10~+10V DGND: 数字量地 AGND: 模拟量地 Vcc: +5~+15V单电源供电端 输入寄存器 DAC D/A D7 D0 Iout2 寄存器 转换器 Iout1 Rfb LE2 LE1 1 ILE 1 & LE=1,Q 跟随 D LE=0,Q 锁存 D 0 CE 1 ≥1 WR1 0 0 WR2 1 ≥1 XFER 0 书上P.210图有误 与非门应改为与门
DAC0832 与单片机的连接P.213 89C51单片机 DAC 0832 +5V P0.0—P0.7 DI0—DI7 8位 Vcc Vref P2.0 CS +5V ILE XFER EA Rfb WR WR1 +12V 30Px2 WR2 接示波器 Iout1 uA741 + Iout2 6MHz -12V GND AGND DGND 对应P.213图6-36(C),是两个寄存器同时选通及锁存方式
DAC 0832 常 见 的 几 种 用 法
DAC 0832 常 见 的 几 种 用 法 P.213(a): DAC寄存器直通方式 P.213(b): 输入寄存器直通方式 P.213(c): 两个寄存器同时选通及锁存方式
DAC0832常见的几种用法(P.213) Vref 或非门 输入寄存器 DAC D/A D7 D0 Iout2 寄存器 转换器 Iout1 ≥1 输入任一为“1”输出皆为“0”输入全为“0”,输出才为“1” Rfb LE2 LE1 1 ILE 1 & 非与门 LE=1,Q 跟随 D LE=0,Q 锁存 D 0 CE 1 & ≥1 WR1 0 0 输入全为“0”,输出才为“1”输入任一为“1”输出皆为“0” WR2 1 ≥1 XFER 0 P.213(a): DAC寄存器直通方式 P.213(b): 输入寄存器直通方式 P.213(c): 两个寄存器同时选通及锁存方式
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 的编程应用举例(硬件实验十) 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 ;循环 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 显示缓冲 区初值
六、A/D转换器接口 (P.204) A/D转换的一般工作模式常用的有: 逐次逼近式 双积分式 并行式 Σ-Δ式 尤以前两种最为普遍。
逐次逼近式A/D转换器结构 START CLK EOC 控制逻辑与时序 Vin D0 D7 输出锁存器 + 比较器 SAR - Vst D/A转换器 +Vref -Vref OE
逐次逼近式A/D转换器工作原理 D/A转换器的输出,从二进制数据的最高位起,依次逐位置1,与待转换的模拟量比较,若前者小于后者,该位置1并保留下来,若前者大于后者,该位 清0;然后再照此 比较下一位,…… 直至比完最低位。 最后得到的结果 即A/D转换的值。 START CLK EOC 控制逻辑与时序 输出锁存器 Vin D0 D7 比较器 SAR Vst D/A转换器 +Vref -Vref OE
逐次逼近式A/D转换器特点 转换速度较快(比较次数等于A/D的位数)通常在几S至几百S数量级。 被转换的模拟量若频率很高(变化较快)则要加S/H电路。 被转换的模拟量若幅度过小(信号微弱)则需要加信号调理电路。
双积分式A/D转换器结构与工作原理 电路对未知输入电压先进行固定时间T的积分(充电),然后对已知标准电压进行反向积分(放电),直至放电为0,放电所花时间T(正比于输入电压) Vin +Vin +- +- 积分器 比较器 t -标准电压 控制逻辑 T T 时间固定 斜率固定 时钟 计数器 例如:ICL7107 输出
双积分式A/D转换器特点 转换速度较慢(因为A/D转换的过程要两次积分)通常在几十mS至几百mS数量级。 适用于转换变化较缓慢的模拟量(频率较低)输入端一般不需要在加S/H电路。 抗干扰性强(信号波动对精度影响不大)。 性价比高,与逐次比较型相比,同样价格条件下转换精度较高,常用于数字多用表。
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 IN2 IN4 IN1 IN5 IN0 ADC0809 IN6 ADDA IN7 ADDB START ADDC EOC ALE D3 D7 OE D6 CLK D5 VCC D4 Vref+ D0 GND Vref- D1 D2
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引脚定义: IN3 IN2 IN4 IN1 IN5 IN0 ADC0809 IN6 ADDA IN7 ADDB START ADDC EOC ALE D3 D7 OE D6 CLK D5 VCC D4 Vref+ D0 GND Vref- D1 D2
ADC0809 结构框图(参见P.205) START CLK EOC IN0 控制逻辑与时序 8 通道多路开关 D0 D7 Vin 输出锁存器 + IN7 比较器 SAR - Vst ADDA 地址译码锁存 D/A转换器 ADDB ADDC ALE +Vref -Vref OE
ADC0809 与单片机的连接P.207 锁存器74LS373 89C51单片机 ADC 0809 口地址可以为:0FE00~0FE07H 也可为: 0FEF0~ 0FEF7H D0-D7 ADDA P0.0-P0.7 8D Q0 Q1 ADDB ALE G +5V Q2 ADDC EA 2 OE 30Px2 CLK WR START ≥1 ALE P2.0 6MHz EOC ≥1 OE INT1 RD CK Q 图中的2 分频电路可用D触发器实现 D /Q
ADC0809八路巡回中断式数据采集P.209 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
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 ;连续转换 编程应用例子:硬件实验九