现代计算机接口实验笔记

可编程定时器/计数器接口新片8253/8254

方式0:

中断信号;计数器不自动重装初值count,只计数一遍【一次计数有效】,N减到0; 

计数过程Gate0,保持当前数;

计数过程计数初值count改变,最新count减

方式1:单稳负脉冲,计数N,脉冲宽度N,只计数一遍【一次计数有效】,N减到0;

计数过程Gate1触发,重装初值count,重减

计数过程改变初值,只有当此轮结束重新触发才用新值 

方式2:【产生连续脉冲信号(速率信号)】,N建到1 高电平:低电平=N-1:1 

计数过程Gate0,停止计数,而后Gate1重新初值count计数; 

计数过程计数初值count改变,此轮无影响,下轮用新count

方式3:方波信号 奇数N 那么 高 N 偶数~2 低偶数~2

偶数 N 高N~2 低N ~2 (只取偶数)

计数过程Gate0,OUT变高,停止计数,而后Gate1重新初值count计数; 

计数过程计数初值count改变,此轮无影响,下轮用新count

 

现代计算机接口实验 (一)熟悉环境  

 D型触发器

;Q非-L7;D-SD-VCC;CLK-2A0H~2A7H;CD-2A8H~28FH
DuanKou1 equ 2a0h   
DuanKou2 equ 2a8h
code  segment
 assume cs:code
 KaiShi:
  mov dx,DuanKou1
  out dx,al
  call Dengdai
  mov dx,DuanKou2
  out dx,al
  call Dengdai
  mov ah,1
  int 16h
  je KaiShi
  mov ah, 4ch
  int 21h
     DengDai proc near  ;内置等待函数
          mov bx ,200
          Yi:mov cx,0
          Er:loop Er
          dec bx
          jne Yi
          ret
     DengDai endp
  code ends
  end KaiShi

 

【图片】控制字格式8253、8255  

8253定时、计数

8255输入输出缓存 

输入input---i---和1很像

输出output-o--和0很像

现代计算机接口实验 (二)8253实验  

1、产生周期为 1ms的连续方波,并在示波器上显示
cs接280H~287H;GATE0接VCC(正极/电/+);
CLK0接2MHZ;count=1ms*2MHZ=(10^-3)*(2*10^6)=2000;OUT0用来接示波器观察
DSEG SEGMENT
OUT0 EQU 280H
OUT1 EQU 281H
OUT2 EQU 282H
CTL0  EQU 283H
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
 MOV AX,DSEG
 MOV DS,AX
 
 MOV DX,CTL0
 MOV AL,00110111B
 OUT DX,AL
 
 MOV DX,OUT0
 MOV AL,00H
 OUT DX,AL
 MOV AL,20H
 OUT DX,AL
 
 MOV AH,4CH
 INT 21H
 CSEG ENDS
 END START

2、产生周期为 1ms 的连续负脉冲,并在示波器上显示

 CLK0-2MHZ  8253CS-280H~283H,GATE0接VCC(正极/电/+);

count=1ms*2MHZ=2000;OUT0接示波器

 
 DSEG SEGMENT
    OUT0 EQU 280H
    OUT1 EQU 281H
    OUT2 EQU 282H
    CTL EQU 283H
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
    MOV AX,DSEG
    MOV DS,AX
    
    MOV DX,CTL
    MOV AL,00110101B
    OUT DX,AL
    
    MOV DX,OUT0
    MOV AL,00H
    OUT DX,AL
    MOV AL,20H
    OUT DX,AL
    
    MOV AH,4CH
    INT 21H
CSEG ENDS
END START





3、接收按键开关产生的信号进行计数, 10 次后结束,并使 LED 亮

cs接280H~287H;GATE0接VCC(正极/电/+);

CLK0接单次脉冲(按按钮观察);count=9;OUT0接LED灯
DSEG SEGMENT
OUT0 EQU 280H
OUT1 EQU 281H
OUT2 EQU 282H
CTL0  EQU 283H
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
 MOV AX,DSEG
 MOV DS,AX
 
 MOV DX,CTL0
 MOV AL,00010001B
 OUT DX,AL
 
 MOV DX,OUT0
 MOV AL,09H
 OUT DX,AL
 
 MOV AH,4CH
 INT 21H
 CSEG ENDS
 END START

4、产生周期为1s方波,并在LED上显示

 ;8253cs 280H~283H
 ;OUT0-CLK1,CLK0-2MHZ,count=1s*2MHZ=2000000=2000*1000
 ; GATE0-GATE1接VCC(正极/电/+)     OUT1 接LED


 DSEG SEGMENT
    OUT0 EQU 280H
    OUT1 EQU 281H
    OUT2 EQU 282H
    CTL EQU 283H
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
    MOV AX,DSEG
    MOV DS,AX
    
    MOV DX,CTL
    MOV AL,00110111B;计数器0,高低位,方式3  方波,BCD
    OUT DX,AL
    
    MOV DX,OUT0
    MOV AL,00H
    OUT DX,AL
    MOV AL,20H
    OUT DX,AL
    
    MOV DX,CTL
    MOV AL,01110111B;计数器1,高低位,方式3  方波,BCD
    OUT DX,AL
    
    MOV DX,OUT1
    MOV AL,00H
    OUT DX,AL
    MOV AL,10H
    OUT DX,AL
    
    MOV AH,4CH
    INT 21H
