单片机实验IRQ0IRQ1IRQ2中断Word文档格式.docx
《单片机实验IRQ0IRQ1IRQ2中断Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验IRQ0IRQ1IRQ2中断Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
![单片机实验IRQ0IRQ1IRQ2中断Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/28/bf5e965b-9c26-46e2-93a7-daf34e0787f1/bf5e965b-9c26-46e2-93a7-daf34e0787f11.gif)
掌握IRQ0、IRQ1、IRQ2中断的编程方法。
【实验设备】
装有Windows系统和μ’nSP?
IDE集成开发环境的PC机一台,μ’nSP?
十六位单片机实验箱一个。
本实验用到的实验箱硬件模块为:
SPCE061A核心及周边电路模块(包含32个I/O口),发光二极管电路模块。
【实验要求】
编程要求:
编写一个C语言程序。
实现功能:
打开并设置TimerA和TimerB定时器,并且开TimerA的IRQ1中断和TimerB的IRQ2
中断,当有TimerA的IRQ1中断或者TimerB的IRQ2中断请求时,响应相应的中断服务程序,
在中断服务中翻转I/O端口输出电平,以控制接在I/O端口的发光二极管的亮灭。
实验现象:
TimerA定时长度为2s,当进入TimerA的IRQ1中断后,翻转IOA口低四位输出电平
以控制接在IOA低四位端口的发光二极管;
TimerB定时长度为1s,当进入TimerB的IRQ2中断
后,翻转IOB口低四位输出电平以控制接在IOB低四位端口的发光二极管。
程序运行时,可以
观察到接在IOA低四位端口的发光二极管亮灭的周期为4s,而接在IOB低四位端口的为2s【实验原理】
【实验原理】
IRQ0_fosc/1024、IRQ1_TMA、IRQ2_TMB中断源,通过写P_INT_Ctrl来允许中断,通过IRQON、
INTIRQ或者INTFIQ,IRQ开总中断,其中IRQON的功能是打开IRQ中断;
INTIRQ的功能是打开
IRQ中断,关闭FIQ中断;
INTFIQ,IRQ的功能是打开FIQ和IRQ中断。
IRQ1_TMA和IRQ2_TMB中断源分别是通过定时器A、定时器B产生的,当计数溢出时产生中断
请求信号TA_TIMEOUT_INT或TB_TIMEOUT_INT,CPU响应后进入对应的中断服务子程序。
中断控制寄存器的设置在本章实验九有详细说明,不再赘述。
在本实验中,利用TimerA定时器定时一个固定长度时间,当定时时间到时产生溢出信号,进入
TimerA的IRQ1中断IRQ1_TMA,翻转一次I/O口输出电平以控制接在对应I/O口的发光二极管,TimerA
重新开始计数,当计数到定时时间溢出再响应一次IRQ1_TMA中断,翻转一次IOA口低四位输出电平
以控制接在IOA低四位端口的发光二极管,如此循环;
同样,利用TimerB定时器定时一个固定长度时
间,当定时时间到时溢出,进入TimerB的IRQ2中断IRQ2_TMB,翻转I/O口输出电平以控制接在对应
I/O口的发光二极管。
程序运行时,可以观察到接在I/O端口的发光二极管亮灭状态周期性变化。
【硬件连接】
IOA口低四位IOA0~3连接发光二极管D4~D7,IOB口低四位IOB0~3连接发光二极管D8~D11,即用一根排线将J16的第0~3号排针和IOA口低8位的第0~3号排针依次连接起来;
用另一根排线将J16
的第4~7号排针和IO8口低8位的第0~3号排针依次连接起来。
硬件连接图如图1-38。
1.主程序流程图
在主程序中,初始化A口、B口为同相低电平输入口,设置定时器的计数初值和时钟源频率以确定
定时器溢出频率(本实验中TimerA和TimerB的时钟源频率都选为4096Hz,设置TimerA的定时时间为
2s,设置TimerB的定时时间为1s),开IRQ0、IRQ1、IRQ2中断。
主程序流程图如图1-41。
2.中断服务子程序流程图
IRQ0、IRQ1、IRQ2中断服务子程序的流程图如图1-42。
IRQ1_TMA中断中,先进行寄存器压栈保
护,IOA口低四位输出电平翻转,以翻转D4~D7四个发光二极管亮灭状态,清IRQ1_TMA中断标志,
寄存器出栈,中断返回;
IRQ1_TMB中断中,同样先进行寄存器压栈保护,IOB口低四位输出电平翻转,
以翻转D8~D11四个发光二极管亮灭状态,清IRQ1_TMB中断标志,寄存器出栈,中断返回;
IRQ0_fosc/1024中断中,先进行寄存器压栈保护,清IRQ0_fosc/1024中断标志,寄存器出栈,中断返回。
【实验步骤】
1.建立一个新工程ex10_asm_IRQ0_IRQ1_IRQ2,根据程序流程图编写程序。
2.RebuildAll。
3.按照硬件连接图连接电路。
4.下载程序,运行。
5.观察发光二极管的状态,分析是否与实验要求的相统一。
源程序如下:
//main.c
#include"
SPCE061A.h"
intmain(void)
{
//设置IOA、IOB低四位为同相输出,初始为低电平,
*P_IOA_Dir=0x000f;
//0000000000001111
*P_IOA_Attrib=0x000f;
*P_IOA_Data=0x0000;
*P_IOB_Dir=0x000f;
*P_IOB_Attrib=0x000f;
*P_IOB_Data=0x0000;
//设置定时器A、B的属性
*P_TimerA_Ctrl=C_TMA1_4KHz|C_TMA2_1;
*P_TimerA_Data=0xf000;
//1=(1/4096)*(0xffff+1-x)
*P_TimerB_Ctrl=C_TMB_4KHz;
*P_TimerB_Data=0xe000;
//2=(1/4096)*(0xffff+1-x)
*P_INT_Ctrl=C_IRQ0_PWM|C_IRQ1_TMA|C_IRQ2_TMB;
//设置中断
三个中断或起来
asm("
INTIRQ"
);
//开IRQ中断
while
(1){
*P_Watchdog_Clear=C_WDTCLR;
}
return0;
}
//isr.c
voidBREAK(void)__attribute__((ISR));
voidFIQ(void)__attribute__((ISR));
voidIRQ0(void)__attribute__((ISR));
voidIRQ1(void)__attribute__((ISR));
voidIRQ2(void)__attribute__((ISR));
voidIRQ3(void)__attribute__((ISR));
voidIRQ4(void)__attribute__((ISR));
voidIRQ5(void)__attribute__((ISR));
voidIRQ6(void)__attribute__((ISR));
voidIRQ7(void)__attribute__((ISR));
voidBREAK(void)
//addyourcodehere
voidFIQ(void)
voidIRQ0(void)
if(*P_INT_Ctrl&
C_IRQ0_PWM){//判断是不是中断
*P_INT_Clear=C_IRQ0_PWM;
//清出中断
voidIRQ1(void)//对应定时器A
unsignedintuiData=0;
C_IRQ1_TMA){
uiData=*P_IOA_Data;
//读取A口的灯
uiData^=0x000f;
//0000000000001111
^=:
表异或,与全1异或为反,与全0异或为同
*P_IOA_Data=uiData;
*P_INT_Clear=C_IRQ1_TMA;
voidIRQ2(void)
C_IRQ2_TMB){
uiData=*P_IOB_Data;
//读取B口的灯
*P_IOB_Data=uiData;
*P_INT_Clear=C_IRQ2_TMB;
voidIRQ3(void)
voidIRQ4(void)
voidIRQ5(void)
voidIRQ6(void)
voidIRQ7(void)
1、程序编写:
实验箱硬件连接图:
实验现象:
根据设置不同的中断频率信号,左右各四个LED灯交替闪烁的频率就有所不同,由此得到中断设置的具体运用.
【实验总结】
1、实验中遇到的问题及解决办法
答:
1、问题:
对不同中断信号频率的设置需要符合程序运行的方式,LED灯的闪烁频率太快时就无法看见其在闪烁,交替闪烁的快慢也会随之变化,在程序的编写上要严格按照规则编写,否则就会出错,因此在实验中一定要弄清楚其缘由。
2、解决方法:
通过实际的计算测量。
老师的引导,同学之间的相互交流沟通学习,一步步的完成了此实验,并在老师的详细讲解下熟悉了个窗口的功能及硬件的了解和正确的连接,做出与实验目的相符合的结果。
2、自己在考虑本实验时的想法及实现情况
对该实验的设计上,要追求用最简洁的程序代码编写,逻辑清晰明了,步骤少,条理清楚,用高级语言(C语言)完成编写,经过事先的计算测量,得到能肉眼观察的范围后再导入硬件进行运算展示。
并在实验箱上看到LED等在不同设定频率下的闪烁情况,记录数据是否与理论相符合,最后完成本次实验。
继续阅读