上海大学 计算机学院
《计算机接口技术》实验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)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—双向选通输入输出方式。
三、实验步骤
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、I/O PA控制PB实验:
(1) 实验连线
系统已接好数据、地址及控制线路。
请连接8255 的PA0~PA7 接开关K0~K7,8255 的PB0~PB7 接发光二极管L1~L8。
(2) 打开源程序建立工程,在Kaiguan文件夹;
(3) 编译并生成可执行程序,运行程序,拨动开关,观察发光二极管与开关的关系;
(4) 查看源程序,尝试改变开关控制方式,记录相关语句。
四、分析与体会
1、实验结果分析
实验一:修改如下:数字越大越慢,频率为1/900 Hz。
实验二:修改的部分的代码如下
//***************************************************************************** // /*初始状态全为红灯*/
// 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、体会
这次实验还是出了点小状况。第一个实验很快就做好,第二个实验不算成功。虽然程序修改正确,但是连续坏了三个灯,连续接了两次线,还是不行。下次试验我打算和同桌合作。
实验一系统认识实验1实验内容编写实验程序将00H0FH共16个数写入内存3000H开始的连续16个存储单元中2实验源程序SSTAC…
上海大学计算机学院计算机接口技术实验3专业计算机科学与技术班级周一13节姓名学号计算机工程与科学学院报告日期20xx年10月27日…
上海大学计算机学院计算机接口技术实验4专业计算机科学与技术班级周一13节姓名学号计算机工程与科学学院报告日期20xx年10月29日…
微机原理与接口技术实验报告学生姓名学生学号学生班级实验一认识Tddebug集成操作软件一实验内容一实验题目数据传送实验1编程将数据…
南京信息工程大学微机原理与接口技术综合实验实验报告书微机原理与接口技术课程设计报告题目继电器控制实验设计学院电子与信息工程学院专业…
SDU微机原理与接口技术实验报告梁聚仁20xx00120xx0微机原理与接口技术实验报告实验一上机练习实验目的1掌握用编辑软件编辑…
实验一系统认识实验1实验内容编写实验程序将00H0FH共16个数写入内存3000H开始的连续16个存储单元中2实验源程序SSTAC…
实验报告20xx20xx学年第一学期课程名称实验名称计算机接口技术基于中断的字符串动态显示20xx实验时间指导单位指导教师年11月…
微机原理与接口技术课程设计报告交通灯控制系统班级学号姓名成绩20xx年7月1日1目录1课程设计的目的和要求32系统的主要功能作用及…
微机原理与接口技术实验报告安徽工业大学计算机学院姓名专业班级学号指导教师实验一8255A应用数码管动态显示一实验目的1掌握8255…