1,在嵌入式的中断章节中 为何多个中断源可以共用一个中断ID 问

中断映射。
中断有很多种,在初始化好中断后,就靠触发条件引起中断。比如外部中断:某一个管脚从低变高时,引发中断函数,函数函数跳入中断部分执行。比如时间中断:当你所设置的定时时间到,就引发一次中断,跳到中断函数。

在嵌入式的中断章节中 为何多个中断源可以共用一个中断ID  问

2,单片机外部中断只能使用一次

不得不说你很强悍,居然全程用汇编实现单片机程序。这个我是看不懂了,打个酱油了。说个个人建议:不过你代码本身都不全,实在不好给予准备的判断的,外部中断的作用也没有说,主程序运行现象也不清楚,接收电脑数据是串口,删去代码前和删除代码后数码管的现象和主程序现象,以及外部中断工作情况,感觉你应该把相关的情况说明下,更好的分析。建议你自己增加LED灯汇编代码做调试,虽然有点慢但还是能找到问题的
while(!int1) //等待int1变为高电平如果int1不变为高,则程序进入死循环,不会再执行其他语句呀

单片机外部中断只能使用一次

3,51单片机执行完外部中断0后想让他返回主函数的开头从新执行继

你主函数中除了初始化的语句外,其它的处理部分都放在WHILE(1)的循环中啊,然后 外部中断中设置一个标志位,举例说明,比如。下面例子,是外中断一次,P0取反一次,你如果还想有其它数据处理,可以把语句写在WHILE(1)中。中断执行后,判断FLAG,然后会自动回到主函数中。void main(void) flag=0;EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //负跳变来触发外中断 P0=0xff; while(1)if(flag)可以在此添加语句。}可以在此添加语句。 } }void it0(void) interrupt 0 using 0 P0=~P0; //每产生一次中断请求,P0取反一次。 flag=1; }
这个思路不对吧?中断来了自然就去执行中断函数了,还要到主函数开头等待吗?

51单片机执行完外部中断0后想让他返回主函数的开头从新执行继

4,stm32一秒钟最多可以进多少次中断

胡说。中断函数有调用开销24个时钟周期,还有清中断标识的时间。你和主频一样的定时器中断,那就是1个时钟周期一次,完成定时器中断调用和处理中断标志位。你自己想想怎么可能。
nvic_prioritygroupconfig(nvic_proioritygroup_1);//把应用程序中断复位控制寄存器的10-8位设位1,表示1位抢断优先级,3位表示子优先级nvic_initstructure.nvic_irqchannelpreemptionpriority = 0;此处只能为0或1,因为1位来表示nvic_initstructure.nvic_irqchannelsubpriority = 2;此处可以是0-7,因为是3位表示把tim_irqchanne的抢断优先级设为0,子优先级设为2,数字越小优先级越高,抢断优先级可以打断其他的中断,而子优先级不能
这也和中断优先级和中断顺序有关
和主频一样
这个跟你的时钟,可以说是时钟周期一致
这个可以设置中断定时器,想进多少就进多少。

5,C51单片机程序利用外部中断INT0INT1当INT0产生中断时使LED

#include<reg52.h>#include<stdio.h>#define uint unsigned int#define uchar unsigned charsbit LED1=P0^0;sbit LED2=P0^1;sbit LED3=P0^2;sbit LED4=P0^3;sbit LED5=P0^4;sbit LED6=P0^5;sbit LED7=P0^6;sbit LED8=P0^7;void Delay(uint ms) uint i,j; for(i=0;i<ms;i++) for(j=0;j<1141;j++)}void main() EX0=1;//开中断0 IT0=1;//下降沿触发 EX1=1;//开中断1 IT1=1;//下降沿触发 EA=1;//开总中断 LED1=1; LED2=1; LED3=1; LED4=1; LED5=1; LED6=1; LED7=1; LED8=1;//LED初始状态为全灭}void INT0() interrupt 0 uint i; for(i=0;i<4;i++) LED8=0; Delay(500); LED8=1; }}void INT1() interrupt 1 uint i; for(i=0;i<4;i++) LED1=0; LED2=0; Delay(500); LED1=1; LED2=1; LED3=0; LED4=0; Delay(500); LED3=1; LED4=1; LED5=0; LED6=0; Delay(500); LED5=1; LED6=1; LED7=0; LED8=0; Delay(500); LED7=0; LED8=0; }}备注:1、led对应引脚可以修改,程序中默认单片机引脚低电平点亮led,如果是高电平点亮 led,反过来设置引脚电平就可以了; 2、延时时间可以按自己需要修改; 3、#include<reg52.h>这一句中的52根据实际需要修改,是51系列则改为51,52则改为 52,一定不能错,否则会出错。
你可以再主函数里面写一个条件语句,在这个条件语句里写LED8亮8灭闪烁4次。然后在外部中断中写入达成这个条件的表达式
程序和具体电路结合起来才能看出问题,有一个办法可以不用具体研究代码和电路:把你调试用的汉字点阵全部改为0xff,看是否该汉字所在位置是否全部显示,然后把第一个字节改为0x00或0xef,看对应显示是否正确,也可以再改其他字节的点阵。用这种方法可以找出问题所在!第7-15行是汉字的下半部分,据此查看一下程序和电路。

文章TAG:一个外部中断函数能中断多少次一个  外部  外部中断  
下一篇