实验五 外部中断应用实验
单片机原理外部中断实验

单片机原理实验报告实验题目外部中断实验一、实验目的1.掌握用外部中断方式实现控制的方法。
2.掌握中断优先级的使用方法。
3. 掌握用Proteus实现单片机系统仿真的方法。
二、实验预备知识外部中断信号由P3.2(P3.3)管脚输入,当中断触发方式控制位ITO(IT1)为1时,CPU 在每个机器周期的S5P2采样P3.2(P3.3)管脚,如果连续两次采样,前一次采样为高电平,后一次采样为低电平,则认为有中断申请,随即使中断标志位IE0(IE1)置1,向CPU申请中断,直到该中断被CPU响应。
当定时器以计数方式工作,计数初值为满量程,在计数输入端T0(T1)输入负跳变信号时,计数器将加1并产生溢出,随即使溢出标志位TF0(TF1)置1,向CPU申请中断,直到该中断被CPU响应。
三、实验内容P1口做输出口,接八只发光二极管,利用手控单脉冲信号作为外部中断信号,编写控制程序,使八只发光二极管按一定的规律循环点亮。
1.程序1: 从外部中断0请求输入端(P3.2)输入脉冲信号2.程序2: 从定时器0的外部输入端(P3.4)输入脉冲信号四、实验参考电路P1口接发光二极管的阴极,P1口的管脚输出低电平时对应的发光二极管点亮,实验电路图如图4-1所示。
图4-1 外部中断实验电路五、实验参考程序ORG 0003HAJMP INT00 ORG 0013H AJMP INT11 ORG 0050H MAIN:SETB EASETB EX0SETB EX1SETB PX1SETB IT0SETB IT1MOV A,#0FEH LP1:MOV P1,ALCALL DELAY RL ASJMP LP1ORG 0100H INT00:PUSH ACCMOV A,#0FCH MOV R1,#7 LP2:MOV P1,A LCALL DELAY RL ADJNZ R1,LP2 POP ACCRETIORG 0150H INT11:PUSH ACCMOV A,#3FH MOV R2,#7 LP3:MOV P1,ALCALL DELAY RR ADJNZ R2,LP3 POP ACCRETIORG 0200H DELAY:MOV R3,#20 L1:MOV R7,#200 L2:MOV R6,#123 NOPL3:DJNZ R6,L3 DJNZ R7,L2 DJNZ R3,L1 RETEND六、实验分析与总结。
实验五 外部中断应用实验

外部中断应用实验设计性试验2012年11月28日星期三第三四节课一、实验目的1、掌握中断系统外部中断源的使用方法。
2、掌握延时程序的编程及使用方法。
3、掌握Proteus软件与Keil软件的使用方法。
4、掌握单片机系统的硬件和软件设计方法。
二、设计要求1、用Proteus软件画出电路原理图,在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
2、在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。
三、电路原理图四、实验程序流程框图和程序清单及实验结果/********************实验五外部中断应用实验要求:(1)在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
(2)在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。
**********************/ORG 0000HSTART: LJMP MAINORG 0003HLJMP EXINT0ORG 0013HLJMP EXINT1ORG 000BHLJMP TTC0ORG 0100HMAIN: MOV SP, #2FH ;堆栈指针初始化MOV IE, #10000111B;EA - - ES ET1 EX1 ET0 EX0MOV TMOD, #01H ;设置定时器T/C0为工作方式1MOV TH0, #9EH ;设置定时器T0的计数初值为25msMOV TL0, #58HSETB IT0 ;设置外部中断0为脉冲触发SETB IT1 ;设置外部中断1为脉冲触发HERE: LJMP HERE ;等待中断/*定时器T0中断服务程序*/ORG 0200HTTC0: CPL P1.2MOV TH0, #9EHMOV TL0,#58HRETI/*外部中断0开定时器服务程序*/ORG0300H EXINT0:SETB TR0RETI/*外部中断1关定时器服务程序*/ORG0400H EXINT1:CLR TR0RETIEND//C 语言编程// #include "reg52.h" sbit P1_2=P1^2;void main(){ SP=0x2f; IE=0x87; TMOD=0x01;//设置定时器T/C0 TH0=(65536-25000)/256; //设置定时器T0的计数初值为25ms TL0=(65536-25000)%256; IT0=1; //设置外部中断0为脉冲触发 IT1=1;//设置外部中断1为脉冲触发do { } while(1);}/**定时器T0中断服务子程序**/ void timer0() interrupt 1{P1_2=!P1_2;TH0=(65536-25000)/256;TL0=(65536-25000)%256;}/**外部中断0中断服务子程序**/ void EXINT0() interrupt 0 {TR0=1;}/**外部中断1中断服务子程序**/ void EXINT1() interrupt 2 {TR0=0;}五、实验总结通过本次试验,我掌握了定时器/计数器定时功能的使用方法,能够利用定时器/计数器以查询、中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数。
外部中断实验报告