CSEG ENDS
END START



5、产生周期为 10ms ,负脉冲宽度为 100us 的连续脉冲

cs接280H~287H;GATE0、GATE1接VCC(正极/电/+);

CLK0接2MHZ;
count0=100us*2MHZ=10^-4*2*10^6=200;
CLK1接OUT0;
count1=10ms/100us=100;
用OUT1连接示波器观察
DSEG SEGMENT
OUT0 EQU 280H
OUT1 EQU 281H
OUT2 EQU 282H
CTL0  EQU 283H
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
 MOV AX,DSEG
 MOV DS,AX
 
 MOV DX,CTL0
 MOV AL,00100101B
 OUT DX,AL
 
 MOV DX,OUT0
 MOV AL,02H
 OUT DX,AL
 
 
 MOV DX,CTL0
 MOV AL,01100101B
 OUT DX,AL
 MOV DX,OUT1
 MOV AL,01H
 OUT DX,AL
 
 MOV AH,4CH
 INT 21H
 CSEG ENDS
 END START

 6、产生周期为 10ms , 负脉冲宽度为1 ms的连续脉冲

cs接280H~287H;GATE0、GATE1接VCC(正极/电/+);

CLK0接2MHZ;
count0=1ms*2MHZ=10^-3*2*10^6=2000;
CLK1接OUT0;
count1=10ms/1ms=10;
用OUT1连接示波器观察
DSEG SEGMENT
OUT0 EQU 280H
OUT1 EQU 281H
OUT2 EQU 282H
CTL0  EQU 283H
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:
 MOV AX,DSEG
 MOV DS,AX
 
 MOV DX,CTL0
 MOV AL,00110101B
 OUT DX,AL
 
 MOV DX,OUT0
 MOV AL,00H
 OUT DX,AL
 MOV AL,20H
 OUT DX,AL
 
 
 MOV DX,CTL0
 MOV AL,01010101B
 OUT DX,AL
 MOV DX,OUT1
 MOV AL,10H
 OUT DX,AL
 
 MOV AH,4CH
 INT 21H
 CSEG ENDS
 END START

现代计算机接口实验 (三)8255实验  

1、A 口工作在方式0 输入方式,接8 个开关,B 口工作在方式0 输出方式,接
8 个LED, PC7 接单脉冲发生器,输入负脉冲时,读一次A 口,存在TABLE 单
元中,同时在B 口显示,读10 次结束。
;8255cs  288H~28BH
 ;pc7凹
 ;pB7~pB0-L7~L0
 ;pa7~pa0-k7~k0
 ;
 ;
 DATA SEGMENT
    PA EQU 288H
    PB EQU 289H
    PC EQU 28AH
    CTL55 EQU 28BH
    LTABLE DB 10 DUP(?)
DATA ENDS

STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS

CSEG SEGMENT 
    ASSUME CS:CSEG,DS:DATA

START:
    MOV AX,DATA
    MOV DS,AX
    MOV CX,10
    MOV SI,0
    MOV DX,CTL55
    MOV AL,10011000B
    OUT DX,AL

WAT:   
    MOV DX,PC ;读C口
    IN AL,DX
    AND AL,80H ;检测PC7
    JNZ WAT

    MOV DX,PA ;PC7=0,读A口
    IN AL,DX
    MOV DX,PB ;送B口
    OUT DX,AL 
    MOV LTABLE[SI],AL;将读取的开关值存放到内存单元TABLE中
    INC SI

WAT1:    
    MOV DX,PC ;读C口
    IN AL,DX
    AND AL,80H ;检测PC7
    JZ WAT1
    LOOP WAT
    MOV AH,4CH
    INT 21H
CSEG ENDS
    END START



2、A 口工作在方式0 输入方式,接8 个开关,B 口工作在方式0 输出方式,接

8 个LED, PC0 接产生1s脉冲的8253, 8253 输入负脉冲时,读一次A 口,同时在B 口显示。

 ;8255cs  288H~28BH

 ;8253cs-280H~283H
 ;CLK0-2MHZ  ; CLK1-OUT0;  OUT1-PC0;
 ;pB7~pB0-L7~L0
 ;pa7~pa0-k7~k0
 ;
 ;
 DATA SEGMENT
    T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
    T1 EQU 281H
    T2 EQU 282H
    CTL1 EQU 283H
    PA EQU 288H
    PB EQU 289H
    PC EQU 28AH
    CTL55 EQU 28BH
    LTABLE DB 10 DUP(?)
 
DATA ENDS

STACK1 SEGMENT PARA STACK
    DW 20H DUP(0)
STACK1 ENDS

CSEG SEGMENT 
    ASSUME CS:CSEG,DS:DATA

