汇编语言实现通过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    ;初始化键盘数码管控制器(825513     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    ;初始化键盘数码管控制器(825513     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

 

posted @ 2019-12-12 21:30  一杆赤槊  阅读(2871)  评论(0编辑  收藏  举报