实验3 IO口和中断
- 格式:ppt
- 大小:331.00 KB
- 文档页数:14
IO口中断原理1. 引言在计算机系统中,IO(Input/Output)口是计算机与外部设备进行数据交换的接口。
当外部设备需要向计算机发送数据或者接收计算机发送的数据时,可以通过IO口来实现。
为了能够及时地响应外部设备的请求,避免长时间的等待,计算机系统引入了IO口中断机制。
本文将详细解释与IO口中断原理相关的基本原理。
2. 中断概述中断是指在程序执行过程中,由于某种事件发生而打断正常的程序执行流程,转而去执行相应的处理程序。
在计算机系统中,有多种类型的中断,包括硬件中断和软件中断。
其中,硬件中断又分为外部中断和内部中断。
IO口中断属于外部硬件中断。
3. IO口中断原理3.1 IO控制器在计算机系统中,IO控制器负责管理各个外部设备,并与CPU进行数据交换。
每个IO控制器都有一个或多个IO口用于与外部设备连接。
当外部设备需要与CPU通信时,可以通过IO控制器来实现。
3.2 中断请求信号当外部设备需要向CPU发送数据时,会向对应的IO口发送一个中断请求信号,通知CPU有数据需要处理。
这个中断请求信号可以是电平触发的,也可以是边沿触发的。
3.3 中断控制器为了能够处理多个外部设备的中断请求,计算机系统通常会引入中断控制器。
中断控制器负责管理各个IO口的中断请求,并将其转发给CPU。
它可以根据优先级对中断请求进行排序,确保高优先级的请求先被处理。
3.4 中断向量表在接收到中断请求后,CPU需要知道要执行哪个处理程序来处理该中断。
为此,计算机系统通常会维护一个中断向量表(Interrupt Vector Table),其中存储了每个中断对应的处理程序入口地址。
当CPU接收到一个中断时,会根据该中断的编号在中断向量表中查找对应的入口地址,并跳转到该地址执行相应的处理程序。
3.5 中断服务程序每个外部设备都有一个对应的中断服务程序(Interrupt Service Routine),用于处理该设备产生的中断。
单片机io口实验[单片机IO口控制实验实验报告]一、实验目的1、熟悉MCS-51的I/O结构;2、掌握MCS-51I/O的使用方法;3、掌握MCS-51的中断机制。
二、实验原理1、MCS-51单片机的硬件结构片内结构:2、内部数据存储器:3、SFR的名称及其分布:4、I/O端口地址:5、P0P3端口功能总结:P0P3口都是并行I/O口,但P0口和P2口,还可用来构建系统的数据总线和地址总线,所以在电路中有一个MU某以进行转换。
而P1口和P3口无构建系统的数据总线和地址总线的功能,因此,无MU某P0口的MU某的一个输入端为“地址/数据〞信号。
P2口的MU某勺一个输入信号为“地址〞信号。
在4个口中只有P0口是一个真正的双向口,P1P3口都是准双向口。
原因:P0口作数据总线使用时,需解决芯片内外的隔离问题,即只有在数据传送时芯片内外才接通;不进行数据传送时,芯片内外应处于隔离状态。
为此。
P0口的输出缓冲器应为三态门。
P0口中输出三态门是两只场效应管组成,所以是一个真正的双向口。
P1P3口,上拉电阻代替P0口中的场效应管,输出缓冲器不是三态的一准双向口。
P3口的口线具有第二功能,为系统提供一些控制信号。
因此P3口增加了第二功能控制逻辑。
这是P3口与其它各口的不同之处。
6、P0口结构及特点:⑴P0口结构与运作1个输出锁存器,用于进行输出数据的锁存;2个三态输入缓冲器,分别用于锁存器和引脚数据的输入缓冲;1个多路开关MU某它的一个输入来自锁存器,另一个输入是地址/数据信号的反相输出。
在控制信号的的控制下能实现对锁存器输出端和地址/数据线之间的切换;两只场效应管组成的输出驱动电路。
⑵P0口的特点P0口是一个双功能的端口:地址/数据分时复用口和通用I/O口;具有高电平、低电平和高阻抗3种状态的I/O端口称为双向I/O端口。
P0口作地址/数据总线复用口时,相当于一个真正的双向I/O口。
而用作通用I/O口时,于引脚上需要外接上拉电阻,端口不存在高阻状态,此时P0口只是一个准双向口;为保证引脚上的信号能正确读入,在读入操作前应首先向锁存器写1;单片机复位后,锁存器自动被置1;一般情况下,如果P0口已作为地址/数据复用口时,就不能再用作通用I/O口使用;P0口能驱动8个TTL负载。
实验三:I/O扩展实验一、实验目的1.学习并掌握用74系列器件扩展8031系统I/O口的技术。
2.学习逻辑移位指令的使用。
二、实验设备及器件1.IBM PC机一台2.DVCC单片机实验箱一台三、实验原理1、本实验使用74LS244八位三态门作输入扩展口,用74LS273八位D型触发器作输出扩展口。
2、74LS244是一个八位三态门。
当使能端E为低电平时,输出端Q的状态即为输入端D的状态。
当E为高电平时,输出端Q为高阻态。
所以74LS244可接在单片机数据总线上。
3、74LS273是一个八位D型触发器。
当74LS273的/CLR端为高电平时,在CLK端上加一上升沿脉冲,输入端D的电平被锁存到输出端Q,然后Q端电平保持不变。
图3-1 I/O扩展原理图4、电路原理图如图3-1所示。
5、实验箱各接口器件模块其地址由74LS138译码产生。
接口器件地址译码电路原理图见图3-2。
图3-2 地址译码电路原理图6、同样8031的RD与Y2经74LS32相或后连74LS244的使能端。
故Y2选中时,RD脉冲将数据从74LS244读入。
所以74LS244的地址为0A000H。
7、在图3-6中,74LS244的输入端接八个开关。
开关接右边时74LS244的输入端为高电平,开关接左边时74LS244的输入端为低电平。
74LS273的输出端经74LS240驱动后接发光二极管,74LS273输出为高时发光二极管点亮。
四、实验内容编写一个程序,通过74LS244读入开关(K1-K8)的状态,通过74LS273输出到发光二极管(L1-L8)上显示。
当开关状态全为“1”(拨动开关朝上为1)时发光二极管循环点亮,否则,开关状态为“1”对应的发光二极管闪烁显示,开关状态为“0”对应的发光二极管熄灭。
(K1对应L1,其余类推)五、程序框图六、汇编语言程序ORG 0000H BEGIN: LJMP STARTORG 0030H START: MOV B,#01 LOOP: MOV DPTR,#0A000HMOVX A,@DPTRCJNE A,#0FFH,OUT1MOV A,BRL AMOV B,AMOV R6,#0FFHDE: MOV R7,#0FFHDJNZ R7,$DJNZ R6,DEOUT: MOV DPTR,#0B000HMOVX @DPTR,ASJMP LOOPOUT1: MOV DPTR,#0B000HMOVX @DPTR,ACLR AMOVX @DPTR,ASJMP LOOPEND七、PROTUES仿真电路图(总线型)实验四、外部中断程序一、实验目的学习8031外部中断的基本使用方法。
实验三流水灯实验(I/O口和定时器实验)一、实验目的1.学会单片机I/O口的使用方法和定时器的使用方法;2.掌握延时子程序的编程方法、内部中断服务子程序的编程方法;3.学会使用I/O口控制LED灯的应用程序设计。
二、实验内容1.控制单片机P1口输出,使LED1~LED8右循环轮流点亮(即右流水),间隔时间为100毫秒。
2.控制单片机P1口输出,使LED1~LED8左循环轮流点亮(即左流水),间隔时间为100毫秒。
3.使用K1开关控制上面LED灯的两种循环状态交替进行;4. 用定时器使P1口输出周期为100ms的方波,使LED闪烁。
5.使用定时器定时,使LED灯的两种循环状态自动交替,每一种状态持续1.6秒钟(选作)。
三、实验方法和步骤1.硬件电路设计使用实验仪上的E1、E5和E7模块电路,把E1区的JP1(单片机的P1口)和E5区的8针接口L1~L8(LED的驱动芯片74HC245的输入端)连接起来,P1口就可以控制LED 灯了。
当P1口上输出低电平“0”时,LED灯亮,反之,LED灯灭。
E7区的K1开关可以接单片机P3.0口,用P3.0口读取K1开关的控制信号,根据K1开关的状态(置“1”还是置“0”),来决定LED进行左流水还是右流水。
综上,画出实验电路原理图。
2.程序设计实验1和实验2程序流程图如图3-1实验3程序流程图如图3-2所示。
图3-1 实验1,2程序流程图图3-2 实验3程序流程图实验4程序流程图如图3-3,3-4所示。
实验5程序流程图如图3-5,3-6所示。
图3-5 实验5主程序流程图图3-6 定时器中断服务子程序流程图图3-4 定时器中断服务子程序流程图图3-3 实验4主程序流程图编程要点:(1)Pl,P3口为准双向口,每一位都可独立地定义为输入或输出,在作输入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。
例如:MOV P1,A; P1口做输出MOV P1,#0FFHMOV A,P1;P1口做输入SETB P3.0MOV C,P3.1;从P3.1口读入数据(2)每个端口对应着一个寄存器,例:P1→90H(P1寄存器地址);P3→B0H(P3寄存器地址);寄存器的每一位对应着一个引脚,例:B0H.0→P3.0(3)对寄存器写入“0”、“1”,对应的外部引脚则输出“低电平”、“高电平”。
io口中断原理一、io口中断的定义和作用IO口中断,指的是在计算机系统中,外部设备通过输入输出接口(IO接口)向处理器发出中断请求,处理器在接收到请求后,立即暂停当前任务,转而处理外部设备的中断请求。
这种方式使得外部设备能够及时得到处理,提高了系统的响应速度和效率。
二、io口中断的工作原理io口中断的工作原理可以简单概括为以下几个步骤:1.外部设备通过IO接口向处理器发送中断请求信号。
2.处理器接收到中断请求信号后,进行中断响应,保存当前任务的状态,转入中断处理程序。
3.处理器执行中断处理程序,对中断请求进行处理。
4.处理完中断请求后,处理器恢复之前保存的任务状态,继续执行原任务。
三、io口中断的应用场景io口中断广泛应用于各类实时操作系统和嵌入式系统中,如:1.硬盘读写:当硬盘读写完毕或发生错误时,通过io口中断通知处理器进行相应处理。
2.网络数据接收与发送:在网络通信过程中,当数据到达或发送完毕时,通过io口中断通知处理器进行处理。
3.串口通信:在串口通信过程中,当数据接收或发送完毕时,通过io口中断通知处理器进行处理。
四、如何使用io口中断提高系统性能1.合理配置中断优先级:根据外部设备的重要性和实时性要求,合理设置中断优先级,确保关键设备得到优先处理。
2.优化中断处理程序:编写高效、简洁的中断处理程序,减少中断处理时间。
3.避免中断嵌套:在中断处理过程中,尽量避免产生新的中断请求,以减少中断处理的时间复杂度。
五、总结与展望io口中断作为计算机系统中的一种重要机制,对于提高系统性能和响应速度具有重要意义。
通过合理配置和优化io口中断,可以有效提升系统的实时性和稳定性。
实验三使用中断的定时器一、实验目的1、理解C2000芯片的CPU定时器和中断系统的工作原理;2、学会使用TMS320F28027芯片的定时器实现定时;3、掌握CPU定时器和PIE外设中断控制器相关寄存器的配置与使用。
二、概述本实验的程序实现了定时器Timer0定时1秒,对应LED灯D10状态翻转,由亮到灭,在由灭到亮,一致循环下去;定时器Timer1定时2秒,对应LED灯D12状态翻转;定时器Timer2定时4秒,对应LED灯D13状态翻转。
表1 输出引脚硬件配置表3D13GPIO237Timer2对应LED图1 LED灯连接电路图三、实验内容1、按照新建工程项目的方法进行实验(参考实验二)。
2、主函数(程序流程框图见图2所示)#include"DSP28x_Project.h"// Device Headerfile and Examples Include File // Prototype statements for functions found within this file.interrupt void cpu_timer0_isr(void);interrupt void cpu_timer1_isr(void);interrupt void cpu_timer2_isr(void);void InitTimerGpio(void);void main(void){// Step 1.系统初始化Initialize System Control:// PLL, WatchDog, enable Peripheral Clocks// This example function is found in the f2802x_SysCtrl.c file.InitSysCtrl();// Step 2.GPIO初始化 Initalize GPIO:// This example function is found in the f2802x_Gpio.c file and// illustrates how to set the GPIO to it's default state.// InitGpio(); // Skipped for this exampleInitTimerGpio();// Step 3. 清除(关闭)中断并初始化外设中断向量表 Clear all interrupts and initialize PIE vector table:// 关闭CPU中断 Disable CPU interruptsDINT;// Initialize the PIE control registers to their default state.// The default state is all PIE interrupts disabled and flags// are cleared.// This function is found in the f2802x_PieCtrl.c file.InitPieCtrl();// Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000;// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).// This will populate the entire table, even if the interrupt// is not used in this example. This is useful for debug purposes.// The shell ISR routines are found in f2802x_DefaultIsr.c.// This function is found in f2802x_PieVect.c.InitPieVectTable();// Interrupts that are used in this example are re-mapped to// 设置中断向量表 ISR functions found within this file.EALLOW; // This is needed to write to EALLOW protected registers0 = &cpu_timer0_isr;1 = &cpu_timer1_isr;2 = &cpu_timer2_isr;EDIS; // This is needed to disable write to EALLOW protected registers // Step 4. 初始化CPU定时器 Initialize the Device Peripheral. This function can be// found in f2802x_CpuTimers.cInitCpuTimers(); // For this example, only initialize the Cpu Timers#if (CPU_FRQ_60MHZ)//配置CPU定时器 Configure CPU-Timer 0, 1, and 2 to interrupt every second:// 60MHz CPU Freq, 1 second Period (in uSeconds)ConfigCpuTimer(&CpuTimer0, 60, );ConfigCpuTimer(&CpuTimer1, 60, );ConfigCpuTimer(&CpuTimer2, 60, );#endif#if (CPU_FRQ_50MHZ)// Configure CPU-Timer 0, 1, and 2 to interrupt every second:// 50MHz CPU Freq, 1 second Period (in uSeconds)ConfigCpuTimer(&CpuTimer0, 50, );ConfigCpuTimer(&CpuTimer1, 50, );ConfigCpuTimer(&CpuTimer2, 50, );#endif#if (CPU_FRQ_40MHZ)// Configure CPU-Timer 0, 1, and 2 to interrupt every second:// 40MHz CPU Freq, 1 second Period (in uSeconds)ConfigCpuTimer(&CpuTimer0, 40, );ConfigCpuTimer(&CpuTimer1, 40, );ConfigCpuTimer(&CpuTimer2, 40, );#endif// To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any// of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in F2802x_CpuTimers.h), the// below settings must also be updated..all = 0x4001; //Use write-only instruction to set TSS bit = 0.all = 0x4001; // Use write-only instruction to set TSS bit = 0.all = 0x4001; // Use write-only instruction to set TSS bit = 0// Step 5.使能用到的中断 User specific code, enable interrupts:// Enable CPU int1 which is connected to CPU-Timer 0, CPU int13// which is connected to CPU-Timer 1, and CPU int 14, which is connected// to CPU-Timer 2:IER |= M_INT1;IER |= M_INT13;IER |= M_INT14;// Enable TINT0 in the PIE: Group 1 interrupt 7R1.7 = 1;// Enable global Interrupts and higher priority real-time debug events:EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGM// Step 6. 设置空循环(程序进入运行状态) IDLE loop. Just sit and loop forever (optional):for(;;);}//下面是中断服务程序interrupt void cpu_timer0_isr(void){ EALLOW;ruptCount++;.GPIO0 = 1;.GPIO34 = 1;// Acknowledge this interrupt to receive more interrupts from group 1 K.all = PIEACK_GROUP1;}interrupt void cpu_timer1_isr(void){ EALLOW;ruptCount++;.GPIO1 = 1;// The CPU acknowledges the interrupt.EDIS;}interrupt void cpu_timer2_isr(void){ EALLOW;ruptCount++;.GPIO2 = 1;// The CPU acknowledges the interrupt.EDIS;}// 下面是配置GPIOvoid InitTimerGpio(void){EALLOW;X1.34 = 0;R.34 = 1;X1.0 = 0;R.0 = 1;X1.1 = 0;R.1 = 1;X1.2 = 0;R.2 = 1;EDIS;}四、课外学习任务1、进一步理解实验内容,在实验板上找到GPIO34连接的LED灯,试解读下面的程序代码:X1.34 = 0;R.34 = 1;2、总结实验内容及步骤写出实验报告。
实验一存储器读写实验目的:1、掌握寄存器、存储器读写等汇编指令;2、掌握编程软件编辑、编译、调试等基本操作。
实验内容:1、将下面的汇编程序输入到W A VE集成开发软件中ORG 0000H ;复位入口SJMP START ;无条件跳转至STARTORG 0030H ;系统初始化START:MOV R0,#07H ;将直接数存入R0寄存器MOV R1,#0FEH ;将直接数FE存入R1寄存器ADD A,R0 ;将R0寄存器中的内容与A累加器中的内容相加ADDC A,R1 ;将R1寄存器中的内容与A累加器中的内容相加MOV DPTR,#2000H ;将直接数2000H存入指针DPTRMOVX @DPTR,A ;将A累加器中内容存入以DPTR为地址单元中MOVX A,@DPTR ;将以DPTR为地址单元中内容存入A累加器中INC A ;A累加器所在地址自动加一MOV P1,A ;将A累加器中内容存入P1中END ;结束2、选择菜单“仿真器”→“仿真器设置”,按下图所示完成软件初始设置。
3、选择菜单“项目”下“编译”,编译通过后,选择“单步运行”,观察记录寄存器(R0、R1)、累加器(A)、程序状态字(PSW)、外部存储器(2000H单元)、I/O端口(P1)的数据变化。
思考题:试用汇编语言编写一段程序,判断R1、R2、R3三个寄存器中存放的数据大小,并按从大到小的顺序重新存放到R1、R2、R3三个寄存器中。
ORG 0000H ;复位入口SJMP START ;无条件跳转至STARTORG 0030H ;系统初始化START:MOV R1,#01H ;将直接数01H存入R1寄存器MOV R2,#04H ;将直接数04H存入R2寄存器MOV R3,#09H ;将直接数09H存入R3寄存器CLR C ;将C累加器清零MOV A,R1 ;将R1寄存器中的内容存入A累加器中SUBB A,R2 ;两数比较JNC LOOP0 ;无借位跳转(R1大则转LOOP0)MOV A,R1 ;将R1寄存器中的内容存入A累加器中XCH A,R2 ;交换R2寄存器与A累加器中的内容MOV R1,A ;将A累加器中的内容存入R1寄存器中(交换R1和R2内容)CLR C ;将C累加器清零LOOP0: MOV A,R1 ;将R1寄存器中的内容存入A累加器中SUBB A,R3 ;两数比较JNC LOOP1 ;无借位跳转(R1大则转LOOP1)MOV A,R1 ;将R1寄存器中的内容存入A累加器中XCH A,R3 ;交换R3寄存器与A累加器中的内容MOV R1,A ;将A累加器中的内容存入R1寄存器中(交换R1和R3内容)CLR C ;将C累加器清零LOOP1: MOV A,R2 ;将R2寄存器中的内容存入A累加器中SUBB A,R3 ;两数比较JNC LOOP2 ;无借位跳转(R2大则转LOOP2)MOV A,R2 ;将R2寄存器中的内容存入A累加器中XCH A,R3 ;交换R3寄存器与A累加器中的内容MOV R2,A ;将A累加器中的内容存入R1寄存器中(交换R2和R3内容)LOOP2: MOV R2,A ; LOOP1:将A累加器中的内容存入R2寄存器中RET ;结束心得体会:本次实验主要学习了WAVE软件基本操作运用,并进一步深入学习汇编语言,并用汇编语言进行程序编写,解决一些实际问题.实验二I/O端口操作实验目的:1、掌握I/O端口读写等汇编指令;2、掌握仿真软件PROTEUS硬件电路设计及仿真、调试等基本操作方法。