START:
    MOV AX,DATA
    MOV DS,AX
 
    MOV DX,CTL55
    MOV AL,10010001B;PC上输出PC下输入
    OUT DX,AL
    CALL Init_8253
    
WAT:   
 
    MOV DX,PC ;读C口
    IN AL,DX
    AND AL,01H ;检测PC0
    JNZ WAT

    MOV DX,PA ;PC7=0,读A口
    IN AL,DX
    MOV DX,PB ;送B口
    OUT DX,AL

WAT1:     
    MOV DX,PC ;读C口
    IN AL,DX
    AND AL,01H ;检测PC0
    JZ WAT1

    JMP WAT
    MOV AH,4CH
    INT 21H;初始化8253
Init_8253 PROC
    PUSH DX
    PUSH AX
    ;/*8253产生1s的连续方波
    MOV DX,CTL1
    MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码
    OUT DX,AL
    MOV DX,T0
    MOV AL,20H
    OUT DX,AL
 
    MOV DX,CTL1
    MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T1
    MOV AL,10H
    OUT DX,AL
    ;8253产生1S的连续方波*/

    POP AX
    POP DX
    RET
Init_8253 ENDP
CSEG ENDS
    END START


 

3、A 口工作在方式0,输入,接8 个开关,B 口工作在方式0,输出,接八段

显示器;由8253 产生1S 的脉冲,PC7 接该脉冲,来个脉冲将读取A 口,显示在

屏幕上,同时;显示在八段显示器上,PC0,PC1 作为位码信号。

 ;8253cs-280H~283H
;8255cs288H~28BH
;8255pa7pa0-k7-k0;pb6~b0-gfedcba
;CLK0-2MHZ  ; CLK1-OUT0;  OUT1-PC7;PC0-S0;PC1-S1; 
;
DATA SEGMENT
    T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
    T1 EQU 281H
    T2 EQU 282H
    CTL1 EQU 283H
    PA EQU 288H
    PB EQU 289H
    PC EQU 28AH
    CTL EQU 28BH
    LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 
                DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
                ;存储0~F的段码
    DAT DB 21H
DATA ENDS

CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA

;主程序
START:
    MOV AX,DATA
    MOV DS,AX

    CALL Init_8253
    CALL Init_8255
AGAIN:
    CALL READ_PA
    CALL DISP_DAT
    JMP AGAIN

    MOV AH,4CH
    INT 21H

;数码显示字符程序
LED_1 PROC 
    LEA SI,LTABLE
    ADD SI,BX
    MOV AL,[SI]
    AND AL,7FH ;最高位设为0,以不显示小数点
    MOV DX,PB
    OUT DX,AL
    RET
LED_1 ENDP

LED_S PROC
    PUSH CX
    PUSH BX;保存

    MOV DX,PC ;熄位码
    MOV AL,0H
    OUT DX,AL;数码管熄灭
   

    MOV BH,0
    AND BL,0FH ;显示低四位~8421~0-F
    CALL LED_1
    MOV DX,PC ;选择低四位,即PC0置为1
    MOV AL,1H
    OUT DX,AL
    
    MOV DX,PC ;熄位码
    MOV AL,0H
    OUT DX,AL;数码管熄灭

    POP BX;调回保存的数,备用
    PUSH BX;重新保存

    MOV BH,0
    MOV CL,4
    SHR BL,CL
    AND BL,0FH ;显示高四位
    CALL LED_1
    MOV DX,PC ;选择高四位,即PC1置为1
    MOV AL,02H
    OUT DX,AL

    MOV DX,PC ;熄位码
    MOV AL,0H
    OUT DX,AL

    POP BX
    POP CX
    RET
LED_S ENDP

;读取A口数据
READ_PA PROC
    PUSH DX
    PUSH AX

LOOP_CHECK:
    MOV BH,0
    MOV BL,DAT
    CALL LED_S
    MOV DX,PC ;8255 C口读入
    IN AL,DX
    TEST AL,80H ;判断1s脉冲
    JNZ LOOP_CHECK
    MOV DX, PA
    IN AL,DX
    MOV DAT,AL

    POP AX
    POP DX
    RET
READ_PA ENDP

;电脑终端显示字符程序
DISP_DAT PROC
    PUSH DX
    PUSH AX
    PUSH CX

    MOV AL,DAT
    MOV CL,4
    SHR AL,CL
    AND AL,0FH

    CMP AL,0AH;和10比较
    JC S1;BCD码 修正 ;〈10直接S1
    ADD AL,7H;>9 要+7,用于进位
S1:
    ADD AL,30H;加上0的ASCII码
    MOV DL,AL ;高四位显示在屏幕上
    MOV AH,02H
    INT 21H

    MOV AL,DAT
    AND AL,0FH
    CMP AL,0AH
    JC S2
    ADD AL,7H
S2:
    ADD AL,30H
    MOV DL,AL ;低四位显示在屏幕上
    MOV AH,02H
    INT 21H
    MOV DL,' ' ;显示空格
    MOV AH,02H
    INT 21H

    POP CX
    POP AX
    POP DX
    RET