外部中断实验报告外部中断实验报告引言:外部中断是计算机系统中的一种重要机制,它可以响应外部事件并中断正在执行的程序。
本实验旨在通过设计和实现一个外部中断的示例,加深对外部中断的理解和应用。
实验目的:1. 理解外部中断的概念和原理;2. 掌握外部中断的编程方法;3. 设计和实现一个基于外部中断的应用。
实验设备和材料:1. 一台支持外部中断的计算机;2. 开发板或模块,用于外部中断的触发。
实验过程:1. 硬件连接:将开发板或模块与计算机连接,并确保连接正确和稳定。
2. 编写中断处理函数:在编程环境中,编写一个中断处理函数,用于处理外部中断触发时的操作。
可以根据实际需求,设计适当的处理逻辑。
3. 配置中断触发条件:根据实验要求,配置外部中断触发的条件。
可以通过设置开关、按键或其他外部信号来触发中断。
4. 编写主程序:编写一个主程序,用于初始化外部中断和执行其他操作。
在主程序中,需要配置外部中断的相关寄存器和中断向量表。
5. 运行实验:将程序下载到计算机中,并运行实验。
通过触发外部中断条件,观察中断处理函数的执行情况。
实验结果与分析:在实验中,我们成功实现了一个基于外部中断的应用。
当外部中断触发条件满足时,中断处理函数被调用,并执行相应的操作。
通过实验观察和分析,我们可以得出以下结论:1. 外部中断可以在计算机系统中实现对外部事件的及时响应,提高系统的实时性和可靠性。
2. 外部中断的触发条件可以灵活配置,可以通过外部设备或信号的变化来触发中断。
3. 中断处理函数的执行时间相对较短,可以在不影响主程序正常运行的情况下完成相应的操作。
4. 外部中断的应用范围广泛,可以用于实现各种实时控制、通信和交互功能。
实验总结:通过本次实验,我们深入了解了外部中断的原理和应用,并成功设计和实现了一个基于外部中断的应用。
外部中断作为计算机系统中的重要机制,具有重要的意义和应用价值。
在今后的学习和实践中,我们应进一步探索和应用外部中断,为计算机系统的性能和功能提供更多的可能性。
实验外部中断实验说明文档word精品文档6页

