《东北大学秦皇岛分校微型接口与技术实验报告.doc》由会员分享,可在线阅读,更多相关《东北大学秦皇岛分校微型接口与技术实验报告.doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、优质文本微型计算机接口技术实验报告学 号:213*姓 名:提交日期:2016-4-22成 绩:东北大学秦皇岛分校 计算机与通信工程学院2016优质文本【实验编号】1 【实验名称】实验三 可编程定时器计数器8253【实验内容】1. 可编程定时器计数器8253一实验说明实验原理图:实验流程图:ASM程序:ioportequ 0d400h-0280hio8253aequ ioport+280hio8253bequ ioport+281hio8253cequ ioport+283hcode segmentassume cs:codestart:mov dx,io8253c ;向8253写控制字mov
2、al,36h ;使0通道为工作方式3out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253aout dx,al ;先写入低字节mov al,ahout dx,al ;后写入高字节mov dx,io8253cmov al,76h ;设8253通道1工作方式2out dx,almov ax,1000 ;写入循环计数初值1000mov dx,io8253bout dx,al ;先写低字节 mov al,ahout dx,al ;后写高字节mov ah,4ch ;程序退出int 21h code endsend startCPP程序:/*/* 可编程定时器计数器
3、二 */*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib)void main()printf(-EXP9_3_8253_2-n);printf(1. 8253 (CLK0) = (1MHz) or (2MHz)n);printf(2. TPC (+5V) = 8253 (GATE0,GATE1)n);printf(3. 8253 (OUT0) = 8253 (CLK1)n);printf(4. 8253 (OUT1) = LJB (Ui)n);printf(5. I/O (280-287) = 8253 (CS)n)
4、;printf(Press any key to begin!nn);getch();if(!Startup()/*翻开设备*/printf(ERROR: Open Device Error!n);return; PortWriteByte(0x283,0x36);/*写方式字通道0方式3*/ PortWriteByte(0x280,1000%256);/*送计数初值*/ PortWriteByte(0x280,1000/256); PortWriteByte(0x283,0x76);/*设置计数器1方式字*/ PortWriteByte(0x281,1000%256);/*送计数初值*/ P
5、ortWriteByte(0x281,1000/256);Cleanup();/*关闭设备*/printf(Press any key to exit!);getch();2. 可编程定时器计数器8253二实验说明:实验原理图:实验流程图:ACM程序:ioportequ 0d400h-0280hio8253aequ ioport+283hio8253bequ ioport+280hcode segmentassume cs:codestart: mov al,14h ;设置8253通道0为工作方式2,二进制计数 mov dx,io8253a out dx,al mov dx,io8253b ;
6、送计数初值为0FH mov al,0fh out dx,allll: in al,dx ;读计数初值 call disp ;调显示子程序 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz lll mov ah,4ch ;退出 int 21hdisp proc near ;显示子程序 push dx and al,0fh ;首先取低四位 mov dl,al cmp dl,9 ;判断是否=9 jle num ;假设是那么为0-9,ASCII码加30H add dl,7 ;否那么为A-F,ASCII码加37Hnum: add dl,30h mov ah
7、,02h ;显示 int 21h mov dl,0dh ;加回车符 int 21h mov dl,0ah ;加换行符 int 21h pop dx ret ;子程序返回 disp endp code endsend startCPP程序:/*/* 可编程定时器计数器一 */*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib)void main()BYTEdata;if(!Startup()/*翻开设备*/printf(ERROR: Open Device Error!n);return;PortWriteByte(0x
8、283,0x10);/*设8253计数器0工作方式0,只写低字节*/ PortWriteByte(0x280,0x20);/*写入计数初值32*/ while(!kbhit()/*有键按下那么退出*/PortReadByte(0x280,&data); printf(%dn,data);/*打印计数器值*/Cleanup();/*关闭设备*/【实验编号】2 【实验名称】实验五 七段数码管【实验内容】1.七段数码管静态显示实验说明:实验原理图:实验流程图:ACM程序:data segmentioportequ 0d400h-0280hio8255aequ ioport+288hio8255beq
9、u ioport+28bhled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fhmesg1 db 0dh,0ah,Input a num (0-9h):,0dh,0ah,$data endscode segmentassume cs:code,ds:datastart: mov ax,datamov ds,axmov dx,io8255b ;使8255的A口为输出方式mov ax,80hout dx,alsss: mov dx,offset mesg1 ;显示提示信息mov ah,09hint 21hmov ah,01 ;从键盘接收字符int 21hcmp
10、 al,0 ;是否小于0jl exit ;假设是那么退出cmp al,9 ;是否大于9jg exit ;假设是那么退出sub al,30h ;将所得字符的ASCII码减30Hmov bx,offset led ;bx为数码表的起始地址xlat ;求出相应的段码mov dx,io8255a ;从8255的A口输出out dx,aljmp sss ;转SSSexit: mov ah,4ch ;返回DOSint 21hcode endsCPP程序:/*/* 七段数码管一 */*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib
11、)char led10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/*上面为从0-9对应的段码表*/void main()intout;if(!Startup()/*翻开设备*/printf(ERROR: Open Device Error!n);return; PortWriteByte (0x28b,0x80);/*设8255A口C口输出*/ printf(nInput a number (0-9),other key to exit!:n);/*显示提示*/ while(true)out = getch();if(out0x39)
12、 break;printf(%cn,out);PortWriteByte(0x288,ledout-48); Cleanup();/*关闭设备*/2.七段数码管动态显示实验说明:实验原理图:实验流程图:ACM程序:data segmentioportequ 0d400h-0280hio8255aequ ioport+28ahio8255bequ ioport+28bhio8255cequ ioport+288hled db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码buffer1 db 5,6 ;存放要显示的个位和十位bz dw ? ;位码data
13、endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dx,io8255b ;将8255设为A口输出mov al,80hout dx,almov di,offset buffer1 ;设di为显示缓冲区loop2:mov bh,02lll: mov byte ptr bz,bhpush didec diadd di, bzmov bl,di ;bl为要显示的数pop di mov al,0 mov dx,io8255a out dx,almov bh,0mov si,offset led ;置led数码表偏移地址
14、为SIadd si,bx ;求出对应的led数码mov al,byte ptr simov dx,io8255c ;自8255A的口输出out dx,almov al,byte ptr bz ;使相应的数码管亮mov dx,io8255aout dx,almov cx,3000delay:loop delay ;延时mov bh,byte ptr bzshr bh,1jnz lllmov dx,0ffhmov ah,06int 21hje loop2 ;有键按下那么退出mov dx,io8255amov al,0 ;关掉数码管显示out dx,almov ah,4ch ;返回int 21hco
15、de endsend startCPP程序:/*/* 七段数码管二 */*/#include#include#include ApiEx.h#pragma comment(lib,ApiEx.lib)void main()printf(-EXP11_5_LED_2-n);printf(1. 8255 (PA0-PA6) = LED (a-g)n);printf(2. 8255 (PC0-PC1) = LED (S0-S1)n);printf(3. I/O (288-28F) = 8255 (CS)n);printf(4. TPC (GND) = LED (dp)n);printf(Press
16、any key to begin!nn);getch();if(!Startup()/*翻开设备*/printf(ERROR: Open Device Error!n);return;printf(Please enter any key return!);doPortWriteByte(0x28b,0x82);/*设置8255的A口C口均为输出*/PortWriteByte(0x288,0x6d);PortWriteByte(0x28a,0x02);/*显示十位5*/Sleep(1000);PortWriteByte(0x288,0x7d);PortWriteByte(0x28a,0x01)
17、;/*显示个位6*/Sleep(1000);while(!kbhit();PortWriteByte(0x28a,0x00);Cleanup();/*关闭设备*/【实验编号】3 【实验名称】实验八 交通灯控制实验【实验内容】实验说明一. 实验目的 通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。二.实验内容如图-29,L7、L6、L5作为南北路口的交通灯与PC7、PC6、PC5相连,L2、L1、L0作为东西路口的交通灯与PC2、PC1、PC0相连。编程使六个灯按交通灯变化规律亮灭。三.编程提示: 十字路口交通灯的变化规律要求:1 南北路口的绿灯、东西路口的红灯同时亮
18、30秒左右。2 南北路口的黄灯闪烁假设干次,同时东西路口的红灯继续亮。3 南北路口的红灯、东西路口的绿灯同时亮30秒左右。4 南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁假设干次。5 转1重复。实验原理实验流程图Asm程序:;*;* 十字路口红绿灯模拟演示程序 *;* 端口各灯的设置: *;* 1红 1黄 1绿 0 0 2红 2黄 2绿 *;*; io8255aequ 28ah-0280h io8255bequ 28bh-0280h io_port_addreequ 0cf8h;32位配置地址端口 io_port_dataequ 0cfch;32位配置数据端口 io_plx_idequ 05
19、40610b5h;TPC卡设备及厂商IDdata segment portc1 db 24h,44h,04h,44h,04h,44h,04h ;六个灯可能db 81h,82h,80h,82h,80h,82h,80h ;的状态数据db 0ffh ;结束标志 io_9054base_address db 4 DUP(0);TPC卡9054芯片I/O基地址暂存空间 io_base_address db 4 DUP(0);TPC卡I/O基地址暂存空间 memory_base_address db 4 DUP(0);TPC卡MEMORY基地址暂存空间 interrupt_line db 2 DUP(0)
20、;TPC卡中断号暂存空间 pcicardnotfind db 0dh,0ah,TPC pci card not find or address/interrupt error !,0dh,0ah,$ io9054baseaddress db 0dh,0ah,TPC pci card 9054 Chip I/O Base Address : ,$ iobaseaddressdb 0dh,0ah,TPC pci card I/O Base Address : ,$ memorybaseaddressdb 0dh,0ah,TPC pci card Memory Base Address : ,$ i
21、ntnumberdb 0dh,0ah,TPC pci card Interrupt Line : ,$ enter_returndb 0dh,0ah,$data endsstacks segment db 100 dup(?)stacks endscode segment assume cs:code,ds:data,SS:STACKS,es:data.386;386模式编译start:mov ax,datamov ds,axmov es,axmov ax,stacksmov ss,axcall findtpc1;查找TPC卡资源并显示mov dx,word ptr io_base_addre
22、ssadd dx,io8255bmov al,90hout dx,al ;设置8255为C口输出mov dx,word ptr io_base_addressadd dx,io8255are_on:mov bx,0on:mov al,portc1bxcmp al,0ffhjz re_onout dx,al ;点亮相应的灯inc bxmov cx,5000 ;参数赋初值test al,21h ;是否有绿灯亮jz de1 ;没有,短延时mov cx,45000 ;有,长延时de1:mov di,65000 ;di赋初值9000de0:dec di ;减1计数jnz de0 ;di不为0loop d
23、e1push dxmov ah,06hmov dl,0ffhint 21hpop dxjz on ;没有,转到onexit:mov ah,4ch ;返回DOSint 21hfindtpc1 proc near;查找TPC卡资源并显示pushadpushfdmov ebx,080000000hfindtpc1_next:add ebx,100hcmp ebx,081000000hjnz findtpc1_continuemov dx,offset pcicardnotfind;显示未找到tpc卡提示信息mov ah,09hint 21hmov ah,4chint 21h;退出findtpc1_c
24、ontinue:mov dx,io_port_addremov eax,ebxout dx,eax;写地址口mov dx,io_port_datain eax,dx;读数据口cmp eax,io_plx_idjnz findtpc1_next;检查是否发现tpc卡mov dx,io_port_addremov eax,ebx add eax,14hout dx,eax;写地址口mov dx,io_port_datain eax,dx;读数据口mov dword ptr io_9054base_address,eaxand eax,1jz findtpc1_next;检查是否为i/o基址信息 m
25、ov eax,dword ptr io_9054base_addressand eax,0fffffffeh mov dword ptr io_9054base_address,eax ;去除i/o指示位并保存mov dx,io_port_addremov eax,ebxadd eax,18hout dx,eax;写地址口mov dx,io_port_datain eax,dx;读数据口mov dword ptr io_base_address,eaxand eax,1jz findtpc1_next;检查是否为i/o基址信息mov eax,dword ptr io_base_addressa
26、nd eax,0fffffffehmov dword ptr io_base_address,eax;去除i/o指示位并保存mov dx,io_port_addremov eax,ebxadd eax,1chout dx,eax;写地址口mov dx,io_port_datain eax,dx;读数据口mov dword ptr memory_base_address,eaxand eax,1hjnz findtpc1_next;检查是否为memory基址信息mov eax,dword ptr memory_base_addressand eax,0fffffff0hmov dword ptr
27、 memory_base_address,eax;去除memory指示位并保存mov dx,io_port_addremov eax,ebxadd eax,3chout dx,eax;写地址口mov dx,io_port_datain eax,dx;读数据口and eax,0ffhmov word ptr interrupt_line,ax;去除interrupt其它指示位并保存 mov dx,offset io9054baseaddress;显示i/o提示信息mov ah,09hint 21h mov ax,word ptr io_9054base_addresscall findtpc1_
28、disp;显示i/o基地址mov dx,offset iobaseaddress;显示i/o提示信息mov ah,09hint 21hmov ax,word ptr io_base_addresscall findtpc1_disp;显示i/o基地址mov dx,offset memorybaseaddress;显示memory提示信息mov ah,09hint 21hmov ax,word ptr memory_base_address+2call findtpc1_disp;显示memory基地址高16位mov ax,word ptr memory_base_addressshr ax,1
29、6call findtpc1_disp;显示memory基地址低16位mov dx,offset intnumber;显示interrupt提示信息mov ah,09hint 21hmov ax,word ptr interrupt_linecall findtpc1_disp;显示interrupt号mov dx,offset enter_return;加回车符,换行符mov ah,09hint 21hpopfdpopadretfindtpc1 endpfindtpc1_disp proc near;显示子程序push dxpush cxpush bxmov cx,4mov bx,16findtpc1_disp_loop1:push axpush cxsub bx,4mov cx,bxshr ax,cland al,0fh;首先取低四位mov dl,alcmp dl,9;判断是否9jle ddd ;假设不大于那么为0-9,加30h为其ASCII码add dl,7 ;否那么为A-F,再加7ddd: add dl,30h ;显示mov ah,02int 21hretdisp endpcode endsend start