DISP_DAT ENDP

;初始化8253
Init_8253 PROC
    PUSH DX
    PUSH AX
    ;/*8253产生1s的连续方波
    MOV DX,CTL1
    MOV AL,00100101B ;选择通道0,写入高字节,方式2,用BCD码
    OUT DX,AL
    MOV DX,T0
    MOV AL,20H
    OUT DX,AL
    ;
    MOV DX,CTL1
    MOV AL,01100111B ;选择通道1,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T1
    MOV AL,10H
    OUT DX,AL
    ;8253产生1S的连续方波*/

    POP AX
    POP DX
    RET
Init_8253 ENDP

;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,CTL ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

CODE ENDS
    END START



4、A 口工作在方式0 输入方式,接4 个开关,B 口工作在方式0 输出方式,

接1 个七段显示器,PC7 接单脉冲发生器,输入负脉冲时,读一次A 口,同时

在B 口显示,读16 次结束。

 ;8253cs-280H~283H
;8255cs288H~28BH
;8255pa3pa0-k3-k0;pb6~b0-gfedcba
;8255PC7-凹,PC0-S1;
;
DATA SEGMENT
    T0 EQU 280H ;T0--CTL为计数器0--控制寄存器的地址
    T1 EQU 281H
    T2 EQU 282H
    CTL1 EQU 283H
    PA EQU 288H
    PB EQU 289H
    PC EQU 28AH
    CTL EQU 28BH
    LTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H 
                DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
                ;存储0~F的段码
    DAT DB 21H
DATA ENDS

CODE SEGMENT 
    ASSUME CS:CODE,DS:DATA

;主程序
START:
    MOV AX,DATA
    MOV DS,AX
    
    MOV CX,16
    CALL Init_8255
AGAIN:
    CALL READ_PA
    CALL DISP_DAT
    LOOP  AGAIN

    MOV AH,4CH
    INT 21H

;数码显示字符程序
LED_1 PROC 
    LEA SI,LTABLE
    ADD SI,BX
    MOV AL,[SI]
    AND AL,7FH ;最高位设为0,以不显示小数点
    MOV DX,PB
    OUT DX,AL
    RET
LED_1 ENDP

LED_S PROC
    PUSH CX
    PUSH BX;保存
    MOV DX,PC ;熄位码
    MOV AL,0H
    OUT DX,AL;数码管熄灭
   

    MOV BH,0
    AND BL,0FH ;显示低四位~8421~0-F
    CALL LED_1
    MOV DX,PC ;选择低四位,即PC0置为1
    MOV AL,1H
    OUT DX,AL
    
    MOV DX,PC ;熄位码
    MOV AL,0H
    OUT DX,AL;数码管熄灭

   ; POP BX;调回保存的数,备用
   ; PUSH BX;重新保存

    
    POP BX
    POP CX
    RET
LED_S ENDP

;读取A口数据
READ_PA PROC
    PUSH DX
    PUSH AX
    PUSH CX

LOOP_CHECK:
    MOV BH,0
    MOV BL,DAT
    CALL LED_S
    MOV DX,PC ;8255 C口读入
    IN AL,DX
    TEST AL,80H ;判断PC7
    JNZ LOOP_CHECK
    
    MOV DX,PA
    IN AL,DX
    MOV DAT,AL
   
   LOOP_C:
    MOV BH,0
    MOV BL,DAT
    CALL LED_S
    MOV DX,PC ;8255 C口读入
    IN AL,DX
    TEST AL,80H ;判断PC7
    JZ  LOOP_C
   
   
    POP CX
    POP AX
    POP DX
    RET
READ_PA ENDP

;电脑终端显示字符程序
DISP_DAT PROC
    PUSH DX
    PUSH AX
    PUSH CX

    MOV AL,DAT
    MOV CL,4
    SHR AL,CL
    AND AL,0FH

    CMP AL,0AH;和10比较
    JC S1;BCD码 修正 ;〈10直接S1
    ADD AL,7H;>9 要+7,用于进位
S1:
    ADD AL,30H;加上0的ASCII码
    MOV DL,AL ;高四位显示在屏幕上
    MOV AH,02H
    INT 21H

    MOV AL,DAT;DFFGGFG
    AND AL,0FH
    CMP AL,0AH
    JC S2
    ADD AL,7H
S2:
    ADD AL,30H
    MOV DL,AL ;低四位显示在屏幕上
    MOV AH,02H
    INT 21H
    MOV DL,' ' ;显示空格
    MOV AH,02H
    INT 21H

    POP CX
    POP AX
    POP DX
    RET
DISP_DAT ENDP

 

;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,CTL ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

CODE ENDS
    END START

 

现代计算机接口实验 (四)0832实验  

DAC0832

一、使用软件延时方法实现锯齿波、方波、三角波、梯形波。

1.1 延时法,16 次产生锯齿波,最高点-5V

;0832 Ua-示波器观察延时法
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5
DATA SEGMENT
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
   
   MOV AL, 00H
  