实验5外部中断实验说明文档外部中断硬件说明GPIO硬件说明STM32开发板引出了电路长的所有IO口,电路如下图 1 引出的IO口STM32的IO口可以通过软件配置为以下的8种模式(1)GPIO _Mode_AIN 模拟输入(2)GPIO_Mode_IN_FLOATING 浮空输入(3)GPIO_Mode_IPD 下拉输入(4)GPIO_Mode_IPU 上拉输入(5)GPIO_Mode_Out_OD开漏输出(6)GPIO_Mode_Out_PP 推挽输出(7)GPIO_Mode_AF_OD 复用开漏输出(8) GPIO_Mode_AF_PP复用开漏输出STM32的每个IO端口都有7个寄存器来控制,他们分别是:2个32位的端口,配置寄存器CRL和CRH;一个16位的复用寄存器BRR;2个32位的数据寄存器IDR和ODR;1个32位的锁存寄存器LCKR;详细资料可以参见<<STM32中文参考资料>>.LED硬件说明STM32 开发板上的两个LED:LED0 和LED1.如下图:图2 LED 与STM32 连接原理图STM32中硬件电路将PB5管脚与LED0灯连接,而另一LED灯LED1则是连接在PE5.由电路可知,两个LED都是通过灌电流的方式来加电压,所以应将相应的GPIO口配置为输出方式,通过合理的控制其连接的GPIO口的输出电压(置高置低)就能控制灯的闪烁(关于GPIO配置操作请详见GPIO固件库说明文档).BEEP硬件说明STM32 开发板上的一个BEEP.如下图:图1 BEEP与STM32 连接原理图STM32中硬件电路将PB8管脚与BEEP连接,电路中用到NPN三极管(s8050)来驱动蜂鸣器,三极管主要的功能是放大电流,让电路有足够的电流来驱动蜂鸣器.当PB.8输出高电平时,蜂鸣器开始发声,当PB.8输出低电平时,蜂鸣器停止发声.KEY硬件说明STM32 开发板上的4个按钮(WK_UP,KEY0,KEY1,KEY2)如下图:图1 KEY与STM32 连接原理图STM32中硬件电路将PE4与KEY0连接在按钮按下时电路接地为低电平, PE3与KEY1连接在按钮按下时电路接地为低电平, PE2与KEY2连接在按钮按下时电路接地为低电平, PA0与WK_UP连接在按钮按下时电路接地为高电平,由电路可知,本实验通过WK_UP在芯片内部拉低输入模式下检测高电平时控制键蜂鸣器的开关按键KEY0检测为低时候控制LEDO和LED1同时开关,按键KEY1控制LED1的开关,按键KEY2控制LED0的开关,有关配置GPIO口 (关于GPIO配置操作请详见GPIO固件库说明文档).EXTI说明STM32开发板有19个外部中断,在外部的IO口上有16个外部中断,分别如下图 1 GPIO口与外部中断映射图STM32的IO端对应16个外部中断,GPIOx.0- GPIOx.15其中(x=A,B,C,D,E,F)分别对应中断线,每个中断线最多对应七个IO口,而中断线每次只能连接到一个IO口上去,可在软件中去配置STM32上的每个IO口可以自由编程,需要以32位的字访问外部中断软件说明实验中用到了GPIO固件库函数和LED固件库的函数的总和,在引用MCU中的头文件后用到的GPIO函数以及LED函数如下GPIO中的库函数1)使能总线时钟void GpioRccEnable(GPIO_TypeDef* GPIOx);2)配置管脚为输入输出模式void GpioConfig(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIOMode_TypeDef mode,GPIOSpeed_TypeDef speed );3)设置某一端口为输入输出模式void GpioSet(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,GPIOMode_TypeDef mode,GPIOSpeed_TypeDef speed );4)设置输入模式并初始化void GpioSetInMode(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin );5)设置输出模式并初始化void GpioSetOutMode(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,char init_value);6)管脚的输出的值void GpioSetOutValue(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin, char init_value);7)读取某一管脚的状态unsigned char GpioInReadPinStatus(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);LED中的库函数如下:1)初始化函数void LedInit(char led, char led_init_status);2)指定LED灯亮void LedOn(char led);3)灭掉指定的LED灯void LedOff(char led);BEEP中的库函数如下://功能: 初始化LEEP,并配置初始状态void BeepInit(char beep_init_status);//功能: 选定BEEP为开状态void BeepOn(void);//功能: 选定BEEP为关状态void BeepOff(void);按键中的库函数如下://IO初始化void KeyInit(void);//按键扫描函数u8 KeyScan(void);EXTI库函数如下:// 功能:使能外部时钟中断函数void ExtiRccEnable(uint32_t RCC_APB2Periph);// 功能:配置外部中断参数void ExtiConfig(uint32_t line,EXTIMode_TypeDef mode,EXTITrigger_TypeDef trigger,FunctionalState linecmd); // 功能:外部中断初始化void ExtiInit(void);外部中断应用简述实验中通过外部中断服务函数来检测按键是否按下来控制蜂鸣器和LED灯的亮灭,实验程序如下#include "common.h"int main()Init(); //总初始化while(1)printf("\n外部中断实验\r\n");delay_ms(1000);。
微机原理实验-外部中断实验

