实验6-6 8255并行接口(LED)实验实验说明8255工作于方式0,此时PA, PB, PC均为可独立输入输出的并行口。
8255的各寄存器对应的端口地址为:PA口:288HPB口:289HPC口:28AH控制口:28BH8255的片选信号为CS连138译码器的288H-28FH。
由于各PC速度不同,为到达较好的实验效果,可以适当调节LED亮灭的延迟时间。
源代码:data segmentioport equ 0ff00h-0280hio8255a equ ioport+288h ;PA口io8255b equ ioport+289h ;PB口io8255c equ ioport+28ah ;PC口io8255d equ ioport+28bh ;控制口mess1 db '左循环按1',0dh,0ah,'$' ;提示信息db '右循环按2',0dh,0ah,'$'db '间隔闪烁按3',0dh,0ah,'$'db '退出按4',0dh,0ah,'$'mess2 db '按无效键继续选择',0dh,0ah,'$'mess3 db '按任意键退回主菜单',0dh,0ah,'$'data endsstack segmentsta db 20 dup(?)top equ length stastack endscode segmentassume cs:code,ds:data,ss:stack,es:datastart: mov ax,data ;data段装填mov ds,axmov ax,stack ;stack段装填mov ss,axmov sp,top ;设置栈顶mov sp,axmov dx,io8255dmov al,80h;命令字10000000b,表示特征位为1,A组为0方式,A端口出,out dx,al ;PC4-PC7出,B组为0方式,B端口出,PC0-PC3出bg: lea dx,mess1 ;显示提示信息mess1mov ah,09hint 21hmov ah,08h ;输入字符,结果保存至alint 21hpush ax ;保存输入的值lea dx,mess3 ;显示提示信息mess3mov ah,09hint 21hpop ax ;拿出保存的值mov ah,al ;ah=alcmp al,'1' ;输入为1,跳转到zxhjz zxhmov al,ah ;al=ahcmp al,'2' ;输入2,跳转到yxhjz yxhmov al,ah ;al=ahcmp al,'3' ;输入3,跳转到jgsjz jgsmov al,ah ;al=ahcmp al,'4' ;输入4,跳转到wxjnz wxjmt qitwx: lea dx,mess2 ;显示提示信息mess2mov ah,09hint 21hjmp bg ;无条件跳转到bgzxh: mov dx,io8255cmov al,0feh ;al=11111110bbb: out dx,al ;将al写入PC口mov cx,0ffffh ;用于延迟一定的时间l1: loop l1rol al,1 ;al循环左移一位push ax ;保存axpush dx ;保存dxmov dl,0ffh ;直接控制台IO,输入,输入的值在al中mov ah,06hint 21hjnz bg ;flag的ZF标志位不为0跳转至bgpop dx ;恢复dx,ax的值pop axjmp bb ;跳转至bbyxh mov dx,io8255cmov al,0feh ;al=11111110bee: out dx,al ;将al写入PC口mov cx,0fffh ;用于延迟一定的时间l2: loop l2ror al,1 ;al循环右移一位push ax ;保存axpush dx ;保存dxmov dl,0ffh ;直接控制台IO,输入,输入的值在al中mov ah,06hint 21hjnz bg ;flag的ZF标志位不为0跳转至bgpop dx ;恢复dx,ax的值pop axjmp ee ;无条件转移至eejgs: mov dx,io8255cmov al,55h ;al=01010101bhh: out dx,al ;将al写入PC口mov cx,0fffh ;设置时延l3: loop l3not al ;对al按位取反push ax ;保存axpush dx ;保存dxmov dl,0ffh ;直接控制台IO,输入,输入的值在al中mov ah,06hint 21hjnz bg1 ;flag的ZF标志位不为0跳转至bg1pop dx ;恢复dx,ax的值pop axjmp hh ;无条件转移至hhbg1: jmp bg ;无条件转移至bgqit: mov ax,4c00h ;交还控制权给DOSint 21hcode endsend start6-7 8255简单控制交通灯实验实验电路图程序流程图实验代码:stack segmentdb 256 dup(?)stack endsdata segmentioport equ 0ff00h-0280hio8255a equ ioport+288h ;PA口io8255b equ ioport+289h ;PB口io8255c equ ioport+28ah ;PC口io8255d equ ioport+28bh ;控制口portc1 db 24h, 44h, 04h, 44h, 04h, 44h, 04h ;6个灯可能的db 81h, 82h, 80h, 82h, 80h, 82h, 80h ;状态数据db 0ffh ;结束标志data endscode segmentassume cs:code, ds:data, ss:stackstart: mov ax, data ;data段装填mov ds, axmov dx, io8255dmov al, 90h ;命令字10010000Bout dx, al ;表示A组方式0,A端口入,B组方式0,B, C端口出mov cx, 3 ;整个过程循环3次p:lea di, portc1re_on: mov al, [di] ;把portc1中数据逐个赋给alinc di ;di=di+1cmp al, 0ffh ;如果读取到结束标志,则跳转到sjz smov dx, io8255con: out dx, al ;向C端口写入数据call relay ;调用时延子程序jmp re_on ;无条件跳转至re_ons: dec cx ;cx=cx-1cmp cx, 0jnz p ;cx不等于0,则跳转至pexit: mov ah, 4ch ;交还控制权int 21hrelay proc nearpush cx ;保存cx的值mov cx, 3300hde1: mov bx, 0ffffhde0: dec bxjnz de0loop de1pop cx ;恢复cx的值retrelay endpcode endsend start附加实验data segmentioport equ 0ff00h-0280hio8255a equ ioport+288h ;PA口io8255b equ ioport+289h ;PB口io8255c equ ioport+28ah ;PC口io8255d equ ioport+28bh ;控制口data endscode segmentassume cs:code, ds:datastart: mov ax, data ;data段装填mov ds, axmov ax, stack ;stack段装填mov ss, axmov dx, io8255dmov al, 10010000b ;命令字A,B,C组方式0,A组入,B,C出out dx, alwait1: mov dx, io8255ain al, dx ;从A口读入数据mov dx, io8255cout dx, al ;将al中的数据写入C口mov ah, 06h ;直接控制台IOmov dl, 0ffh ;输入int 21hjmp wait1 ;跳转到wait1mov ah, 4ch ;交还控制权int 21hcode endsend start6-15 A/D转换实验实验代码:data segmentioport equ 0ff00h-0280hio0809a equ ioport+298hts1 db 'a/d start.', 0dh, 0ah, '$'ts2 db 'a/d end.', 0dh, 0ah, '$'buf dw 300 dup(?)data endsstack segmentsta dw 20 dup(?)top equ length stastack endscode s egmentassume cs:code, ds:data, ss:stackstart: mov ax, data ;data段装填mov ds, axmov ax, stack ;stack段装填mov ss, axmov sp, top ;设置栈顶指针lea dx, ts1mov ah, 9int 21h ;显示提示信息mov cx, 300conv: mov dx, io0809amov al, 0out dx, al ;为io0809a设置初值为0call adint ;调用adint子程序mov ax, si ;si中此时为读入数据,ax=si,al就是读入的一个字节lea di, bufmov [di], al ;将读入的数据送入buf缓冲区and al, 0f0h ;将al与0f0h求与,并将结果重新赋给alpush c x ;保存cx的值mov cl, 4shr al, cl ;逻辑右移4位pop cx ;恢复cx的值add al, 30h ;al=al+30hcmp al, 39hjbe displ ;小于等于39h时跳转到displadd al, 07h ;al=al+07hdispl: mov dl, al ;dl=almov ah, 2 ;显示输出,要输出的值为dl中的值int 21hmov al, [di] ;取出buf中的值,赋给alinc diand al, 0fh ;al的值与0fh按位求与add al, 30h ;al=al+30hcmp al, 39hjbe disph ;小于等于39h跳转到disphadd al, 07h ;大于39h时,al=al+07hdisph: mov dl, al ;dl=almov ah, 2 ;显示dl中的值int 21hmov dl, 20hmov ah, 2int 21hint 21h ;显示两个空格loop conv ;循环至convlea dx, ts2mov ah, 9 ;显示结束信息int 21hadint proc nearpush a xpush b xpush c xmov cx, 0ffffh ;设置时延delay:mov bx, 2fhdelay1: dec bx cmp bx, 0 jnz delay1 loop delay mov dx, io0809a in al, dx ;从io0809a 读入一个字节赋给almov si, ax ;si=ax ,用si 把读入的数据返回出去 pop cx pop bx pop ax ret adint endpcode e nds end start 实验数据:电压/V 0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0输出(十六进制) 0 1AH 35H 4FH 69H 83H 9DH B8H D2H EDH FFH 输出(十进制) 0265379105131157184210237255散点图:误差分析:利用ε++=a bx y 作图分析A/D 转换的线性度,其中y 为转换后的数字量,x 为输入的模拟量,ε是个无穷小量可以忽略。