AGAIN:
   MOV DX, 280H;端口号
   OUT DX, AL
   CALL DELAY
   ADD AL, 10H;从00H-10H-20H-30H-40H-50H-60H-70H-80H-90H-A0H-B0H-C0H-D0H-E0H-F0H一共16次,后面又回到00H
   JMP AGAIN
   
   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH CX
     MOV CX, 0FFFFH
     L1: 
     LOOP  L1
     MOV CX, 0FFFFH
     L2:  
     LOOP L2
     POP CX
    RET
DELAY ENDP

CODE ENDS
 END START

1.2 延时法,32 次产生锯齿波,最高点-5V

;0832 Ua-示波器观察延时法
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

;0832cs280H~287H
DATA SEGMENT
DATA ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA
START:
  MOV AX, DATA
  MOV DS, AX
  
  MOV AL, 00H
AGAIN:
  MOV DX, 280H
  OUT DX, AL
  CALL DELAY
  ADD AL, 08H;从00000000-00001000-0001100……11111000一共32次,后面又回到00H
  JMP AGAIN
  
  MOV AH, 4CH
  INT 21H

DELAY PROC NEAR
  PUSH CX
  MOV CX, 0FFFFH
 L1: 
   LOOP L1
   MOV CX, 0FFFFH
L2:  
   LOOP L2
   POP CX
   RET
DELAY ENDP

CODE ENDS
END START 

2.延时法,产生方波,最高点-5V

;0832 Ua-示波器观察延时法
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5 

DATA SEGMENT
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
   
   MOV AL, 5H
  
AGAIN:
   MOV DX, 280H;端口号
   OUT DX, AL
   CALL DELAY
   NEG AL;取相反数
   JMP AGAIN
   
   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH CX
     MOV CX, 0FFFFH
     L1: 
     LOOP  L1
     MOV CX, 0FFFFH
     L2:  
     LOOP L2
     POP CX
    RET
DELAY ENDP

CODE ENDS
 END START

3.延时法,16 次产生三角波,最高点-2.5V

;0832 Ua-示波器观察延时法
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5  

 DATA SEGMENT
DATA ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA
START:
  MOV AX, DATA
  MOV DS, AX
  MOV AL, 0H
  
DRAW_ASCEND_LINE: ;画上升的边
    MOV DX, 280H
    OUT DX, AL
    CALL DELAY
    CMP AL, 80H
    JZ DRAW_DESCEND_LINE ;跳转到画下降的边
   
    ADD AL, 08H
    JMP DRAW_ASCEND_LINE

DRAW_DESCEND_LINE: ;画下降的边
    SUB AL, 08H
    MOV DX, 280H
    OUT DX, AL
    CALL DELAY
    CMP AL, 00H
    JZ DRAW_ASCEND_LINE ;跳转到画上升的边
    JMP DRAW_DESCEND_LINE
    
    MOV AH,4CH ;退出到 DOS, 即程序运行结束
    INT 21H

DELAY PROC NEAR
   PUSH CX
   MOV CX, 200H
 L1: 
   LOOP L1
   POP CX
   RET
DELAY ENDP

CODE ENDS
END  START

4.延时法,16 次产生梯形波,最高点-2.5V

;0832 Ua-示波器观察延时法
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5  

DATA SEGMENT
DATA ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA
START:
 MOV AX, DATA
 MOV DS, AX
 
 MOV AL, 00H

DRAW_ASCEND_LINE: ;画上升的腰
 MOV DX, 280H
 OUT DX, AL
 CALL DELAY
 CMP AL, 80H
 JZ  DRAW_HORIZON_LINE ;跳转到画梯形上底

 ADD AL, 08H
 JMP DRAW_ASCEND_LINE
DRAW_HORIZON_LINE: ;画梯形上底
 MOV CX, 10H
AGAIN:
 OUT DX, AL
 CALL DELAY
 LOOP AGAIN

DRAW_DESCEND_LINE: ;画下降的腰
 SUB AL, 08H
 MOV DX, 280H
 OUT DX, AL
 CALL DELAY
 CMP AL, 00H
 JZ DRAW_ASCEND_LINE;跳转到画上升的腰
 JMP DRAW_DESCEND_LINE
 
 MOV AH, 4CH ;退出到 DOS, 即程序结束
 INT 21H

DELAY PROC NEAR
  PUSH CX
  MOV CX, 200H
  L1: 
  LOOP L1
  POP CX
  RET
DELAY ENDP

CODE ENDS
 END START

一、使用硬件【8253+8255】延时方法实现锯齿波、方波、三角波、梯形波。

1.1 16 次产生锯齿波,最高点-5V


;0832 Ua-示波器观察
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

;8253 -288H~28BH;CLK0-2MHZ;GATE0-VCC;OUT0-PC7

 ;8255 -290H~293H;
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5
DATA SEGMENT
 T0_8253 EQU 288H
 KZ_8253 EQU 28BH
 
 PC_8255 EQU 292H
 KZ_8255 EQU 293H
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
 
   CALL Init_8253 
   CALL Init_8255 
   
 MOV AL, 00H
  
