(4)流程图如图38所示。 4、预习要求
(1)复习串行通信的特点以及8251的编程方法; (2)仔细阅读本实验指导; (3)根据流程图编好程序。 5、报告要求
(1)小结8251的编程方法;
(2)若对8251发送和接收的字符进行偶校验,则程序应该如何编写。
实验十二 模/数转换器实验
1、实验目的
(1)了解模/数转换器的基本原理,掌握ADC0809芯片的使用方法。 2、实验内容
(1)实验电路原理图如图39所示。通过实验台左下角电位器RW1输出0~+5V直流电压送入ADC0809通道0(IN0),利用输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。
(2)编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。
(3)将JP3的1、2短接,使IN2处于双极性工作方式,并给IN1输入一个低频交流信号(幅度为±5V),编程采集这个信号数据并在屏幕上显示波形。
12 +5V 11 21 Ref(+) msb2-1 20 VCC 2-2 19 2-3 18 GND 2-4 Ref(-) 2-5 8 2-6 15 14 CLOCK 2-7 17 Lsb2-8 IN2 23 ADD-C 24 IN1 ADD-B 25 ADD-A EOC 7 22 ALE 6 IN0 START 9 ENABLE D7 D6 D5 D4 D3 D2 D1 D0 A2 A1 A0 EOC 13 16 1MHz 10 28 +5V R6 10K R7 10K 26 27 ● ● ● U8:。 A U8:。 A IOW CS IOR 298H
+5V 图39 模数转换实验电路原理图
3、编程提示
(1)ADC0809的IN0端口地址为298H,IN1口地址为299H。 (2)IN0单极性输入电压与转换后数字的关系为:
33
其中Ui为输入电压,UREF为参考电压,这里的参考电压为+5V电源。 (3)一次A/D转换的程序可以为 MOV DX,端口地址 OUT DX,AL;启动转换 ;延时
IN AL,DX;读取转换结果至AL中 (4)程序流程图
主程序启动A/D转换,通过延时等待转换完成,读入转换后的结果,然后调用显示子程序在屏幕上显示转换的结果。
主程序的流程如图40所示。 显示子程序如图41、42所示。
4、预习要求
(1)复习A/D转换的原理,ADC0809的结构和引脚,以及它与CPU的接口; (2)仔细阅读本实验指导; (3)按流程图编好程序。 5、报告要求
(1)整理实验的结果。把测量的输入模拟电压与数字显示列出表格; (2)小结A/D转换芯片与CPU的接口及编程方法;
(3)若程序中不是用延时等待A/D转换完成,而是用查询或中断的方法,程序应该如何编写。
将数据右移4位 调显示子程序显示其高4位 从BL中取出数据和0FH相与 N 按下吗? Y 结束 延时 读入转换后数据 所读数据赋给BL N DL大于9吗? Y DL加7 DL加30H 显示ASCII码为DL的字符 Y 开始 启动A/D转换器 开始 读转换后数据 将AL赋给CL 坐标变换 设屏幕为VGA640*480 初始横坐标CX=0 启动A/D转换通道 开始 延时 画点 CX=639吗? N CX加1 有键按下吗? Y N 结束 结束 图40 转换主程序 图41 显示子程序
图42波形显示
34
第五部分 接口实验参考程序
实验三 I/O地址译码
code segment assume cs:code start: mov dx,2a0h out dx,al call delay ;调延时子程序 mov dx,2a8h out dx,al call delay ;调延时子程序 mov ah,06h mov dl,0ffh int 21h jnz ppp jmp start
ppp: mov ah,4ch int 21h
delay proc near ;延时子程序 mov bx,3000 loop2: mov cx,0
loop1: loop loop1 dec bx jne loop2 ret delay endp code ends end start
实验四 中断
;******************; ;* 中断实验程序 *; ;******************; data segment
mess db 'THIS IS A IRQ7 INTRUPT!',0AH,0DH,'$' data ends code segment
assume cs:code,ds:data start:mov ax,cs mov ds,ax mov dx,offset int7 mov ax,250fh int 21h ;设中断程序int7的类型号为0fh cli ;清中断标志位 in al,21h ;读中断屏蔽寄存器 and al,7fh ;开放IRQ7中断 out 21h,al mov cx,10 ;记中断循环次数为10次 sti ;置中断标志位 again: jmp again
int7: mov ax,data ;中断服务程序 mov ds,ax
35
mov dx,offset mess mov ah,09 ;显示每次中断的提示信息 int 21h mov al,20h out 20h,al ;发出EOI结束中断 loop next in al,21h or al,80h ;关闭IR7中断 out 21h,al sti ;置中断标志位 mov ah,4ch ;返回DOS int 21h next: iret code ends end start
实验五(1) 简单并行接口
................... ;********************************; ;* 简单并行输入实验 *; ;********************************; code segment assume cs:code
start:mov dx,2a0h ;从2A0输入一数据 in al,dx mov dl,al ;将所读数据保存在DL中 mov ah,02 int 21h mov dl,0dh ;显示回车符 int 21h mov dl,0ah ;显示换行符 int 21h mov ah,06 ;是否有键按下 mov dl,0ffh int 21h
je start ;若无,则转start exit: mov ah,4ch ;返回DOS int 21h code ends end
实验五(2) 简单并行接口
;****************************; ;* 简单的并行输出实验 *; ;****************************; code segment
assume cs:code start: mov ah,2 ;回车符 mov dl,0dh int 21h mov ah,1 ;等待键盘输入 int 21h cmp al,27 ;判断是否为ESC键 je exit ;若是则退出 mov dx,2a8h ;若不是,从2A8H输出其ASCII码
36
out dx,al jmp start ;转start exit: mov ah,4ch ;返回DOS int 21h code ends end
实验六(1) 七段数码管实验
;***********************************************; ;*本程序为从键盘输入数据(0-9)控制LED数码管发光 * ;* LED_1.ASM * ;***********************************************; data segment led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,0ah,'Input a num (0--9h):',0dh,0ah,'$' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,28bh ;使8255的A口为输出方式 mov ax,80h out dx,al
sss: mov dx,offset mesg1 ;显示提示信息 mov ah,09h int 21h mov ah,01 ;从键盘接收字符 int 21h cmp al,'0' ;是否小于0 jl exit ;若是则退出 cmp al,'9' ;是否大于9 jg exit ;若是则退出 sub al,30h ;将所得字符的ASCII码减30H mov bx,offset led ;bx为数码表的起始地址 xlat ;求出相应的段码 mov dx,288h ;从8255的A口输出 out dx,al jmp sss ;转SSS
exit: mov ah,4ch ;返回DOS int 21h code ends end start
实验六(2) 交通灯控制实验
;十字路口红绿灯模拟演示程序
;端口各灯的设置: 1红 1黄 1绿 0 0 2红 2黄 2绿 data segment
portc1 db 24h,44h,04h,44h,04h,44h,04h ;六个灯可能 db 81h,82h,80h,82h,80h,82h,80h ;的状态数据 db 0ffh ;结束标志 data ends
code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,28bh
37