接口技术实验3报告

上海大学 计算机学院

《计算机接口技术》实验3

专业:计算机科学与技术

班级: 周一1~3节

姓名:

学号:

计算机工程与科学学院

报告日期 2012 年 10 月 27 日

实验名称: 可编程并行接口8255 实验

一、实验目的

了解可编程并行接口芯片8255 的内部结构、工作方式、初始化编程及应用。

(1) 流水灯实验:利用8255 的A 口、B 口循环点亮发光二极管。

(2) 交通灯实验:利用8255 的A 口模拟交通信号灯。

(3) I/O 输入输出实验:利用8255 的A 口读取开关状态,8255 的B 口把状态送发光二极管显示。

二、实验原理

1、8255A 的内部结构:

(1)数据总线缓冲器:这是一个双向三态的8 位数据缓冲器,它是8255A 与微机系统数据总线的接口。输入输的数据、CPU 输出的控制字以及CPU 输入的状态信息都是通过这个缓冲器传送的。

(2)三个端口A,B 和C:A 端口包含一个8 位数据输出锁存器和缓冲器,一个8 位数据输入锁存器。B 端口包含一个8 位数据输入/输出锁存器和缓冲器,一个8 位数据输入缓冲器。C 端口包含一个8 位数据输出锁存器及缓冲器,一个8 位数据输入缓冲器(输入没

有锁存器)。

接口技术实验3报告

(3)A 组和B 组控制电路:根据CPU 输出的控制字来控制8255 工作方式的电路,它们共用一个端口地址相同的控制字寄存器,接收CPU 输出的一字节方式控制字或对C口按位复位命令字。方式控制字的高5 位决定A 组工作方式,低3 位决定B 组的工作方式。对

C 口按位复位命令字可对C 口的每一位实现置位或复位。A 组控制电路控制A 口和C 口上半部,B 组控制电路控制B 口和C 口下半部。

(4)读写控制逻辑:用来控制把CPU 输出的控制字或数据送至相应端口,也由它来控制把状态信息或输入数据通过相应的端口送到CPU。

2、8255A 的工作方式:

方式0—基本输入输出方式;

方式1—选通输入输出方式;

方式2—双向选通输入输出方式。

接口技术实验3报告

接口技术实验3报告

接口技术实验3报告

接口技术实验3报告

三、实验步骤

1、流水灯实验:

(1) 实验连线

该模块的WR、RD 分别连到总线接口模块的IOWR、IORD。该模块的数据( AD0 ~AD7)、地址线(A0~A7)分别连到总线接口模块的数据(LAD0~QD7)、地址线(LA0~LA7)。8255 模块选通线CE 连到总线接口模块的28H。 (系统已接好以上线路。)

请将8255 的PB0~PB7 连到发光二极管的L1~L8。

(2) 查找实验使用的源程序:ShiftLed文件夹;

(3) 编译链接运行可执行程序,观察记录发光二极管情况;

(4) 寻找并修改参数,改变流水灯的点亮频率,记录相关语句。

2、交通灯实验:

(1) 实验连线:

系统已接好数据、地址及控制线路。

请连线8255 的PA0-L1(黄灯)、PA1-L2(绿灯)、PA2-L3(红灯)、PA3-L7(黄灯)、PA4-L8(绿灯)、PA5-L9(红灯)。

(2) 查找实验使用的源程序:Traxffic文件夹;

(3) 编译链接运行可执行程序,观察发光二极变化情况,记录红绿灯的变化时间;

(4) 寻找并修改参数,改变黄灯的闪烁次数为8次及加快闪烁速度,记录相关语句及所在位置。

(5)修改程序,改变交通灯状态跟现实一样。(东西方向:绿灯闪,变黄灯,再变红灯;南北方向:东西方向黄灯时,红黄灯亮,再变绿灯。

接口技术实验3报告

)

3、I/O PA控制PB实验:

(1) 实验连线

系统已接好数据、地址及控制线路。

请连接8255 的PA0~PA7 接开关K0~K7,8255 的PB0~PB7 接发光二极管L1~L8。

(2) 打开源程序建立工程,在Kaiguan文件夹;

(3) 编译并生成可执行程序,运行程序,拨动开关,观察发光二极管与开关的关系;

(4) 查看源程序,尝试改变开关控制方式,记录相关语句。

接口技术实验3报告

四、分析与体会

1、实验结果分析

实验一:修改如下:数字越大越慢,频率为1/900 Hz。

接口技术实验3报告

实验二:修改的部分的代码如下

//***************************************************************************** // /*初始状态全为红灯*/

// SN EW

// XXRGY RGY

//***************************************************************************** void st0()

{

outp8(P8255A,~0x24); //00100100

Sleep(10);

}