AGAIN:
   MOV DX, 280H;端口号
   OUT DX, AL  
    CALL DELAY
   ADD AL, 10H

   JMP AGAIN

   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH DX
     PUSH AX

  NEXT1:
     MOV DX,PC_8255
     IN AL,DX
     AND AL,80H;1000 0000B-PC7
     JNZ NEXT1
 NEXT2:
     MOV DX,PC_8255 
     IN AL,DX
     AND AL,80H
     JZ NEXT2

     
     POP AX
     POP DX
    RET
DELAY ENDP
 
Init_8253 PROC
    PUSH DX
    PUSH AX
 
    MOV DX,KZ_8253 
    MOV AL,00100111B ;选择通道0-OUT0,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T0_8253
    MOV AL,20H
    OUT DX,AL
    ;8253产生1mS的连续方波*/
    
    POP AX
    POP DX
    RET
Init_8253 ENDP
;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,KZ_8255 ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

 

CODE ENDS
 END START

2. 产生方波,最高点-5V


;0832 Ua-示波器观察
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

;8253 -288H~28BH;CLK0-2MHZ;GATE0-VCC;OUT0-PC7

 ;8255 -290H~293H;
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

DATA SEGMENT
 T0_8253 EQU 288H
 KZ_8253 EQU 28BH
 
 PC_8255 EQU 292H
 KZ_8255 EQU 293H
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
 
   CALL Init_8253 
   CALL Init_8255 
   
MOV AL, 5H
  
AGAIN:
   MOV DX, 280H;端口号
   OUT DX, AL
   CALL DELAY
   NEG AL
   JMP AGAIN


   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH DX
     PUSH AX

  NEXT1:
     MOV DX,PC_8255
     IN AL,DX
     AND AL,80H;1000 0000B-PC7
     JNZ NEXT1
 NEXT2:
     MOV DX,PC_8255 
     IN AL,DX
     AND AL,80H
     JZ NEXT2

     
     POP AX
     POP DX
    RET
DELAY ENDP
 
Init_8253 PROC
    PUSH DX
    PUSH AX
 
    MOV DX,KZ_8253 
    MOV AL,00100111B ;选择通道0-OUT0,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T0_8253
    MOV AL,20H
    OUT DX,AL
    ;8253产生1mS的连续方波*/
    
    POP AX
    POP DX
    RET
Init_8253 ENDP
;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,KZ_8255 ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

 

CODE ENDS
 END START

3. 16 次产生三角波,最高点-5V


;0832 Ua-示波器观察
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

;8253 -288H~28BH;CLK0-2MHZ;GATE0-VCC;OUT0-PC7

 ;8255 -290H~293H;
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

DATA SEGMENT
 T0_8253 EQU 288H
 KZ_8253 EQU 28BH
 
 PC_8255 EQU 292H
 KZ_8255 EQU 293H
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
 
   CALL Init_8253 
   CALL Init_8255 
   MOV AL, 00H

   DRAW_ASCEND_LINE: ;画上升的边
   
    MOV DX, 280H
    OUT DX, AL 
    CALL DELAY
    CMP AL, 80H
    
    JZ DRAW_DESCEND_LINE ;跳转到画下降的边
   
    ADD AL, 08H
    JMP DRAW_ASCEND_LINE

DRAW_DESCEND_LINE: ;画下降的边
 
    SUB AL, 08H
    MOV DX, 280H
    OUT DX, AL
    CALL DELAY
    CMP AL, 00H

    JZ DRAW_ASCEND_LINE ;跳转到画上升的边
    JMP DRAW_DESCEND_LINE

   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH DX
     PUSH AX

  NEXT1:
     MOV DX,PC_8255
     IN AL,DX
     AND AL,80H;1000 0000B-PC7
     JNZ NEXT1
 NEXT2:
     MOV DX,PC_8255 
     IN AL,DX
     AND AL,80H
     JZ NEXT2

     
     POP AX
     POP DX
    RET
DELAY ENDP
 
Init_8253 PROC
    PUSH DX
    PUSH AX
 
    MOV DX,KZ_8253 
    MOV AL,00100111B ;选择通道0-OUT0,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T0_8253
    MOV AL,20H
    OUT DX,AL
    ;8253产生1mS的连续方波*/
    
    POP AX
    POP DX
    RET
Init_8253 ENDP
;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,KZ_8255 ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

 

CODE ENDS
 END START

4. 16 次产生梯形波,最高点-5V


;0832 Ua-示波器观察
;0832cs280H~287H
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

;8253 -288H~28BH;CLK0-2MHZ;GATE0-VCC;OUT0-PC7

 ;8255 -290H~293H;
;Ua=-Uxef/256*N;Ub=-Uxef/256*N-5

DATA SEGMENT
 T0_8253 EQU 288H
 KZ_8253 EQU 28BH
 
 PC_8255 EQU 292H
 KZ_8255 EQU 293H
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
   MOV AX, DATA
   MOV DS, AX
 
   CALL Init_8253 
   CALL Init_8255 
   MOV AL, 00H

 
