求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...相关的知识,希望对你有一定的参考价值。
interruptX
其中X表示中断号,
0表示外部中断0
1表示定时器0溢出中断
2表示外部中断1(/INT1)
3表示定时器1溢出中断
4表示串行口中断
5表示定时器2溢出中断
有些增强型51还会有其他中断 参考技术A 1、//定时器赋予初值,在24mhz时,每个中断1ms=0xf830
t0flg=1;
问:其中t0flg=1,的t0flg是什么意思?
t0flg是在定时器0计数满后,由硬件自动置1,如果有中断程序响应,则由硬件自动清零。
2、问:此处的循环判断语句是判断什么为真?如何跳出循环?
这里表示,程序不准备跳出循环了,这个就是主循环了。主循环一般都是处理固定的内容,依靠中断程序,或某些标志位来作为应对各种情况的处理条件。
中断优先级如何设置?
中断优先级如何设置?
设置中断优先级的函数,CMISIS已经写好,并嵌入到了编译器中,例如,我们用KEIL开发的话,设置中断优先级的函数位于core_cm0.h文件当中,函数如下所示:/** \brief Set Interrupt Priority
The function sets the priority of an interrupt.
\note The priority cannot be set for every core interrupt.
\param [in] IRQn Interrupt number.
\param [in] priority Priority to set.
*/
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
if(IRQn < 0)
SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));
else
NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn));
从上面函数可以看出,该函数有两个参数,IRQn是指要设置的中断向量,priority是中断优先级,优先级可以是0 1 2 3四个数,0的优先级最大,3的优先级最小。假设你要设置GPIO1中断的优先级最高,那么就是:
NVIC_SetPriority(EINT1_IRQn, 0);
这时,有人会问,”EINT1_IRQn”
答:这个可以在LPC11xx.h文件当中找到,如下所示:
/*
* ==========================================================================
* ---------- Interrupt Number Definition -----------------------------------
* ==========================================================================
*/
typedef enum IRQn
/****** Cortex-M0 Processor Exceptions Numbers ***************************************************/
Reset_IRQn = -15, /*!< 1 Reset Vector, invoked on Power up and warm reset */
NonMaskableInt_IRQn = -14, /*!< 2 Non maskable Interrupt, cannot be stopped or preempted */
HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */
SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */
PendSV_IRQn = -2, /*!< 14 Pendable request for system service */
SysTick_IRQn = -1, /*!< 15 System Tick Timer */
/****** LPC11Cxx or LPC11xx Specific Interrupt Numbers *******************************************************/
WAKEUP0_IRQn = 0, /*!< All I/O pins can be used as wakeup source. */
WAKEUP1_IRQn = 1, /*!< There are 13 pins in total for LPC11xx */
WAKEUP2_IRQn = 2,
WAKEUP3_IRQn = 3,
WAKEUP4_IRQn = 4,
WAKEUP5_IRQn = 5,
WAKEUP6_IRQn = 6,
WAKEUP7_IRQn = 7,
WAKEUP8_IRQn = 8,
WAKEUP9_IRQn = 9,
WAKEUP10_IRQn = 10,
WAKEUP11_IRQn = 11,
WAKEUP12_IRQn = 12,
CAN_IRQn = 13, /*!< CAN Interrupt */
SSP1_IRQn = 14, /*!< SSP1 Interrupt */
I2C_IRQn = 15, /*!< I2C Interrupt */
TIMER_16_0_IRQn = 16, /*!< 16-bit Timer0 Interrupt */
TIMER_16_1_IRQn = 17, /*!< 16-bit Timer1 Interrupt */
TIMER_32_0_IRQn = 18, /*!< 32-bit Timer0 Interrupt */
TIMER_32_1_IRQn = 19, /*!< 32-bit Timer1 Interrupt */
SSP0_IRQn = 20, /*!< SSP0 Interrupt */
UART_IRQn = 21, /*!< UART Interrupt */
Reserved0_IRQn = 22, /*!< Reserved Interrupt */
Reserved1_IRQn = 23,
ADC_IRQn = 24, /*!< A/D Converter Interrupt */
WDT_IRQn = 25, /*!< Watchdog timer Interrupt */
BOD_IRQn = 26, /*!< Brown Out Detect(BOD) Interrupt */
FMC_IRQn = 27, /*!< Flash Memory Controller Interrupt */
EINT3_IRQn = 28, /*!< External Interrupt 3 Interrupt */
EINT2_IRQn = 29, /*!< External Interrupt 2 Interrupt */
EINT1_IRQn = 30, /*!< External Interrupt 1 Interrupt */
EINT0_IRQn = 31, /*!< External Interrupt 0 Interrupt */
IRQn_Type; 参考技术A 定时器中断和串口中断冲突的原因是什么? 定时多少,串口的波特率多少?
一般情况,个人觉得不至于冲突这么严重。很有可能是你在串口中断函数或者定时中断函数里做了太多的事情。以至于下一个中断来的时候,还没有跳出上一中断。
如果是这个原因,可以尝试在中断函数里只简单的赋值一些标志位。譬如,原来你的程序是在定时中断里每1秒让一个AD读一个电压,现在改成中断里设置AD_Flag = 1; 然后在main函数主循环里不断查询 if(AD_Flag ==1) ...//AD读一个电压;AD_Flag = 0;
用这种前后台的方式可以避免上述原因引起的中断冲突,本人以前试过,有效。希望有所帮助。
参考资料:百度一下
参考技术B 优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即可以由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定 参考技术C SETBPT0;恢复T0中断为高中断优先级CLR PT0;置T0中断为低中级优先级 参考技术D 对51单片机了,简单而言就是通过控制IP寄存器,它的低五位一次是(由高到底)PS PT1 PX1 PT0 PX0对应着五个中断,然后分别置1就可以了
以上是关于求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...的主要内容,如果未能解决你的问题,请参考以下文章