/*东西:绿灯闪,变黄灯,再变红灯;南北:东西方向黄灯时,红黄灯亮,再变绿灯。*/

//***************************************************************************** void st1()

{

outp8(P8255A,~0x14); //00001100 ON

Sleep(2000);

}

void st2()

{

for(int i=0;i<4;i++)

{

outp8(P8255A,~0x14); //00001100 ON

Sleep(300);

outp8(P8255A,~0x04); //00000100 off

Sleep(300);

}

}

//***************************************************************************** //***************************************************************************** void st3()

{

outp8(P8255A,~0x0D); //00001100 ON

Sleep(1000);

}

//***************************************************************************** //***************************************************************************** void st4()

{

outp8(P8255A,~0x22); //00100010

Sleep(2000);

}

//***************************************************************************** //***************************************************************************** void st5()

{

for(int i=0;i<5;i++)

{

outp8(P8255A,~0x22); //00001100 on

Sleep(300);

outp8(P8255A,~0x20); //00000100 off

Sleep(300);

}

}

void st6()

{

outp8(P8255A,~0x29); //00100010

Sleep(1000);

}

/****东西方向:绿灯闪,变黄灯,再变红灯;南北方向:东西方向黄灯时,红黄灯亮,再变绿灯。*/

UINT Comd(LPVOID pParam)

{

outp8(P8255MODE,0x80);

st0();

while(ISSTART) {

st1();

st2();

st3();

st4();

st5();

st6();

}

return 0;

}

实验三:代码如下

// KaiguanDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Kaiguan.h"

#include "KaiguanDlg.h"

#include "..\pci9054ioctl.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#define P8255A 0x28

#define P8255B 0x29

#define P8255C 0x2a

#define P8255MODE 0x2b

#define P8255CntW 0x90

CWinThread *Thread_Comd; //要创建的两个线程

HWND hWnd;

BOOL ISSTART=false;

UINT Comd(LPVOID pParam)

{

if(!outp8(hDevice,(ULONG)P8255MODE,(ULONG)P8255CntW)) return 0; while(ISSTART) {

for(int i=0;i<10000;i++)

{

inp8(hDevice,(ULONG)P8255A,prd.Data);

if(!outp8(hDevice,(ULONG)P8255B,prd.Data)) return 0;

}

Sleep(50);

}

return 1;

}

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CKaiguanDlg dialog

CKaiguanDlg::CKaiguanDlg(CWnd* pParent /*=NULL*/)

: CDialog(CKaiguanDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CKaiguanDlg)

// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

CKaiguanDlg::~CKaiguanDlg()

{

ISSTART=FALSE;

Sleep(100);

if(hDevice)

CloseHandle(hDevice);

hDevice=INVALID_HANDLE_VALUE;

}

void CKaiguanDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CKaiguanDlg)

// NOTE: the ClassWizard will add DDX and DDV calls here

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CKaiguanDlg, CDialog)

//{{AFX_MSG_MAP(CKaiguanDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CKaiguanDlg message handlers

BOOL CKaiguanDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); }

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

hDevice=INVALID_HANDLE_VALUE;

hDevice = OpenByName();

if(hDevice==INVALID_HANDLE_VALUE)

{

AfxMessageBox("无法打开Pci卡!");

this->OnCancel();

}

return TRUE; // return TRUE unless you set the focus to a control

}

void CKaiguanDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.

void CKaiguanDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CKaiguanDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CKaiguanDlg::OnOK()

{

// TODO: Add extra validation here

if (!ISSTART) {

ISSTART=true;

Thread_Comd=AfxBeginThread(Comd,NULL,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED); //创建KEYDOWN线程

Thread_Comd->ResumeThread();

}

else

{

ISSTART=false;

}

// CDialog::OnOK();

}

void CKaiguanDlg::OnCancel()

{

// TODO: Add extra cleanup here

// ISSTART=false;

// Sleep(100);

// if(hDevice)

// CloseHandle(hDevice);

CDialog::OnCancel();

}

不成功

2、问题思考

1、交通灯模拟实验中初始状态是怎样的?

初始东西方向,南北方向均亮红灯,然后南北方向转为点亮绿灯,然后南北方向转为黄灯,黄灯闪烁5次,,然后东西方向转为绿灯,南北方向转为红灯,,东西方向转为黄灯,黄灯闪烁5次后,东西方向转为红灯,南北方向转为绿灯,重复以上循环。

2、以上三个实验中8255A的数据端口和控制端口地址是什么?

都是0x28,0x2b

3、三个实验中8255A的控制方式字分别是什么?

0X80H,OX80H,0X90H

3、体会

这次实验还是出了点小状况。第一个实验很快就做好,第二个实验不算成功。虽然程序修改正确,但是连续坏了三个灯,连续接了两次线,还是不行。下次试验我打算和同桌合作。

相关推荐