DRAW_ASCEND_LINE: ;画上升的腰
  
    MOV DX, 280H
    OUT DX, AL
      CALL DELAY
    CMP AL, 80H
    
    JZ  DRAW_HORIZON_LINE ;跳转到画梯形上底

    ADD AL, 08H
    JMP DRAW_ASCEND_LINE
DRAW_HORIZON_LINE: ;画梯形上底
    MOV CX, 10H
 AGAIN:
 
    OUT DX, AL
    CALL DELAY
    LOOP AGAIN

DRAW_DESCEND_LINE: ;画下降的腰
   
   SUB AL, 08H
   MOV DX, 280H
   OUT DX, AL
   CALL DELAY
   CMP AL, 00H
   JZ DRAW_ASCEND_LINE;跳转到画上升的腰
   JMP DRAW_DESCEND_LINE

   MOV AH, 4CH; 退出到 DOS,即结束程序运行
   INT 21H

DELAY PROC NEAR
     PUSH DX
     PUSH AX

  NEXT1:
     MOV DX,PC_8255
     IN AL,DX
     AND AL,80H;1000 0000B-PC7
     JNZ NEXT1
 NEXT2:
     MOV DX,PC_8255 
     IN AL,DX
     AND AL,80H
     JZ NEXT2

     
     POP AX
     POP DX
    RET
DELAY ENDP
 
Init_8253 PROC
    PUSH DX
    PUSH AX
 
    MOV DX,KZ_8253 
    MOV AL,00100111B ;选择通道0-OUT0,写入高字节,方式3,用BCD码
    OUT DX,AL
    MOV DX,T0_8253
    MOV AL,20H
    OUT DX,AL
    ;8253产生1mS的连续方波*/
    
    POP AX
    POP DX
    RET
Init_8253 ENDP
;初始化8255
Init_8255 PROC
    PUSH DX
    PUSH AX

    MOV DX,KZ_8255 ;8255方式字控制字控制;10011000
    MOV AL,98H
    OUT DX,AL

    POP AX
    POP DX
    RET
Init_8255 ENDP

 

CODE ENDS
 END START

现代计算机接口实验 (五)0809实验  

一、 实验内容

将INT0—INT7 分别连接到2 个可变电阻器上,每秒采集一次0809 转换的数字量,

要求:

1、将转换后的数字量和路号同时送往8 段显示器和CRT 上显示,采集10 个循环

后结束。

2、将采集到的数据送往内存TABLE 开始的240 个单元中存放。

;8255输入输出缓存.A-B-C-KZ--280H~283H;8255CS-280H`287H;PC7-0809-EOC;PC0--8253out1;PA--7 段数码管; PB4--数码管的 S0; PB5--数码管的 S1;PA7-PA0--DPGA
;0809数字信号改模拟信号.0809CS-290H~297H;ADDC-ADDB-ADDA选择INT000~INT111;INT0`INT7接直流电流那边的可变电阻;启动时EOC变低电平;
;8253时间计数.28BH~28EH;8253CS--288H-28FH;GATE0-GATE1-VCC;OUT0-CLK1;CLK0-1MHZ
;可变电阻.INT0INT7
;CRT电脑屏幕.
;LIGHT_LED八段数码管.;


 DATA SEGMENT
 TABLE_LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
 DB 7FH,6FH,77H,7CH,58H,5CH,79H,71H;八段数码管对应的编码0~F
 DB 80H
 TABLE_CRT DB 30H,31H,32H,33H,34H,35H,36H,37H;01234567--ARCII码
 DB 38H,39H,41H,42H,43H,44H,45H,46H;89ABCDEF--ARCII码  
 TABLE_KONG DW 0,290H,291H,292H,293H,294H,295H,296H,297H;--端口
 NUM1 DB 10H
 NUM2 DW 1010H
 TABLE_CUN DB 240 DUP(0)
DATA ENDS
STACK1 SEGMENT PARA STACK
 DW 40H DUP(0)
STACK1 ENDS
CODE SEGMENT
 ASSUME CS: CODE, DS:DATA, SS:STACK1
START:
  MOV AX, DATA;实模式下固定两条
  MOV DS, AX
 
  CALL Init_8253; 地址: 288-28BH,初始化 8253,使之产生 1s 方波
  CALL Init_8255; 地址: 280-283H,初始化 8255, A 口输出, B 输出, C 口高位输入, C 低入
  CALL WAIT_INSPACE;等待一个空格
 
  MOV CX, 11
  MOV SI, 0;地址偏移
INIT:
  MOV DI, 0

