汇编语言实现通过ADC0809数模转化器实现用8个7位数码管计数电压表数值
实验十一 并行AD实验(数字电压表实验)
三、实验内容
1、ADC0809(C2区)
(1) 模数转换器,8位精度,8路转换通道,1路并行输出
(2) 转换时间100us,转换电压范围0~5V
2、编写程序:制作一个电压表,测量0~5V,结果显示于数码管上。
四、实验原理图
五、实验步骤
1、连线说明:
C2区:CS、ADDA、ADDB、ADDC |
—— |
A3区:CS3、A0、A1、A2(选择通道) |
C2区:CLK |
—— |
B2区:500K |
C2区:IN0 |
—— |
F6区:0~5V |
D3区:CS、A0、A1 |
—— |
A3区:CS1、A0、A1 |
D3区:PC0、PC1 |
—— |
F5区:KL1、KL2 |
D3区:JP20、B、C |
—— |
F5区:A、B、C |
2、调节0~5V电位器(F6区)输出电压,显示在LED(最右边2位)上的电压数字量会随之改变。用万用表验证AD转换的结果。
1、InitKeyDisplay 初始化键盘、LED控制器8255
2、Display8 显示子程序(8255对数码管扫描)
输入参数: SI—指向8字节显示缓冲区;
如果需要显示小数点,8位16进制数的最高位为1,例如:80H;
如果某位不需要显示,符值10H;
如果需要显示负号“-”,符值11H
例子: 10H,10H,03H,82H,00H,00H,00H, 00H 显示为:“ 32.0000”
这是实现上述实验的源代码:
其中第4、5位为16进制,底4位为10进制
1 .MODEL TINY 2 ADDR_0809 EQU 0250H ;这里是250h最后4位为0000,所以对应的实验箱上8086CPU对应的A2A1A0为000,接到ADC0809的ADDA、ADDB、ADDC也为000,对应选择通道0,对应IN0位。IN0位就接收来自F5区的0~5V的电压 3 EXTRN InitKeyDisplay:NEAR, Display8:NEAR ;这里InitKeyDisplay和Display都是内置子函数,在上面文档中已做说明 4 .STACK 100 5 .DATA 6 BUFFER DB 8 DUP(?) 7 LastAD DB 0 ;上一次AD转换值 8 .CODE 9 START: MOV AX,@DATA 10 MOV DS,AX 11 NOP 12 CALL InitKeyDisplay ;初始化键盘数码管控制器(8255) 13 XOR AL,AL 14 JMP START6 15 START1: MOV CX,8 ;采样8次 16 MOV BX,0 ;累计8次的采样值 17 START2: CALL AD0809 18 XOR AH,AH 19 ADD BX,AX 20 LOOP START2 21 MOV AX,8 22 XCHG AX,BX 23 DIV BL ;8次的平均值 24 CMP AL,LastAD 25 JZ START3 26 START6: MOV LastAD,AL 27 CALL Display_Data 28 START3: CALL DLTime 29 JMP START1 30 AD0809 PROC NEAR 31 PUSH CX 32 MOV AL,0 33 MOV DX,ADDR_0809 34 OUT DX,AL 35 MOV CX,100 36 LOOP $ ;延时,等待AD转换完成 37 MOV DX,ADDR_0809 38 IN AL,DX 39 POP CX 40 RET 41 AD0809 ENDP 42 DISPLAY_DATA PROC NEAR 43 MOV AH,AL 44 AND AL,0FH 45 MOV BUFFER + 4,AL 46 MOV AL,AH 47 AND AL,0F0H 48 ROR AL,4 49 MOV BUFFER + 5,AL 50 MOV AL,AH 51 XOR AH,AH 52 MOV BL,51 ;255/51 (16进制的1 = 1/51V) 两位16进制的数可以表示0~255一共256个数,0~5V分为一共51个电压单位 53 DIV BL 54 OR AL,80H ;加上小数点 小数点对应的g位对应D7~D0的代码为1000 0000 55 MOV BUFFER + 2,AL 56 MOV AL,10 57 MUL AH 58 DIV BL 59 MOV BUFFER + 1,AL ;第一位小数 60 MOV AL,10 61 MUL AH 62 DIV BL 63 MOV BUFFER,AL ;第二位小数 64 MOV buffer+3,10H 65 MOV buffer+6,10H 66 MOV buffer+7,10H ;消隐 67 RET 68 DISPLAY_DATA ENDP 69 DLTime PROC NEAR 70 MOV CX,10 71 LEA SI,buffer 72 XX: CALL Display8 73 LOOP XX 74 RET 75 DLTime ENDP 76 77 END START
这是用8个7位数码管显示2进制的电压表数值:
1 .MODEL TINY 2 ADDR_0809 EQU 0250H 3 EXTRN InitKeyDisplay:NEAR, Display8:NEAR 4 .STACK 100 5 .DATA 6 BUFFER DB 8 DUP(?) 7 LastAD DB 0 ;上一次AD转换值 8 .CODE 9 START: MOV AX,@DATA 10 MOV DS,AX 11 NOP 12 CALL InitKeyDisplay ;初始化键盘数码管控制器(8255) 13 XOR AL,AL 14 JMP START6 15 START1: MOV CX,8 ;采样8次 16 MOV BX,0 ;累计8次的采样值 17 START2: CALL AD0809 18 XOR AH,AH 19 ADD BX,AX 20 LOOP START2 21 MOV AX,8 22 XCHG AX,BX ;交换内容 23 DIV BL ;8次的平均值 24 CMP AL,LastAD 25 JZ START3 26 START6: MOV LastAD,AL 27 CALL Display_Data 28 START3: CALL DLTime 29 JMP START1 30 AD0809 PROC NEAR 31 PUSH CX 32 MOV AL,0 33 MOV DX,ADDR_0809 34 OUT DX,AL 35 MOV CX,100 36 LOOP $ ;延时,等待AD转换完成 37 MOV DX,ADDR_0809 38 IN AL,DX 39 POP CX 40 RET 41 AD0809 ENDP 42 DISPLAY_DATA PROC NEAR 43 MOV AH,AL 44 AND AL,01H 45 MOV BUFFER + 0,AL 46 MOV AL,AH 47 AND AL,02H 48 ROR AL,1 49 MOV BUFFER + 1,AL 50 MOV AL,AH 51 AND AL,04H 52 ROR AL,2 53 MOV BUFFER + 2,AL 54 MOV AL,AH 55 AND AL,08H 56 ROR AL,3 57 MOV BUFFER + 3,AL 58 MOV AL,AH 59 AND AL,10H 60 ROR AL,4 61 MOV BUFFER + 4,AL 62 MOV AL,AH 63 AND AL,20H 64 ROR AL,5 65 MOV BUFFER + 5,AL 66 MOV AL,AH 67 AND AL,40H 68 ROR AL,6 69 MOV BUFFER + 6,AL 70 MOV AL,AH 71 AND AL,80H 72 ROR AL,7 73 MOV BUFFER + 7,AL 74 MOV AL,AH 75 RET 76 DISPLAY_DATA ENDP 77 DLTime PROC NEAR 78 MOV CX,10 79 LEA SI,buffer 80 XX: CALL Display8 81 LOOP XX 82 RET 83 DLTime ENDP 84 85 END START
这是用8个7位数码管显示2进制的电压表数值(通过循环简化):
1 .MODEL TINY 2 3 ADDR_0809 EQU 0250H 4 EXTRN InitKeyDisplay:NEAR, Display8:NEAR 5 6 .STACK 100 7 .DATA 8 buffer DB 8 DUP(?) 9 LastAD DB 0 ;上一次AD转换值 10 11 .CODE 12 START: MOV AX,@DATA 13 MOV DS,AX 14 NOP 15 CALL InitKeyDisplay 16 XOR AL,AL 17 JMP START6 18 START1: MOV CX,8 ;采样8次 19 MOV BX,0 ;累计8次的采样值 20 START2: CALL AD0809 21 XOR AH,AH 22 ADD BX,AX 23 LOOP START2 24 MOV AX,8 25 XCHG AX,BX 26 DIV BL ;8次的平均值 27 CMP AL,LastAD 28 JZ START3 29 START6: MOV LastAD,AL 30 CALL Display_Data 31 START3: CALL DLTime 32 JMP START1 33 34 AD0809 PROC NEAR 35 PUSH CX 36 MOV AL,0 37 MOV DX,ADDR_0809 38 OUT DX,AL 39 MOV CX,100 40 LOOP $ ;延时,等待AD转换完成 41 MOV DX,ADDR_0809 42 IN AL,DX 43 POP CX 44 RET 45 AD0809 ENDP 46 47 DISPLAY_DATA PROC NEAR 48 49 50 MOV AH,AL ;循环二进制显示 51 MOV DH,0 52 MOV DL,01H 53 PUSH BX 54 PUSH CX 55 MOV CX,8 56 MOV BX,0 57 myloop: AND AL,DL 58 MOV buffer+BX,AL 59 ROL DL,1 60 MOV AL,AH 61 INC BX 62 LOOP myloop 63 POP CX 64 POP BX 65 66 RET 67 DISPLAY_DATA ENDP 68 69 DLTime PROC NEAR 70 MOV CX,10 71 LEA SI,buffer 72 XX: CALL Display8 73 LOOP XX 74 RET 75 DLTime ENDP 76 77 END START