下面是赠送的几篇网络励志文章需要的便宜可以好好阅读下,不需要的朋友可以下载后编辑删除!!谢谢!!出路出路,走出去才有路“出路出路,走出去才有路。
”这是我妈常说的一句话,每当我面临困难及有畏难情绪的时候,我妈就用这句话来鼓励我。
一定有很多人想说:“这还在北京混个什么劲儿啊!”但他每天都乐呵呵的,就算把快递送错了也乐呵呵的。
某天,他突然递给我一堆其他公司的快递单跟我说:“我开了家快递公司,你看得上我就用我家的吧。
”我有点惊愕,有一种“哎呦喂,张老板好,今天还能三蹦子顺我吗”的感慨。
之后我却很少见他来,我以为是他孩子出生了休假去了。
再然后,我就只能见到单子见不到他了。
某天,我问起他们公司的快递员,小伙子说老板去上海了,在上海开了家新公司。
我很杞人忧天地问他:“那上海的市场不激烈吗?新快递怎么驻足啊!”小伙子嘿嘿一笑说:“我们老板肯定有办法呗!他都过去好几个月了,据说干得很不错呢!”“那老婆孩子呢?孩子不是刚生还很小吗?”“过去了,一起去上海了!”那个瞬间,我回头看了一眼办公室里坐着的各种愁眉苦脸的同事,并且举起手机黑屏幕照了一下我自己的脸,一股“人生已经如此的艰难,有些事情就不要拆穿”的气息冉冉升起。
并不是说都跳槽出去开公司才厉害,在公司瞪着眼睛看屏幕就是没发展,我是想说,只有勇气才能让自己作出改变。
《拒绝平庸》里有一句话:很多时候我们为什么嫉妒别人的成功?正是因为知道做成一件事不容易又不愿意去做,然后又对自己的懒惰和无能产生愤怒,只能靠嫉妒和诋毁来平衡。
其实走出去不一定非要走到什么地方去,而是更强调改变自己不满意的现状。
有人问我那你常说要坚持,天天跑出去怎么坚持?其实要坚持的是一种信仰,而不是一个地方,如果你觉得一个地方让你活得特别难受,工作得特别憋屈,除了吐槽和压抑没别的想法,那就要考虑走出去。
就像歌词里说的:“梦想失败了,那就换一个梦想。
”不能说外面都是大好前程,但肯定你会认识新的人,有新的机会,甚至改头换面重新做人。
PIO外部中断实验报告