READ_INPUT:
  CALL LIGHT_LED ;8 段数码管显示
  MOV DX,282H ;读 C 口PC0输入;
  IN AL,DX
  AND AL,01H ;PC0=0?
  JZ READ_INPUT ; PC0=0低电平循环,否则出循环;
  
  INC DI
  CMP DI,9
  JZ NEXT_INPUT ;判断DI==9?跳出大循环:下一条
  PUSH DI;保存DI
  SHL DI, 1;DI左移一位=DI*2
  MOV DX, TABLE_KONG[DI]
  POP DI;恢复保存的DI
  OUT DX, AL
  
  CALL DELAY
    
  ;下面7行处理获得输入的低8位,AX有0000H AL有00H;比如AL=BFH那么变成AH=0BH;AL=0FH;
  IN AL, DX
  MOV AH, AL ;高位 AH 低位 AL 中
  PUSH CX;保存CX
  MOV CL,4 
  SHR AH,CL ;AH中右移四位,AH变成”零ד模式
  POP CX;恢复保存的CX
  AND AL,0FH ;低位 AL 中,AL变成“零×”模式
  
  MOV NUM2, AX;获取的给NUM2
  
  MOV AX, DI
  MOV NUM1, AL;NUM1将在屏幕显示
  
  CALL CRT ; CRT 电脑屏幕显示
  CALL SAVE2BUF;放在TABLE_CUN中

WAIT_TIMEOUT:
 MOV DX,282H ;读 C 口PC0输入;
 IN AL,DX
 AND AL, 01H
 JNZ WAIT_TIMEOUT ;PC0=1消耗结束高电平 ,前后一个周期

 JMP READ_INPUT;跳这个大循环

NEXT_INPUT:
 DEC CX
 CMP CX,0

 JZ FINAL ;CX=0?整个程序结束
 JMP INIT;,否则重新程序开始再进行大循环
 
FINAL:
 MOV AH,4CH
 INT 21H
;=========函数具体实现==========================

DELAY PROC NEAR
 PUSH DX
 AGAIN:
 MOV DX,282H;读 C 口
 IN AL,DX
 AND AL,80H ;PC7=0?
 JZ AGAIN ;PC7=0
 POP DX
 RET
DELAY ENDP

LIGHT_LED PROC NEAR
 MOV AL,0H ;熄灭
 MOV DX,281H
 OUT DX,AL
 
 MOV AX, NUM2
 LEA BX,TABLE_LED;取地址,低位
 XLAT TABLE_LED;AL=TABLE_LED[第AL个字节]等同于AL=[[BX]+AL]
 MOV DX,280H
 OUT DX,AL
 
 MOV AL,10H;PB4=1,点亮
 MOV DX,281H;
 OUT DX,AL
 
 MOV AL,0H ;熄灭
 MOV DX,281H
 OUT DX,AL
 
 
 MOV AX,NUM2
 MOV AL,AH
 XLAT TABLE_LED;取高位
 MOV DX,280H
 OUT DX,AL
 
 MOV AL,20H;送 PB5=1,点亮
 MOV DX,281H
 OUT DX,AL
 
 MOV AL,0H ;熄灭
 MOV DX,281H
 OUT DX,AL
 
 ;==================
 ; MOV AL,NUM1
 ; LEA BX,TABLE_LED;取 DI
 ; XLAT TABLE_LED

 ; MOV DX,280H
 ; OUT DX,AL
 ; MOV AL,10H;
 ; MOV DX,281H;送 8 段显示
 ; OUT DX,AL
; MOV AL,0H ;熄灭
; MOV DX,281H
; OUT DX,AL
 RET
LIGHT_LED ENDP

CRT PROC NEAR
 MOV AL,NUM1

 LEA BX,TABLE_CRT;取这个数组头地址

 XLAT TABLE_CRT;取低位
 
 MOV DL,AL;待显示AL中的数字
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 MOV DL,' ';待显示空格
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 
 MOV AX,NUM2
 MOV AL,AH
 LEA BX,TABLE_CRT;取高位

 XLAT TABLE_CRT;取低位

 MOV DL,AL
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 MOV AX,NUM2
 XLAT TABLE_CRT;取低位
 
 MOV DL,AL
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 MOV DL,' '
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 MOV DL,' '
 MOV AH,02H;屏幕显示字符功能
 INT 21H
 
 RET
CRT ENDP

SAVE2BUF PROC NEAR
 MOV AL,NUM1
 MOV TABLE_CUN[SI],AL
 INC SI
 MOV AX,NUM2
 MOV TABLE_CUN[SI],AH
 INC SI
 MOV TABLE_CUN[SI],AL
 INC SI
 RET
SAVE2BUF ENDP

Init_8253 PROC;
 MOV DX,28BH ;8253 控制字
 MOV AL,00100101B
 OUT DX,AL
 
 MOV DX,288H
 MOV AL,10H
 OUT DX,AL
 
 MOV DX,28BH
 MOV AL,01100111B
 OUT DX,AL
 
 MOV DX,289H
 MOV AL,10H
 OUT DX,AL
 
 RET
Init_8253 ENDP

Init_8255 PROC
 MOV AL,10001001B;控制字 A 出, B 出, C 高入, C 低入
 MOV DX,283H
 OUT DX,AL
 RET
Init_8255 ENDP

WAIT_INSPACE PROC
 NEXT:
 MOV AH,01H;输入
 INT 21H 
 CMP AL,20H
 JNZ NEXT;输入不是空格?循环:跳出循环;
 RET
WAIT_INSPACE ENDP

CODE ENDS
 END START

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值