天天看點

彙編語言實作通過ADC0809數模轉化器實作用8個7位數位管計數電壓表數值

實驗十一  并行AD實驗(數字電壓表實驗)

三、實驗内容

1、ADC0809(C2區)

(1) 模數轉換器,8位精度,8路轉換通道,1路并行輸出

(2) 轉換時間100us,轉換電壓範圍0~5V

2、編寫程式:制作一個電壓表,測量0~5V,結果顯示于數位管上。

四、實驗原理圖

彙編語言實作通過ADC0809數模轉化器實作用8個7位數位管計數電壓表數值

五、實驗步驟

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進制

彙編語言實作通過ADC0809數模轉化器實作用8個7位數位管計數電壓表數值
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