PIO外部中断实验报告“SOPC技术综合设计实践”实验报告实验题号 : 实验五项目名称 :PIO外部中断实验系班 : 计科师范系11(1)学号 :姓名 :实验日期 : 20xx年4月2日指导老师:一、实验目的(1)熟悉中断服务程序的编写和注册方法。
(2)熟悉程序的调试方法,重点熟悉中断服务程序的调试方法。
(3)熟悉NiosII处理外部中断的方法。
二、实验内容1.外部中断信号由按键提供,然后将中断事件反映到对应的LED。
2.利用边沿捕获寄存器读取按键值,编写中断服务程序将读到的键值输出到LED。
即:按键F1按下,对应的LED0点亮。
三、实验原理当跳转到异常处理地址后,处理器开始执行一段由HAL插入的代码,判断中断源和中断优先级,然后再转跳到用户的中断服务子程序(ISR)中。
即发生异常后,异常处理除ISR外的所有工作都由HAL系统库代码替换用户完成。
为了将中断服务子程序的信息告知HAL,用户需要完成ISR的登记工作。
向HAL登记ISR的工作可以分为以下两步:(1)编写void isr_name(void *context,alt_u32 id)函数(2)调用alt_irq_register(alt_u32 id,void *context,void(*isr)(void*,alt_u32))函数,向HAL登记ISR。
四、SOPC的整个设计流程(附:截取主要的设计图)1. 基于实验3硬件系统(注意:将button_pio改为8位, input),修改后,重新generate。
3.编译后,下载.SOF文件4.在IDE平台上,新建一个.C文件,写入程序#include <stdio.h> #include "system.h"#include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "sys/alt_irq.h"#include "priv/alt_busy_sleep.h"#define LEDCON 0xff //#define KEYCON 0xff //alt_u32 done = 0; // 信号量:通知外部中断事件发生/************************************************************** ****** * 功能:键按下事件中断服务子程序,当键按下时,通过done 标志* 告知外界*************************************************************** *****/ static void KeyDown_interrupts(void* context, alt_u32 id) {/* 清中断捕获寄存器 */IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0);/* 通知外部有中断事件发生 */done++;}/************************************************************** ****** * 功能:初始化LED_PIO为输出,KEY为输入,开中断,清边沿捕获寄存器*************************************************************** *****/ void InitPIO(void){/* 初始化LED_PIO为输出,KEY为输入 */IOWR_ALTERA_AVALON_PIO_DIRECTION(PIO_BASE,LEDCON);IOWR_ALTERA_AVALON_PIO_DIRECTION(BUTTON_PIO_BAS E, 0x00);IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xff);/* 开KEY的中断 *//*请同学们自己完成*/IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x00);/* 清边沿捕获寄存器 */alt_irq_register(BUTTON_PIO_IRQ,NULL,KeyDown_interrupts );/* 注册中断服务子程序 *//*请同学们自己完成*/}/************************************************************** ****** * 功能:等待按键中断,并输出控制相应的LED。
外部中断实验报告

外部中断实验报告外部中断实验报告一、引言外部中断是计算机系统中的一种重要的中断方式,它可以使得计算机在执行某个任务的过程中,根据外部设备的信号来暂停当前任务,转而去处理其他紧急事件。
本实验旨在通过对外部中断的实验,深入了解外部中断的原理和应用。
二、实验目的1. 理解外部中断的概念和原理;2. 学会使用外部中断来处理外部设备的信号;3. 掌握外部中断的编程方法。
三、实验装置和材料1. 计算机硬件平台:使用一台支持外部中断的计算机;2. 软件平台:使用汇编语言进行编程。
四、实验步骤1. 连接外部设备:将外部设备(如键盘、鼠标等)与计算机相连接,确保外部设备可以正常工作;2. 编写中断处理程序:使用汇编语言编写中断处理程序,以响应外部设备的信号;3. 设置中断向量表:将中断处理程序的入口地址存放在中断向量表中,以便系统在接收到外部设备信号时能够正确地跳转到中断处理程序;4. 运行程序并测试:运行程序,触发外部设备的信号,观察中断处理程序是否能够正确执行。
五、实验结果与分析在实验中,我们成功地编写了一个外部中断处理程序,并将其入口地址存放在中断向量表中。
当我们触发外部设备的信号时,系统能够正确地跳转到中断处理程序,并执行相应的操作。
通过这个实验,我们深入了解了外部中断的原理和应用。
六、实验总结通过本次实验,我们对外部中断有了更深入的了解。
外部中断作为计算机系统中的一种重要中断方式,可以使计算机在执行某个任务的过程中,根据外部设备的信号来暂停当前任务,转而去处理其他紧急事件。
在实际应用中,外部中断广泛应用于各种设备的控制和通信系统中,提高了计算机系统的效率和可靠性。
七、实验心得通过本次实验,我深刻认识到了外部中断在计算机系统中的重要性。
在实验中,我不仅学会了编写中断处理程序,还了解了中断向量表的作用。
这次实验让我对计算机系统的工作原理有了更深入的了解,也提高了我的编程能力。
我相信这次实验对我的学习和将来的工作都有很大的帮助。
实验5 外部中断实验

