若干接口实验报告.docx
《若干接口实验报告.docx》由会员分享,可在线阅读,更多相关《若干接口实验报告.docx(36页珍藏版)》请在冰点文库上搜索。
若干接口实验报告
南华大学
计算机科学与技术学院
接口技术实验报告
(2010~2011学年度第二学期)
实验:
接口验证性实验
姓名
曹羽
冯灿斌
黄晓燕
符春燕
高昂
学号
20094440105
20094440115
20094440125
20094440135
20094440145
专业
计算机
班级
0901班
地点
8-210
教师
刘芳菊
实验五七段数码管
七段数码管动态显示
一、实验目的
掌握数码管显示数字的原理
二、实验内容
动态显示:
按图23连接好电路,七段数码管段码连接不变,位码驱动输入端S1,S0接8255C口的PC1,PC0。
编程在两个数码管上显示“56”
三、编程显示
实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
1、实验流程图
2、实验原理图
四、实验代码
datasegment
ioportequ0d400h-0280h
io8255aequioport+28ah
io8255bequioport+28bh
io8255cequioport+288h
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh;段码
buffer1db5,6;存放要显示的个位和十位
bzdw?
;位码
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255b;将8255设为A口输出
moval,80h
outdx,al
movdi,offsetbuffer1;设di为显示缓冲区
loop2:
movbh,02
lll:
movbyteptrbz,bh
pushdi
decdi
adddi,bz
movbl,[di];bl为要显示的数
popdi
moval,0
movdx,io8255a
outdx,al
movbh,0
movsi,offsetled;置led数码表偏移地址为SI
addsi,bx;求出对应的led数码
moval,byteptr[si]
movdx,io8255c;自8255A的口输出
outdx,al
moval,byteptrbz;使相应的数码管亮
movdx,io8255a
outdx,al
movcx,3000
delay:
loopdelay;延时
movbh,byteptrbz
shrbh,1
jnzlll
movdx,0ffh
movah,06
int21h
jeloop2;有键按下则退出
movdx,io8255a
moval,0;关掉数码管显示
outdx,al
movah,4ch;返回
int21h
codeends
endstart
五、实验结果
当没有键按下时,相对应的数码管会发光,有键按下,就退出。
七段数码管静态显示
一、实验目的
掌握数码管显示数字的原理
二、实验内容
静态显示:
按图22连接好电路,将8255的A口PA0~PA6分别与七段数码管的段码驱动输入端a~g相连,位码驱动输入端S1接+5V(选中),S0、dp接地(关闭)。
编程从键盘输入一位十进制数字(0~9),在七段数码管上显示出来。
三、编程提示
实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。
四、实验原理图
实验流程图
五、实验代码
datasegment
ioportequ0d400h-0280h
io8255aequioport+288h
io8255bequioport+28bh
leddb3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
mesg1db0dh,0ah,'Inputanum(0--9h):
',0dh,0ah,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdx,io8255b;使8255的A口为输出方式
movax,80h
outdx,al
sss:
movdx,offsetmesg1;显示提示信息
movah,09h
int21h
movah,01;从键盘接收字符
int21h
cmpal,'0';是否小于0
jlexit;若是则退出
cmpal,'9';是否大于9
jgexit;若是则退出
subal,30h;将所得字符的ASCII码减30H
movbx,offsetled;bx为数码表的起始地址
xlat;求出相应的段码
movdx,io8255a;从8255的A口输出
outdx,al
jmpsss;转SSS
exit:
movah,4ch;返回DOS
int21h
codeends
五、实验结果
当按下0-9的数字键时,在七段数码管上显示出来。
不是数字键就会退出。
实验九中断C
中断方式
一、实验目的
1、了解Windows下中断处理过程
2、比较中断和查询两种数据交换方法的效率差别
二、实验内容
用查询和中断方式分别实现控制指示灯,实验电路如图。
要求直接用手动产生的单脉冲作为中断请求信号,每按一次单脉冲产生一次中断,让指示灯显示一秒钟的0x55,否则让指示灯显示0xAA。
然后在任务栏比较中断和查询方式下CPU利用率的差别。
用中断方法
将8255的A口设为输出,IRQ直接接到正脉冲
3.原理图及流程图
原理图
流程图
4.实验代码
/************************/
/*中断实验(中断方式)*/
/************************/
#include
#include
#include"ApiEx.h"
#pragmacomment(lib,"ApiEx.lib")
inti;
voidMyISR()
{
PortWriteByte(0x288,0x55);
Sleep(1*1000);
printf("%d\n",i++);
}
voidmain()
{
printf("--------------------EXP15_9_INT2---------------------\n");
printf("1.8255(PA0-PA7)===TPC(L0-L7)\n");
printf("2.8255(CS)===TPC(288H-28FH)\n");
printf("3.TPC(IRQ)===TPC(DMC)\n");
printf("Pressanykeytobegin!
\n\n");
getch();
if(!
Startup())/*打开设备*/
{
printf("ERROR:
OpenDeviceError!
\n");
return;
}
printf("PleasePressDMC!
Pressanykeytoexit!
\n");
PortWriteByte(0x28b,0xa0);
RegisterLocalISR(MyISR);/*注册中断程序*/
EnableIntr();/*开中断*/
while(!
kbhit())
{
//PortWriteByte(0x28b,0xa0);
PortWriteByte(0x288,0xaa);
//Sleep(100);
//printf("Main\n");
}
DisableIntr();/*关中断*/
Cleanup();/*关闭设备*/
}
5.实验结果
直接用手动产生的单脉冲作为中断请求信号,每按一次单脉冲产生一次中断,让指示灯显示一秒钟的0x55,否则让指示灯显示0xAA,并延迟2秒。
若有键按下就跳出,否则继续。
查询方式
一、实验目的
1、了解Windows下中断处理过程
2、比较中断和查询两种数据交换方法的效率差别
二、实验内容
用查询和中断方式分别实现控制指示灯,实验电路如图。
要求直接用手动产生的单脉冲作为中断请求信号,每按一次单脉冲产生一次中断,让指示灯显示一秒钟的0x55,否则让指示灯显示0xAA。
然后在任务栏比较中断和查询方式下CPU利用率的差别。
查询方法
将8255的A口设为输出接指示灯,C口设为输入,将PC0接正脉冲输入,线路连接三.原理图及流程图
原理图:
流程图:
4.试验代码
/************************/
/*中断实验(查询方式)*/
/************************/
#include
#include
#include"ApiEx.h"
#pragmacomment(lib,"ApiEx.lib")
voidmain()
{
BYTEdata;
printf("--------------------EXP15_9_INT1---------------------\n");
printf("1.8255(PA0-PA7)===TPC(L0-L7)\n");
printf("2.8255(PC0)===TPC(DMC)\n");
printf("3.8255(CS)===TPC(288H-28FH)\n");
printf("Pressanykeytobegin!
\n\n");
getch();
if(!
Startup())/*打开设备*/
{
printf("ERROR:
OpenDeviceError!
\n");
return;
}
printf("PleasePressDMC!
Pressanykeytoexit!
\n");
PortWriteByte(0x28b,0x8b);/*设8255为方式0,C口输入,A口输出*/
while(!
kbhit())
{
PortReadByte(0x28a,&data);
if(data&0x01)
{
PortWriteByte(0x288,0x55);
Sleep(1*1000);/*延迟*/
}
PortWriteByte(0x288,0xaa);
}
Cleanup();/*关闭设备*/
}
5.实验结果
要求直接用手动产生的单脉冲作为中断请求信号,每按一次单脉冲产生一次中断,让指示灯显示一秒钟的0x55,否则让指示灯显示0xAA并延迟两秒。
若有键按下就继续,否则跳出。
实验十三数字录音机
一、实验目的
1、了解数字录音技术的基本原理。
2、进一步掌握A/D转换器与D/A转换器的使用方法。
二、实验内容
1、按图41连接电路,将声传感器接J2,把代表语音的电信号送给ADC0809通道2(IN2);D/A转换器的输出端通过K8跳线接喇叭。
2、编程,以每秒钟5000次的速率采集IN2输入的语音数据并存入内存,共采集60000个数据(录12秒),然后再以同样的速率将数据送DAC0832使喇叭发声(放音)。
三、实验提示
1、将8253设置成方式0,计数200个,(定时0.2ms),利用PA0查询OUT0电平,若高电平表示定时时间到。
2、ADC0809通道2(IN2)的口地址为298H
四、实验原理图
实验流程图
五、实验代码
datasegment
ioportequ01400h-0280h
luportequioport+29ah;录音口地址
fangportequioport+290h;放音口地址
io8253aequioport+283h
io8253bequioport+280h
io8255cequioport+28bh
io8255dequioport+288h
data_qudb60000dup(?
);录音数据存放数据区
news_1db'Pressanykeytorecord:
',24h;录音提示
news_2db0dh,0ah,'Playing:
',24h;放音提示
dataends
codesegment
assumecs:
code,ds:
data,es:
data
begin:
movax,data;初始化
movds,ax
moves,ax
movdx,offsetnews_1;显示录音提示
movah,9
int21h
test_1:
movah,1;等待键盘输入
int16h
jztest_1;若不是则循环等待
calllu;调用录音子程序
movdx,offsetnews_2;显示放音提示
movah,9
int21h
fy:
callfang;调用放音子程序
movax,0c07h
int21h
cmpal,20h
jzfy
movah,4ch;返回DOS
int21h
luprocnear;录音子程序
movdi,offsetdata_qu;置数据区首地址为DI
movcx,60000;录60000个数据
cld
xunhuan:
movdx,luport;启动A/D
outdx,al
calldelay;延时
inal,dx;从A/D读数据到AL
stosb;存入数据区,使DI加1
loopxunhuan;循环
ret;子程序返回
luendp
fangprocnear;放音子程序
movcx,60000;放60000个数据
movsi,offsetdata_qu;置数据区首地址为SI
cld
fang_yin:
movdx,fangport
lodsb;从数据区取出数据
subal,30h
outdx,al;放音
calldelay;延时
loopfang_yin;循环
ret;子程序返回
fangendp
delayprocnear;延时子程序
pushdx
moval,10h;设8253通道0工作方式0
movdx,io8253a
outdx,al
moval,200;写入计数器初值200
movdx,io8253b
outdx,al
movdx,io8255c;设8255的A口为输入
moval,9bh
outdx,al
movdx,io8255d;从8255的A口输入
delay1:
inal,dx
andal,1;判断PA0是否为1
jzdelay1;若PA0不为1,转de_lay
popdx
ret;子程序返回
delayendp
codeends
endbegin
六、实验结果
第一次按键,显示信息;第二次按键,若为空格键,就一直放音;若不为空格键,就退出。
实验15DMA传送C
(1)DMA1(块模式)
1、实验目的
1、掌握PC机工作环境下进行DMA方式数据传送(BlockMODE和SingleCycleDemandMode)方法。
2、掌握DMA的编程方法。
2、实验内容
1、将主机内存缓冲区偏移量为0的一块数据“ThisisBlockMODEDMAtransfare.”用BlockMODEDMA方式传送到实验箱上的RAM6116上,再将实验箱上6116的内容用BlockMODEDMA方式传送到主机内存缓冲区偏移量为0x400里。
并察看传回来的数据是否一致。
三、实验提示
1、DMA请求是由单脉冲输入到D触发器,由触发器的Q端向DRQ1发出的。
CPU响应后发出,将触发器Q置成低电平以撤消请求。
2、当使用外部请求传送模式进行DMA传输时,9054只进行32位的传送,传送8、16位数据时需要将数据规整为32位后传输
3、因为PCI总线最大宽度为64位,9054芯片为了节省传输资源,当由LOCAL端外部输入数据时,芯片将数据缓存,凑够64位后一次送入PCI端,即微机端。
这会出现进行两次外部DMA请求后9054芯片才将64位数据传送到PCI端,即微机端的情况
4、实验原理图和实验流程图
流程图
5、实验源程序
/************************/
/*DMA传送(块模式)*/
/************************/
#include
#include
#include
#include"ApiEx.h"
#pragmacomment(lib,"ApiEx.lib")
#definemagic"ThisisBlockMODEDMAtransfare."
#definemagic1"*************************************"
#definelenstrlen(magic)
#definelen1strlen(magic1)
voidMyDmaISR()
{
printf("DMAfinished!
\n");
}
voidmain()
{
inti;
BOOLok;
DWORDdwPhy,dwUser,dwSize;
printf("--------------------EXP18_15_DMA_1---------------------\n");
printf("1.DIP-D(DIP40)===6116\n");
printf("2.TPC(DO-D7)===6116(9,10,11,13,14,15,16,17)\n");
printf("3.TPC(A0-A10)===6116(8,7,6,5,4,3,2,1,23,22,19)\n");
printf("4.TPC(MEMR)===6116(20)\n");
printf("5.TPC(MEMW)===6116(21)\n");
printf("6.TPC(GND)===6116(18,12)\n");
printf("7.TPC(+5V)===6116(24)\n");
printf("Pressanykeytobegin!
\n\n");
getch();
printf("---------COMPDisplayData!
--------\n");
if(!
Startup())/*打开设备*/
{
printf("ERROR:
OpenDeviceError!
\n");
return;
}
ok=DmaCommonBufferGet(&dwPhy,&dwUser,&dwSize);
assert(ok);
printf("DmaCommonBufferGet:
phy=%x,local=%x,size=%x\n",dwPhy,dwUser,dwSize);
memcpy((char*)dwUser,magic,len);/*待传送数据写入微机内存*/
memcpy((char*)dwUser+0x400,magic1,len1);/*清理回传内存空间*/
putchar('\n');
DmaChannelOpen(FALSE);/*打开BlockMODEDMA传送*/
RegisterDmaFinishedSR(MyDmaISR);/*注册DMA传送完成中断程序*/
EnableDmaFinishedNotify();
DmaTransferHostToLocal(dwPhy,0,len);/*启动内存向6116的DMA传送*/
Sleep(100);
DmaTransferLocalToHost(0,dwPhy+0x400,len);/*启动6116向内存的DMA传送*/
Sleep(100);
DisableDmaFinishedNotify();
for(i=0;iputchar(((char*)dwUser)[i]);
}
putchar('\n');
for(i=0;iputchar(((char*)dwUser)[i+0x400]);
}
putchar('\n');
DmaChannelClose();/*关闭DMA传送*/
Cleanup();/*关闭设备*/
printf("Pressanykey...");
getch();
}
6、实验结果
将主机内存缓冲区偏移量为0的一块数据“ThisisBlockMODEDMAtransfare.”用BlockMODEDMA方式传送到实验箱上的RAM6116上,再将实验箱上6116的内容用BlockMODEDMA方式传送到主机内存缓冲区偏移量为0x400里。
传回来的数据一致。
(2)DMA2(外部请求模式)
一、实验目的
1、掌握PC机工作环境下进行DMA方式数据传送(BlockMODE和SingleCycleDemandMode)方法。
2、掌握DMA的编程方法。
二、实验内容
将主机内存缓冲区偏移量为0的一块数据“ThisisDMAtranfare.”用SingleCycleDemandModeDMA方式传送到实验箱上的RAM6116上,用户每发出一次DMA请求,PCI板卡上的DMA控制器将公共缓冲区的一个双字传送到实验箱上的6116中。
程序不断读RAM6116的内容,6116映射到主机的IO空间。
三、实验提示
1、DMA请求是由单脉冲输入到D触发器,由触发器的Q端向DRQ1发出的。
CPU响应后发出,将触发