可编程定时器/计数器接口新片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