系统综合实验报告hu.docx

上传人:b****6 文档编号:4953000 上传时间:2022-12-12 格式:DOCX 页数:28 大小:308.50KB
下载 相关 举报
系统综合实验报告hu.docx_第1页
第1页 / 共28页
系统综合实验报告hu.docx_第2页
第2页 / 共28页
系统综合实验报告hu.docx_第3页
第3页 / 共28页
系统综合实验报告hu.docx_第4页
第4页 / 共28页
系统综合实验报告hu.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

系统综合实验报告hu.docx

《系统综合实验报告hu.docx》由会员分享,可在线阅读,更多相关《系统综合实验报告hu.docx(28页珍藏版)》请在冰豆网上搜索。

系统综合实验报告hu.docx

系统综合实验报告hu

 

系统综合课程设计

 

题目:

交通灯控制系统

 

院(系、部):

信息工程学院

姓名:

王硕(070480)

胡学智(070288)

李润龙(070779)

班级:

计073

指导教师签名:

 

2011年1月17日·北京

实验一I/O地址译码

一、实验目的

掌握I/O地址译码电路的工作原理。

二、实验原理和内容

实验电路如图11所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。

译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:

280H~287H,Y1:

288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。

例如:

执行下面两条指令

MOVDX,2A0H

OUTDX,AL(或INAL,DX)

Y4输出一个负脉冲,执行下面两条指令

MOVDX,2A8H

OUTDX,AL(或INAL,DX)

Y5输出一个负脉冲。

图11

利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。

三、编程提示

1、实验电路中D触发器CLK端输入脉冲时,上升沿使Q端输出高电平L7发光,RD端加低电平L7灭。

2、由于TPC卡使用PCI总线,所以分配的IO地址每台微机可能都不同,编程时需要了解当前的微机使用那段IO地址并进行设置,获取方法请参看汇编程序使用方法的介绍。

四、实验程序

#include

#include

#include"ApiEx.h"

#pragmacomment(lib,"ApiEx.lib")

voidmain()

