1、3、掌握8250芯片的编程方法实验内容和原理或涉及的知识点:由MAX232完成RS232电平和TTL电平的转换,由8250完成数据的收发。8250内部有10个寄存器,分别对应着不同的I/O口地址。对不同的寄存器进行初始化或读出写入操作就可以完成与计算机的通信。由于不能同时收发数据,所以8250又称为通用串行异步收发器(简写为UART)。8250实验电路的所有信号在实验箱中均已连好。实验条件:1、微机原理与接口技术实验箱;2、微型计算机;3、串行通信电缆。实验设计方案:1、在实验箱与PC机(上位机)之间实现串行通信。PC机通过超级终端发送数据,设置波特率为9600,8位数据,一位停止位,无奇偶校
2、验。本程序负责接受,并回送数据,同时显示在屏幕上,上位机以16进制发送数据,下位机接收并显示,以ASCII码方式显示,然后再发上去。当送入数据以回车符(0x0d)为结束,主机每下传一个字符,如通讯正确则下位机返回一个同样的字符,如果不正确,则无返回或不相同。实验过程1、实验接线:利用串口电缆连接实验箱的串口和计算机的串口(COM1或COM2);实验硬件电路如下。2、编写程序,主要代码如下。void CE8250Dlg:Initial8250() UCHAR output3; UCHAR input3; ULONG nWritten; ULONG nRead; output0 = 1; outp
3、ut1 = LCR; output2 = 0x80; /设定访问8250除数寄存器 WriteFile(hDevice, &output, 1, &nWritten, NULL); output1 = ADDR1; output2 = 0x0c; output1 = ADDR2; output2 = 0x00; /设定除数寄存器为000c,产生9600波特率 output2 = 0x03; /设定数据格式,8位,无奇偶校验,1位停止位 output2 = 0x0; /无中断 input0 = 1; input1 = LSR; ReadFile(hDevice, input, 1, &nRead
4、, NULL); input1 = ADDR1;OnOK() / TODO: Add extra validation here UpdateData(TRUE); Receive(); Send(); UpdateData(FALSE);Send() CString st; m_Send = m_Recieve; char * pSend; BOOL bResult; ULONG Count=0; pSend = m_Recieve.GetBuffer(m_Recieve.GetLength(); while(TRUE) while(TRUE) input1 = LSR; bResult=R
5、eadFile(hDevice, &input, 1, & if(input2&0x20)!=0x00) break; output1 = ADDR1; output2 = *pSend; pSend+; WriteFile(hDevice, & if(output2=0x0d) break; m_Recieve.ReleaseBuffer();Receive() m_Recieve=_T();0x01)!=0x00) /接受信号有效? input1 = ADDR1; ReadFile(hDevice, & st=input2; m_Recieve +=st; if(input2=0x0d)
6、3、运行。实验数据和实验结果记录1、 运行超级终端和测试程序。2、 超级中断设置为串行口COM1或COM2,波特率为9600,8位数据,一位停止位,无奇偶校验,无回显。3、 单击测试程序“确定”按钮。4、 在超级终端中输入一串字符,以回车结束。5、 查看测试程序,接收和发送框中出现之前输入的字符串这是8250接收到的。6、 查看超级终端,出现之前输入的字符串这是8250发送来的。实验结果分析1、分析串行口的特点。2、分析串行口通信程序的编写方法。3、分析RS232电平与TTL电平的转换方法。4、分析8250芯片几个寄存器的用法。5、写出自己的心得体会。实验二并行口实验并行口实验1、熟悉并行接口
7、的设计及使用方法;2、掌握开关数据输入输出的电路设计;3、掌握8255A芯片的构造和编程原理。8255A是比较常用的一种并行接口芯片。它有三个8位的输入输出端口,通常将A端口作为输入用,B端口作为输出用,C端口作为辅助控制用,本实验也是如此。实验中,8255A工作于基本输入输出方式(方式0)。8255A的A口作为输入口,与逻辑电平开关相连。8255A的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。2、微型计算机。CS0 CS8255、PA0PA7 K1K8、PB0PB7 LED1LED8;void CE8255Dlg: output1 = 0xa6;
8、 output2 = 0x90; /设8255为A口输入,B口输 SetTimer(1,100,NULL); BOOL bResult ; DWORD dwError; UCHAR *input; output1 = 0xa2; input = new unsigned char3; input1 = 0xa0; bResult=ReadFile(hDevice, input, 1, & if(!bResult) switch (dwError = GetLastError() case ERROR_HANDLE_EOF: output2=input2; m_uInputPA=m_uOutpu
9、tPB=input2;OnTimer(UINT nIDEvent) Add your message handler code here and/or call default CDialog:OnTimer(nIDEvent);OnDestroy() CloseIfOpen(); KillTimer(1);OnDestroy();1、运行测试程序。2、拨动开关,观察发光二极管的变化。当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。3、观察测试程序显示内容。1、分析开关量输入数据的电路。2、分析8255A三个并行接口的特点。3、写出自己的心得体会。实验三中断控制器实验中断控制器实验1、
10、掌握8259A的工作原理;2、掌握单脉冲发生器电路原理;3、掌握中断信号与CPU通信的方法。1、实验用到单脉冲发生器电路。2、涉及的知识点有:单脉冲发生器电路的原理、8259A中断控制器的初始化方法、中断服务程序的编写方法。1、用单脉冲发生器作为中断源。3、按单脉冲键一次就产生一次中断,十次中断后退出。1、 实验接线:将单脉冲输出端P+和CPU板上的INT连上。2、 单脉冲电路如下。3、编写程序,主要代码如下。void CE8259Dlg: IntCount dlg; DWORD Error; CString str=设备打开失败; hDevice = OpenByInterface( &Cl
11、assGuid, 0, &Error); if (hDevice = INVALID_HANDLE_VALUE) :AfxMessageBox(str, MB_OK, 0); dlg.DoModal();BOOL IntCount:OnInitDialog() OnInitDialog(); Add extra initialization here m_hEvent=CreateEvent(NULL,FALSE,FALSE,NULL); CHAR bufOutput10;/ Output from device ULONG nOutput; / Call device IO Control
12、interface (PCI9052_IOCTL_MWR) in driver printf(Issuing Ioctl to device - int_time=0; if (!DeviceIoControl(hDevice, PCI9052_IOCTL_EVENTT, &m_hEvent, sizeof(m_hEvent), bufOutput, 10,nOutput, NULL) ) printf(ERROR:DeviceIoControl returns %0x., GetLastError(); return TRUE;void IntCount:中断结束 if( WaitForSi
13、ngleObject(m_hEvent,0)=WAIT_OBJECT_0 ) int_time+; Invalidate();OnPaint() CPaintDC pDC(this); / device context for painting CRect rectClient,rect1; /rect1 for pain the visible area; GetClientRect(rectClient); CString INTstring= CString title10; title0=中断次数: title1.Format(%d,int_time); pDC.SetBkMode(T
14、RANSPARENT); pDC.TextOut(rectClient.left+20,rectClient.bottom/2-10,title0); pDC.TextOut(rectClient.left+100,rectClient.bottom/2-10,title1); if(int_time=10) KillTimer(1); MessageBox(INTstring);1、 运行程序,界面如下。2、 单击“确定”按钮,出现下述窗口。3、按单脉冲键一次就产生一次中断,中断计数后数字增1;十次中断后退出。1、分析向量式中断的特点。2、分析8259A的工作方式。实验四DMA实验DMA实验
15、1、掌握DMA工作方式的原理。2、掌握DMA控制器8237A的编程使用方法。1、本实验实现Memory到Memory的DMA传送过程。在MM传送方式中,要占用两个通道,通道0是DMA读方式,通道1是DMA写方式。读写的长度由通道1控制,DMA的启动只能由通道零软件请求启动;2、对8237A DMAC内部寄存器的初始化编程。1、用DMA方式将源地址开始若干个字节数据的传送到目的地址单元中。源地址单元内容初始化为55H,传送结束后目的地址的内容也应是55H。2、编写程序,完成DMA传输过程。3、运行程序,并在关键位置设置断点,用以观察内存数据变化情况。CS7接CS8237; void CDMADl
16、g:Initial8237() USHORT SourceAddress,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); ssca
17、nf(m_Value.GetBuffer(m_Value.GetLength(),Value); BYTE AddressL,AddressH; AddressL = LOBYTE(SourceAddress); AddressH = HIBYTE(SourceAddress);/向源地址空间添数据 USHORT bufOutput10000; CString st,st1; USHORT memory_size = Count+2; USHORT size_buf = sizeof(USHORT)*(memory_size); / Count written to device bufOut
18、put0 = SourceAddress; /flage write or read bufOutput1 = Count; /base address for(int i=2;imemory_size;i+) bufOutputi=Value; PCI9052_IOCTL_MWR16, size_buf, NULL, 0, DeviceIoControl returns %0x./设置8237的工作状态. UCHAR output3; ULONG nWritten; output0 = 1; output1 = 0x1A; output2 = 0x00; /发送主清除命令 output1 = 0x00; output2 = AddressL; /通道0基地址寄存器写入源地址值(低8位) output2 = AddressH; /高8位 AddressL = LOBYTE(DestinationAddress); Ad
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2