请你参考:
一、简述外部中断的电平触发于边沿触发方式的工作原理并说明两者的区别。
答:两个外部中断的触发方式由TCON寄存器的 IT1位 和 IT0位 分别设置,方法相同。
IT0(IT1)=1,脉冲方式,后沿负跳有效;IT0(IT1)=1,电平方式,低电平有效;
TCON寄存器的 IE0 位和 IE1 位,是外中断请求标志位。
外部中断请求采样,CPU在每个机器周期对中断请求引脚(INT0 和 INT1)进行采样:
a对于电平方式,若采样为高电平,表明没有中断请求,IE0(IE1)继续为0,若采样为低电平,则中断请求有效,把 IE0(IE1)置1 。
b对于脉冲方式,若再两个相邻的机器周期采样到的是先高后低,则中断请求有效,把IE0(IE1)置1,否则继续为0。在这种方式下高低电平持续时间应在1个机器周期以上。
中断响应以后,硬件自动清除标识位 IE0(IE1),即中断请求的撤除是自动的。
但是对于电平方式,情况有所不同,因为中断请求虽然清除了,但是请求的低电平仍然存在,下一个机器周期又会采样到,又会置位 IE0(IE1),因此这种方式应在中断信号上采取硬件措施(这个话题不再继续,有点扯远了)。
二、简述对于既有片内程序存储器又有外部程序存储器的MCS-51系统,如何才能分别使用其片内程序存储器和外部程序存储器?
答:
把单片机的EA引脚拉高,程序就从片内4k空间(0000H~0FFFH)读取,超出部分(1000H以后)自动去外部读取,片外(0000H~0FFFH)的4K就浪费掉了。
把EA引脚拉低,只从篇外读取程序,片内的4K就浪费掉了。
三、如何将中断程序设置在程序存储区的任意区域,在程序中该作何种设置?请举例加以说明。
答:
先说明一下片内程序存储空间开始的几个字节:
a0000H~0002H三个特殊单元:51片内总共4k空间(0000H~0FFFH),系统复位后(PC)=0000H,单片机从0000H单元开始取指令执行程序,如果程序不从0000H单元开始,应在0000H~0002H三个单元中存放一条无条件转移指令,以便直接转去执行指定的程序。
b还有一组特殊单元(0003H~002AH),共40个字节,分为五段,作为五个中断元的中断地址区。
这五段,其中:
0003H~000AH 外部中断0中断地址区
000BH~0012H 定时器/计数器0中断地址区
0013H~001AH 外部中断1中断地址区
001BH~0022H 定时器/计数器1中断地址区
0023H~002AH 串行中断地址区
中断响应以后,按照中断种类,自动转到个中断的首地址去执行程序。因此在中断地址区中应存放中断服务程序,但是8个单元难以存下一个完整的中断服务程序,因此通常是在中断首地址开始放一条无条件转移指令,以便中断响应后,通过中断地址区,再转到中断服务程序的实际入口地址去。
这次回答的问题比较啰嗦,仔细体会,不要着急,弄懂弄通。
中断方式: 1)红外探头与51单片机的中断连接,并设置高电平响应中断; 2)增加一个全局变量(统计次数)并初始化为0,在上述中断对应的处理函数中全局变量累加; 3)将全局变量的结果显示到数码管(可以在中断处理函数中显示统计值)。 轮询方式: 1)根据红外探头检测信号的频率,确定轮询的间隔(检测间隔的频率要大于两倍该红外探头检测信号的频率); 2)一次高电平变化,统计一次,并将结果输出至数码管; 上述两种方式,如果想要做得好的,应该考虑信号干扰,程序去抖。
中断:响应消息——每一个消息到来,就会给某一个变量的相应位置1,将新增的消息记录下来(ID |= 0x1;//将bit0置1 );
主程序:解析记录,然后分别处理每一位对应的消息,处理后将该位清零(ID &= (~0x1);//将bit0清0 )。
上述的 *** 作方法中,使用了逻辑运算符,转换为汇编语言时,只有1句的C语言代码变成了不止一句,这就给了中断影响主程序 *** 作同一变量的可乘之机。
下面给出一种解决方案,一种可以在主程序和中断 *** 作同一变量的方案(妈耶,终于点题了)!
使用数组的方法,让中断和主程序中对该变量的 *** 作,浓缩为只要一个指令周期就可以搞定的 *** 作。话不多说,上代码
全局变量:unsigned short bit[16] = {0};
中断: if(消息1 == 消息){ bit[0] = 1;}
主程序:if(bit[0] == 1) { //处理消息1; bit[0] = 0;}
上述的 *** 作方法中,只使用了赋值运算符,转换为汇编语言时,1句C语言代码也只变成了一句汇编代码,只需要一个指令周期的时间去执行,避免了中断影响主程序 *** 作同一变量的可乘之机。
数据都是共享的,没有所谓返回一说比如你在中断子程序内修改了VD0,那么这个VD0就是被实实在在的修改了但是要注意临时变量区,寄存器区等都会在返回程序断点时恢复到以前的值,比如你在主程序内如下 *** 作:LDSM01MOVD1234,AC1LDD=AC1,1234=Q00然后你在中断子程序内即使更改了AC1的值,比如更改为AC1=0,那么返回到主程序后,AC1会自动恢复为1234,即Q00会一直导通
以上就是关于希望回答完整一些,如图全部的内容,包括:希望回答完整一些,如图、中断次数统计变量可以放到主程序中吗、嵌入式中断怎么更改变量的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)