{

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

printf("Pressanykeytoexit!

");

while(!

kbhit())/*判断是否有键按下*/

{

PortWriteByte(0x2A0,0x10);/*或PortReadByte(0x2A0,&data)*/

Sleep(1000);/*延迟一秒钟*/

PortWriteByte(0x2A8,0x10);/*或PortReadByte(0x2A8,&data)*/

Sleep(1000);/*延迟一秒钟*/

}

Cleanup();/*关闭设备*/

}

五、实验结果:

按任意键后L7灯每1秒闪烁一次

 

实验二可编程并行接口

(一)(8255方式0)

一、实验目的

掌握8255方式0的工作原理及使用方法。

二、实验内容

1.实验电路如图20,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。

2.编程从8255C口输入数据,再从A口输出.

图20

三、编程提示

1、8255控制寄存器端口地址28BH

A口的地址288H

C口的地址28AH

2、参考流程图:

四、试验程序

/************************/

/*可编程并行接口

(一)*/

/************************/

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

voidmain()

{

printf("Pressanykeytobegin!

\n\n");

getch();

printf("Pressanykeytoexit!

\n");

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

PortWriteByte(0x28B,0x89);

BYTEdata;

while(!

kbhit())/*判断是否有键按下*/

{

PortReadByte(0x28A,&data);

Sleep(1000);

PortWriteByte(0x288,data);

Sleep(1000);

}

Cleanup();/*关闭设备*/

}

五、实验结果:

八个开关拨到上方时对应的L0~L7灯亮起,拨到下方时对应的灯熄灭。

实验三可编程定时器/计数器

一、实验目的

掌握8253的基本工作原理和编程方法。

二、实验内容

1.按图16虚线连接电路,将计数器0设置为方式0,计数器初值为N(N≤0FH),用手动逐个输入单脉冲,编程使计数值在屏幕上显示,并同时用逻辑笔观察OUT0电平变化(当输入N+1个脉冲后OUT0变高电平)。

图16

2.按图17连接电路,将计数器0、计数器1分别设置为方式3,计数初值设为1000,用逻辑笔观察OUT1输出电平的变化(频率1HZ)。

图17

三、编程提示

1、8253控制寄存器地址283H

计数器0地址280H

计数器1地址281H

CLK0连接时钟1MHZ

2、参考流程图(见图18、19):

图18图19

四、试验程序

试验程序1

/********************************/

/*可编程定时器/计数器

(一)*/

/********************************/

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

voidmain()

{

intd;

printf("Pressanykeytobegin!

\n\n");

getch();

printf("Pressanykeytoexit!

\n");

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

PortWriteByte(0x283,0x10);

printf("Pressiinputdata!

\n");

scanf("%d",&d);

PortWriteByte(0x280,d);

Sleep(1000);

BYTEdata;

BYTEd1;

PortReadByte(0x280,&data);

while(!

kbhit())/*判断是否有键按下*/

{

PortReadByte(0x280,&data);/*或PortReadByte(0x2A0,&data)*/

//Sleep(1000);/*延迟一秒钟*/

if(data!

=d1)

{

d1=data;

printf("%d\n",data);

if(data==0)

{

PortWriteByte(0x280,d);

//Sleep(1000);

continue;

}

}/*或PortReadByte(0x2A8,&data)*/

/*延迟一秒钟*/

}

Cleanup();/*关闭设备*/

}

实验程序2:

/******************************/

/*可编程定时器/计数器

(二)*/

/******************************/

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

voidmain()

{

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

PortWriteByte(0x283,0x36);/*写方式字通道0方式3*/

PortWriteByte(0x280,1000%256);/*送计数初值*/

PortWriteByte(0x280,1000/256);

PortWriteByte(0x283,0x76);/*设置计数器1方式字*/

PortWriteByte(0x281,1000%256);/*送计数初值*/

PortWriteByte(0x281,1000/256);

Cleanup();/*关闭设备*/

printf("Pressanykeytoexit!

");

}五、实验结果

程序1:

程序开始时设定初值,每按一次单脉冲数值-1

程序2:

插入逻辑笔后,到底红绿灯交替亮灭,周期为1秒。

实验四串行通讯实验

一、实验目的

1、了解串行通讯的基本原理。

2、掌握串行接口芯片8251的工作原理和编程方法。

二、实验内容

1、按图18连接好电路,(8251插通用插座)其中8253计数器用于产生8251的发送和接收时钟.TXD和RXD连在一起。

2、编程:

从键盘输入一个字符,将其ASCII码加1后发送出去,再接收回来在屏幕上显示。

实现自发自收。

图18串行通讯电路

三、实验提示

1、图示电路8251的控制口地址为2B9H,数据口地址为2B8H。

2、8253计数器的计数初值=时钟频率/(波特率×波特率因子),这里的时钟频率接1MHz,波特率若选1200,波特率因子若选16,则计数器初值为52。

3、收发采用查询方式。

四、参考流程图(见图20)

图20

五、试验程序

/******************/

/*8251串行通信*/

/******************/

include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

voidmain()

{

inti;

BYTEdata;

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

PortWriteByte(0x283,0x16);/*设8253计数器0工作方式*/

Sleep(1*100);/*延时*/

PortWriteByte(0x280,52);/*给8253通道0送初值*/

Sleep(1*100);/*延时*/

for(i=0;i<3;i++)

{

PortWriteByte(0x2b9,0);/*初始化8251,向8251控制端口送3个0*/

Sleep(1*100);/*延时*/

}

PortWriteByte(0x2b9,0x40);/*复位8251*/

Sleep(1*100);/*延时*/

PortWriteByte(0x2b9,0x4e);/*1个停止位,8个数据位,波特率因子为16*/

Sleep(1*100);/*延时*/

PortWriteByte(0x2b9,0x27);/*向8251送控制字允许其接收和发送*/

Sleep(1*100);/*延时*/

printf("YoucanPressakeytostart:

\n");/*提示*/

printf("ESCisexit!

\n");/*提示*/

for(;;)

{

do{

PortReadByte(0x2b9,&data);

}while(!

(data&0x01));/*发送未准备好则继续接收*/

data=getch();

if(data==0x1b)exit(0);/*若有ESC键按下则返回*/

putchar(data);

PortWriteByte(0x2b8,data+1);/*发送*/

Sleep(1*100);/*延时*/

do{

PortReadByte(0x2b9,&data);

}while(!

(data&0x02));/*接收没准备好则等待*/

PortReadByte(0x2b8,&data);

printf("%c",data);/*准备好则将接收后的字符显示*/

}

Cleanup();/*关闭设备*/

}

六、实验结果

输入字符cer后出现字符dfs

实验五中断

一、实验目的

1、掌握PC机中断处理系统的基本原理。

2、学会编写中断服务程序。

二、实验原理与内容

1、实验原理

PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。

中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。

IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:

中断源中断类型号中断功能

IRQ008H时钟

IRQ109H键盘

IRQ20AH保留

IRQ3OBH串行口2

IRQ40CH串行口1

IRQ50DH硬盘

IRQ60EH软盘

IRQ70FH并行打印机

8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。

对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级连,对外可以提供16个中断源:

中断源中断类型号中断功能

IRQ8070H实时时钟

IRQ9071H用户中断

IRQ10072H保留

IRQ11O73H保留

IRQ12074H保留

IRQ13075H协处理器

IRQ14076H硬盘

IRQ15077H保留

PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。

图21中断电路

2、实验内容

实验电路如图31,直接用手动产单脉冲作为中断请求信号(只需连接一根导线)。

要求每按一次开关产生一次中断,在屏幕上显示一次“TPCpcicardInterrupt”,中断10次后程序退出。

三、编程提示

1.由于9054的驱动程序影响直写9054芯片的控制寄存器,中断实验需要在纯DOS的环境中才能正常运行。

这里指的纯DOS环境是指微机启动时按F8键进入的DOS环境。

WINDOWS重启进入MSDOS方式由于系统资源被重新规划过,所以也不能正常实验。

2.由于TPC卡使用PCI总线,所以分配的中断号每台微机可能都不同,编程时需要了解当前的微机使用那个中断号并进行设置,获取方法请参看汇编程序使用方法的介绍。

(也可使用自动获取资源分配的程序取得中断号)

3.在纯DOS环境下,有些微机的BIOS设置中有将资源保留给ISA总线使用的选项,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就无法做实验,这时需要将此选项修改为使用即插即用。

4.在纯DOS环境下,有些微机的BIOS设置中有使用即插即用操作系统的选项,如果在使用即插即用操作系统状态下,BIOS将不会给TPC卡分配系统资源,致使在纯DOS环境(WINDOWS环境下不会出现此问题)下PCI总线无法获得系统资源,也就无法做实验,这时需要将此选项修改为不使用即插即用操作系统。

5.由于TPC卡使用9054芯片连接微机,所以在编程使用微机中断前需要使能9054的中断功能,代码如下:

movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,使能中断

inax,dx

orax,0900h

outdx,ax

其中IOPORT_CENT是9054芯片寄存器组的I/O起始地址,每台微机可能都不同,编程时需要了解当前的微机使用哪段并进行设置,获取方法请参看本书结尾部分的介绍。

(也可使用自动获取资源分配的程序取得),+68H的偏移是关于中断使能的寄存器地址,设置含义如下:

设置INTCSR(68H)寄存器,中断模式设置

BITS

功能

8

1:

能够产生PCI中断

0:

禁止产生PCI中断

11

1:

能够LOCAL端输入的中断送到PCI端

0:

禁止LOCAL端输入的中断送到PCI端

其它位为零即可,更多内容参看9054芯片数据手册

程序退出前还要关闭9054的中断,代码如下:

movdx,ioport_cent+68h;设置tpc卡中9054芯片io口,关闭中断

inax,dx

andax,0f7ffh

outdx,ax

6.PC机中断控制器8259的地址为20H、21H,编程时要根据中断类型号设置中断矢量,8259中断屏蔽寄存器IMR对应位要清零(允许中断),中断服务结束返回前要使用中断结束命令:

MOVAL,20H

OUT20H,AL

中断结束返回DOS时应将IMR对应位置1,以关闭中断。

四、参考流程图

图22中断

五、程序代码

/************************/

/*中断实验*/

/************************/

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

inti=0;

voidMyISR()

{

printf("TPCpcicardinterrupt\n");

i++;

}

voidmain()

{

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

printf("PleasePressDMC!

Pressanykeytoexit!

\n");

RegisterLocalISR(MyISR);/*注册中断程序*/

EnableIntr();/*开中断*/

while(!

kbhit()&&i!

=10)

{

}

DisableIntr();/*关中断*/

Cleanup();/*关闭设备*/

}

六、实验结果

按一次单次脉冲,屏幕中出现“TPCpcicardinterrupt”,出现十次后程序退出。

实验六模/数转换器

一、实验目的

了解模/数转换的基本原理,掌握ADC0809的使用方法。

二、实验内容

1、实验电路原理图如图22。

通过实验台左下角电位器RW1输出0~5V直流电压送入ADC0809通道0(IN0),利用debug的输出命令启动A/D转换器,输入命令读取转换结果,验证输入电压与转换后数字的关系。

启动IN0开始转换:

Out02980

读取转换结果:

In0298

图22模数转换电路

2、编程采集IN0输入的电压,在屏幕上显示出转换后的数据(用16进制数)。

三、实验提示

1、ADC0809的IN0口地址为298H,IN1口地址为299H。

2、IN0单极性输入电压与转换后数字的关系为:

其中Ui为输入电压,UREF为参考电压,这里的参考电压为PC机的+5V电源。

3、一次A/D转换的程序可以为

MOVDX,口地址

OUTDX,AL;启动转换

;延时

INAL,DX;读取转换结果放在AL中

四、参考流程图(见图23,24)

(A)主程序(B)显示子程序

五、程序代码:

/************************/

/*A/D转换实验*/

/************************/

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

voidmain()

{

BYTEdata;

printf("Pressanykeytoexit!

\n");

if(!

Startup())/*打开设备*/

{

printf("ERROR:

OpenDeviceError!

\n");

return;

}

while(!

kbhit())

{

PortWriteByte(0x298,0x00);/*启动A/D通道0*/

Sleep(70);/*延时*/

PortReadByte(0x298,&data);

printf("%d\n",data);/*将转换后的数据在屏幕上显示*/

}/*如有键按下则退出*/

Cleanup();/*关闭设备*/

}

六、实验结果:

屏幕显示电压。

实验七交通灯控制系统(综合实验)

一、实验目的:

综合运用8255、8253、8259等设计和搭接接口电路,完成设计要求。

二、实验内容:

1.按照时间控制原则,利用并行接口和定时器,采用时间中断方式设计一套十字路口的交通灯管理系统。

2.要求南北方向和东西方向上的车辆在交通灯的控制下交替放行,主干道每次通行时间可设置修改。

3.在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换。

4.黄灯亮时,要求每秒闪亮一次。

5.当绿灯亮时,其显示时间采用倒计时的方法在显示器及实验台上的数码管进行显示。

三、实验电路:

四、程序流程图:

1.主程序:

2.中断服务程序:

3.显示子程序:

五、程序代码:

#include

#include

#include"..\\ApiEx.h"

#pragmacomment(lib,"..\\ApiEx.lib")

intflag=0;

intd;

intportc[]={0x24,0x44,0x04,0x44,0x04,0x44,0x04,0x81,0x82,0x80,0x82,0x80,0x82,0x80,0xff};

BYTEdata;

DWORDWINAPIThreadProc(LP

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1