微机原理与接口技术实验指导书Word文档格式.docx
《微机原理与接口技术实验指导书Word文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术实验指导书Word文档格式.docx(31页珍藏版)》请在冰点文库上搜索。
![微机原理与接口技术实验指导书Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/1/172d0bde-e6a8-4e51-96c7-9e012a571a8d/172d0bde-e6a8-4e51-96c7-9e012a571a8d1.gif)
3、掌握8250芯片的编程方法
实验内容和原理或涉及的知识点:
由MAX232完成RS232电平和TTL电平的转换,由8250完成数据的收发。
8250内部有10个寄存器,分别对应着不同的I/O口地址。
对不同的寄存器进行初始化或读出写入操作就可以完成与计算机的通信。
由于不能同时收发数据,所以8250又称为通用串行异步收发器(简写为UART)。
8250实验电路的所有信号在实验箱中均已连好。
实验条件:
1、微机原理与接口技术实验箱;
2、微型计算机;
3、串行通信电缆。
实验设计方案:
1、在实验箱与PC机(上位机)之间实现串行通信。
PC机通过超级终端发送数据,设置波特率为9600,8位数据,一位停止位,无奇偶校验。
本程序负责接受,并回送数据,同时显示在屏幕上,上位机以16进制发送数据,下位机接收并显示,以ASCII码方式显示,然后再发上去。
当送入数据以回车符(0x0d)为结束,主机每下传一个字符,如通讯正确则下位机返回一个同样的字符,如果不正确,则无返回或不相同。
实验过程
1、实验接线:
利用串口电缆连接实验箱的串口和计算机的串口(COM1或COM2);
实验硬件电路如下。
2、编写程序,主要代码如下。
voidCE8250Dlg:
:
Initial8250()
{
UCHARoutput[3];
UCHARinput[3];
ULONGnWritten;
ULONGnRead;
output[0]=1;
output[1]=LCR;
output[2]=0x80;
//设定访问8250除数寄存器
WriteFile(hDevice,&
output,1,&
nWritten,NULL);
output[1]=ADDR1;
output[2]=0x0c;
output[1]=ADDR2;
output[2]=0x00;
//设定除数寄存器为000c,产生9600波特率
output[2]=0x03;
//设定数据格式,8位,无奇偶校验,1位停止位
output[2]=0x0;
//无中断
input[0]=1;
input[1]=LSR;
ReadFile(hDevice,input,1,&
nRead,NULL);
input[1]=ADDR1;
}
OnOK()
//TODO:
Addextravalidationhere
UpdateData(TRUE);
Receive();
Send();
UpdateData(FALSE);
Send()
CStringst;
m_Send=m_Recieve;
char*pSend;
BOOLbResult;
ULONGCount=0;
pSend=m_Recieve.GetBuffer(m_Recieve.GetLength());
while(TRUE)
{
while(TRUE)
{
input[1]=LSR;
bResult=ReadFile(hDevice,&
input,1,&
if((input[2]&
0x20)!
=0x00)
break;
}
output[1]=ADDR1;
output[2]=*pSend;
pSend++;
WriteFile(hDevice,&
if(output[2]==0x0d)
break;
}
m_Recieve.ReleaseBuffer();
Receive()
m_Recieve=_T("
"
);
0x01)!
=0x00)//接受信号有效?
input[1]=ADDR1;
ReadFile(hDevice,&
st=input[2];
m_Recieve+=st;
if(input[2]==0x0d)
}
3、运行。
实验数据和实验结果记录
1、运行超级终端和测试程序。
2、超级中断设置为串行口COM1或COM2,波特率为9600,8位数据,一位停止位,无奇偶校验,无回显。
3、单击测试程序“确定”按钮。
4、在超级终端中输入一串字符,以回车结束。
5、查看测试程序,接收和发送框中出现之前输入的字符串——这是8250接收到的。
6、查看超级终端,出现之前输入的字符串——这是8250发送来的。
实验结果分析
1、分析串行口的特点。
2、分析串行口通信程序的编写方法。
3、分析RS232电平与TTL电平的转换方法。
4、分析8250芯片几个寄存器的用法。
5、写出自己的心得体会。
实验二 并行口实验
并行口实验
1、熟悉并行接口的设计及使用方法;
2、掌握开关数据输入输出的电路设计;
3、掌握8255A芯片的构造和编程原理。
8255A是比较常用的一种并行接口芯片。
它有三个8位的输入输出端口,通常将A端口作为输入用,B端口作为输出用,C端口作为辅助控制用,本实验也是如此。
实验中,8255A工作于基本输入输出方式(方式0)。
8255A的A口作为输入口,与逻辑电平开关相连。
8255A的B口作为输出口,与发光二极管相连。
编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。
2、微型计算机。
CS0CS8255、PA0~PA7K1~K8、PB0~PB7LED1~LED8;
voidCE8255Dlg:
output[1]=0xa6;
output[2]=0x90;
//设8255为A口输入,B口输
SetTimer(1,100,NULL);
BOOLbResult;
DWORDdwError;
UCHAR*input;
output[1]=0xa2;
input=newunsignedchar[3];
input[1]=0xa0;
bResult=ReadFile(hDevice,input,1,&
if(!
bResult)
switch(dwError=GetLastError())
{
caseERROR_HANDLE_EOF:
}
output[2]=input[2];
m_uInputPA=m_uOutputPB=input[2];
OnTimer(UINTnIDEvent)
Addyourmessagehandlercodehereand/orcalldefault
CDialog:
OnTimer(nIDEvent);
OnDestroy()
CloseIfOpen();
KillTimer
(1);
OnDestroy();
1、运行测试程序。
2、拨动开关,观察发光二极管的变化。
当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。
3、观察测试程序显示内容。
1、分析开关量输入数据的电路。
2、分析8255A三个并行接口的特点。
3、写出自己的心得体会。
实验三 中断控制器实验
中断控制器实验
1、掌握8259A的工作原理;
2、掌握单脉冲发生器电路原理;
3、掌握中断信号与CPU通信的方法。
1、实验用到单脉冲发生器电路。
2、涉及的知识点有:
单脉冲发生器电路的原理、8259A中断控制器的初始化方法、中断服务程序的编写方法。
1、用单脉冲发生器作为中断源。
3、按单脉冲键一次就产生一次中断,十次中断后退出。
1、实验接线:
将单脉冲输出端P+和CPU板上的INT连上。
2、单脉冲电路如下。
3、编写程序,主要代码如下。
voidCE8259Dlg:
IntCountdlg;
DWORDError;
CStringstr="
设备打开失败"
;
hDevice=OpenByInterface(&
ClassGuid,0,&
Error);
if(hDevice==INVALID_HANDLE_VALUE)
:
AfxMessageBox(str,MB_OK,0);
dlg.DoModal();
BOOLIntCount:
OnInitDialog()
OnInitDialog();
Addextrainitializationhere
m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
CHARbufOutput[10];
//Outputfromdevice
ULONGnOutput;
//CalldeviceIOControlinterface(PCI9052_IOCTL_MWR)indriver
printf("
IssuingIoctltodevice-"
int_time=0;
if(!
DeviceIoControl(hDevice,
PCI9052_IOCTL_EVENTT,
&
m_hEvent,
sizeof(m_hEvent),
bufOutput,
10,
nOutput,
NULL)
)
printf("
ERROR:
DeviceIoControlreturns%0x."
GetLastError());
returnTRUE;
voidIntCount:
中断结束"
if(WaitForSingleObject(m_hEvent,0)==WAIT_OBJECT_0)
int_time++;
Invalidate();
OnPaint()
CPaintDCpDC(this);
//devicecontextforpainting
CRectrectClient,rect1;
//rect1forpainthevisiblearea;
GetClientRect(rectClient);
CStringINTstring="
CStringtitle[10];
title[0]="
中断次数:
title[1].Format("
%d"
int_time);
pDC.SetBkMode(TRANSPARENT);
pDC.TextOut(rectClient.left+20,rectClient.bottom/2-10,title[0]);
pDC.TextOut(rectClient.left+100,rectClient.bottom/2-10,title[1]);
if(int_time==10)
KillTimer
(1);
MessageBox(INTstring);
1、运行程序,界面如下。
2、单击“确定”按钮,出现下述窗口。
3、按单脉冲键一次就产生一次中断,中断计数后数字增1;
十次中断后退出。
1、分析向量式中断的特点。
2、分析8259A的工作方式。
实验四 DMA实验
DMA实验
1、掌握DMA工作方式的原理。
2、掌握DMA控制器8237A的编程使用方法。
1、本实验实现Memory到Memory的DMA传送过程。
在MM传送方式中,要占用两个通道,通道0是DMA读方式,通道1是DMA写方式。
读写的长度由通道1控制,DMA的启动只能由通道零软件请求启动;
2、对8237ADMAC内部寄存器的初始化编程。
1、用DMA方式将源地址开始若干个字节数据的传送到目的地址单元中。
源地址单元内容初始化为55H,传送结束后目的地址的内容也应是55H。
2、编写程序,完成DMA传输过程。
3、运行程序,并在关键位置设置断点,用以观察内存数据变化情况。
CS7接CS8237;
voidCDMADlg:
Initial8237()
USHORTSourceAddress,DestinationAddress,Count,Value;
sscanf(m_SourceAddress.GetBuffer(m_SourceAddress.GetLength()),
"
%X"
&
SourceAddress);
sscanf(m_DestinationAddress.GetBuffer(m_DestinationAddress.GetLength()),
DestinationAddress);
sscanf(m_Count.GetBuffer(m_Count.GetLength()),"
Count);
sscanf(m_Value.GetBuffer(m_Value.GetLength()),"
Value);
BYTEAddressL,AddressH;
AddressL=LOBYTE(SourceAddress);
AddressH=HIBYTE(SourceAddress);
//向源地址空间添数据
USHORTbufOutput[10000];
CStringst,st1;
USHORTmemory_size=Count+2;
USHORTsize_buf=sizeof(USHORT)*(memory_size);
//Countwrittentodevice
bufOutput[0]=SourceAddress;
//flagewriteorread
bufOutput[1]=Count;
//baseaddress
for(inti=2;
i<
memory_size;
i++)
bufOutput[i]=Value;
PCI9052_IOCTL_MWR16,
size_buf,
NULL,
0,
DeviceIoControlreturns%0x."
//设置8237的工作状态.
UCHARoutput[3];
ULONGnWritten;
output[0]=1;
output[1]=0x1A;
output[2]=0x00;
//发送主清除命令
output[1]=0x00;
output[2]=AddressL;
//通道0基地址寄存器写入源地址值(低8位)
output[2]=AddressH;
//高8位
AddressL=LOBYTE(DestinationAddress);
Ad