四、实验流图
• 外部中断程序流程图
开始 设置初始状态 设置中断控制寄存器 中断允许
等待中断
• 中断子程序流程图
中断入口
保护现场
状态位取反 状态位输出
恢复现场
中断返回
实验5 外部中断实验
一、实验目的
• 掌握外部中断技术的基本使用方法
• 掌握中断处理程序的编写方法
二、实验原理
• 中断控制原理 中断控制是系统提供给用户使用的控 制手段,通过控制TCON、IE、SCON、IP 等寄存器达到智能控制目的。
• 实验硬件原理图
U1 +5 1 2 3 4 5 6 7 8 13 12 15 14 31 1 5p f Y1 1 2M Hz C2 9 1 5p f 17 16 19 18 P10 P11 P12 P13 P14 P15 P16 P17 INT1 INT0 T1 T0 EA/VP X1 X2 RESET RD WR RXD TXD ALE/P PSEN 10 11 30 29 P00 P01 P02 P03 P04 P05 P06 P07 P20 P21 P22 P23 P24 P25 P26 P27 39 38 37 36 35 34 33 32 21 22 23 24 25 26 27 28 VCC VCC D1 U2 1 11 3 4 7 8 13 14 17 18 OC C 1D 2D 3D 4D 5D 6D 7D 8D 7 4LS3 73 1Q 2Q 3Q 4Q 5Q 6Q 7Q 8Q 2 5 6 9 12 15 16 19 R1 R2 R3 R4 R5 R6 R7 R8 D2 D3 D4 D5 D6 D7 D8
R1 0 1K S1
C1
8 05 1
三、实验内容和步骤
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
外部中断应用实验
设计性试验
2012年11月28日星期三第三四节课
一、实验目的
1、掌握中断系统外部中断源的使用方法。
2、掌握延时程序的编程及使用方法。
3、掌握Proteus软件与Keil软件的使用方法。
4、掌握单片机系统的硬件和软件设计方法。
二、设计要求
1、用Proteus软件画出电路原理图,在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
2、在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。
三、电路原理图
四、实验程序流程框图和程序清单及实验结果
/********************
实验五外部中断应用实验
要求:(1)在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
(2)在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。
**********************/
ORG 0000H
START: LJMP MAIN
ORG 0003H
LJMP EXINT0
ORG 0013H
LJMP EXINT1
ORG 000BH
LJMP TTC0
ORG 0100H
MAIN: MOV SP, #2FH ;堆栈指针初始化
MOV IE, #10000111B;EA - - ES ET1 EX1 ET0 EX0
MOV TMOD, #01H ;设置定时器T/C0为工作方式1
MOV TH0, #9EH ;设置定时器T0的计数初值为25ms
MOV TL0, #58H
SETB IT0 ;设置外部中断0为脉冲触发
SETB IT1 ;设置外部中断1为脉冲触发
HERE: LJMP HERE ;等待中断
/*定时器T0中断服务程序*/
ORG 0200H
TTC0: CPL P1.2
MOV TH0, #9EH
MOV TL0,
#58H
RETI
/*外部中断0开定时器服务程序*/
ORG
0300H EXINT0:SETB TR0
RETI
/*外部中断1关定时器服务程序*/
ORG
0400H EXINT1:CLR TR0
RETI
END
//C 语言编程// #include "reg52.h" sbit P1_2=P1^2;
void main()
{ SP=0x2f; IE=0x87; TMOD=0x01;
//设置定时器T/C0 TH0=(65536-25000)/256; //设置定时器T0的计数初值为25ms TL0=(65536-25000)%256; IT0=1; //设置外部中断0为脉冲触发 IT1=1;
//设置外部中断1为脉冲触发
do { } while(1);
}
/**定时器T0中断服务子程序**/ void timer0() interrupt 1
{
P1_2=!P1_2;
TH0=(65536-25000)/256;
TL0=(65536-25000)%256;
}
/**外部中断0中断服务子程序**/ void EXINT0() interrupt 0 {
TR0=1;
}
/**外部中断1中断服务子程序**/ void EXINT1() interrupt 2 {
TR0=0;
}
五、实验总结
通过本次试验,我掌握了定时器/计数器定时功能的使用方法,能够利用定时器/计数器以查询、中断方式工作,设定计数功能,对外部连续周期性脉冲信号进行计数。
同时掌握了单片机系统的硬件和软件设计方法。
六、思考题
1、在P1.2口线上产生周期为100mS,占空比为2:5的连续矩形波,要求只采用按键K0来控制其开启和关闭。
ORG 0000H
START: LJMP MAIN
ORG 0003H
LJMP EXINT0
ORG 000BH
LJMP TTC0
ORG 001BH
LJMP TTC1
ORG 0100H
MAIN: MOV SP, #2FH ;堆栈指针初始化
MOV IE, #10001011B;EA - - ES ET1 EX1 ET0 EX0
MOV TMOD, #11H ;设置定时器T/C0为工作方式1
MOV TH0, #63H ;设置定时器T0的计数初值为40ms
MOV TL0, #0C0H
MOV TH1, #15H ;设置定时器T0的计数初值为60ms
MOV TL1, #0A0H
SETB IT0 ;设置外部中断为脉冲触发方式
MOV IP, #00000001B;设置外部中断0为高优先级,其余为低优先级
CLR A
HERE: LJMP HERE ;等待中断
/*定时器T0定时40ms 中断服务程序*/
ORG
0200H TTC0: CPL P1.2
;输出取反
MOV TH0, #63H ;重装计数初值 MOV TL0, #0C0H CLR TR0 ;关闭定时器T0 SETB TR1 ;开启定时器T1
RETI
;中断返回
/*定时器T1定时60ms 中断服务程序*/
ORG
0300H TTC1: CPL P1.2
;输出取反
MOV TH1, #15H ;重装计数初值 MOV TL1, #0A0H CLR TR1 ;关闭定时器T1 SETB TR0 ;开启定时器T0
RETI
;中断返回
/*外部中断0中断服务程序*/
ORG
0400H EXINT0:JNZ LOOP ; SETB P1.2
;输出置高电平 SETB TR0 ;关闭定时器T0
INC A
;累加器A 加1
LJMP
LOOP1 LOOP: CLR TR0 ;关闭定时器T0 CLR TR1 ;关闭定时器T1
CLR
A ;累加器A 清零 LOOP1: RETI
;中断返回
END
//C语言编程//
#include "reg52.h"
sbit P1_2=P1^2;
void main()
{ SP=0x2F;
IE=0x8B;
TMOD=0x11; //设置定时器T/C0为工作方式1
TH0=(65536-40000)/256;
TL0=(65536-40000)%256;
TH1=(65536-60000)/256;
TL1=(65536-60000)%256;
IT0=1; //设置外部中断为脉冲触发方式
IP=0x01; //设置外部中断0为高优先级,其余为低优先级do
{ }
while(1);
}
/**定时器T0定时40ms中断服务程序**/
void timer0() interrupt 1
{ P1_2=!P1_2;
TR0=0;
TR1=1;
TH0=(65536-40000)/256;
TL0=(65536-40000)%256;
}
/**定时器T1中断服务程序**/
void timer1() interrupt 3
{ P1_2=!P1_2;
TR1=0;
TR0=1;
TH1=(65536-60000)/256; TL1=(65536-60000)%256; }
/**外部中断0服务程序**/ void EXINT0() interrupt 0 { if(TR0==0&&TR1==0)
{ P1_2=1;
TR0=1;
TR1=0;
}
else
{ TR0=0;
TR1=0;
}
}。