仿真软件中如何用74LS148扩展中断

仿真软件中如何用74LS148扩展中断,第1张

用74LS148扩展中断

#include<reg51h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

sbit LED=P1^0;

void EX_INT0() interrupt 0

{

 uchar bi=P2&0x07;

 P0=_cror_(0x7F,bi);

}

void main()

{

 uint i;

 IE=0x81;

 IT0=0;

 while(1)

  {

    LED=!LED;

       for(i=0;i<30000;i++)

       ;

       if(INT0==1)

       P0=0xFF;

  }

}

如果ProteusSTM32仿真无法进入定时器中断,可能是因为定时器中断的配置问题造成的。请检查定时器中断的中断优先级是否已正确设置,并且中断函数是否已正确添加到中断向量表中,最后再检查中断是否已正确使能,这样就可以保证定时器中断的正常运行了。

一、代码写的也很清楚,问题也很明白。先说一下你这个程序想完成的功能吧:

P0口的数码管属于后台程序,他一直循环计数 0~8 。他能被任何一个中段所打断,并且该中断退出后,P0口的数码管能接着被打断之前的数字继续计数,而不是从 0 重新开始,这一点你的程序没有做到。

P2口的数码管由 INT0 中断控制,中断一次,只完成一次 0~8 的计数。他可以打断 P0 口,而不能打断 P1 口,因为 INT0 的优先级低。如果 INT0 被 INT1 打断了,INT1 退出后,INT0 应接着原来的数继续计数,而不是 INT1 退出之后,INT0 不会动了,这一点你的程序也没做到。

P1口的数码管由 INT1 中断控制,中断一次,也完成一次 0~8 的计数。他可以打断 P0口,也可以打断 P2口(INT0),他退出之后,被中断的程序应该恢复之前的工作。

这些问题都是由于在中断服务程序中,没有对现场进行保护引起的。问题找到了,解决方法很简单,就是在每个中断服务程序中加上现场保护就行了,即在每个中断服务程序的开始各加一条语句“PUSH    ACC”即可,现场恢复你的程序里边有。

二、下面是修改过的程序,并按照题目的要求添加了注释

ORG 0000H

SJMP STAR

ORG 0003H

SJMP INT0S

ORG 0013H

SJMP INT1S

ORG 0030H

STAR:

MOV IE,#85H //中断允许

MOV TCON,#05H  //低电平触发中断

MOV P3,#0FFH  //P3口拉高,为两个按钮服务

SETB PX1  //提高 INT1 的优先级

ST0:

MOV A,#1 //立即数 1 送 A,准备读 0 的段码

ST1:

PUSH ACC //入栈保存

ACALL SEG7 //去读段码

MOV P0,A //送 P0 口显示

ACALL DELAY  //延时一小会

POP ACC //把保存的 立即数d回 A

INC A //A 自身加 1,为读取下一个段码做准备

CJNE A,#10,ST1 // A=10:往下走,否则转到ST1

SJMP ST0 //开始下一轮 0~8 的显示

INT0S:

PUSH ACC //该句是添加的,用于现场保护

MOV A,#0

LOOP:

INC A

PUSH ACC

ACALL SEG7

MOV P2,A

POP ACC

ACALL DELAY

CJNE A,#9,LOOP

POP ACC //原来就有,用于现场恢复

MOV P2,#0FFH

RETI

INT1S:

PUSH ACC //这句也是现场保护

MOV A,#0

LOOP1:

INC A

PUSH ACC

ACALL SEG7

MOV P1,A

POP ACC

ACALL DELAY

CJNE A,#9,LOOP1

MOV P1,#0FFH

POP ACC //现场回复

RETI

DELAY:

MOV R7,#250

D1:

MOV R6,#250

D2:

NOP

NOP

NOP

NOP

NOP

NOP

NOP

NOP

DJNZ R6,D2

DJNZ R7,D1

RET

SEG7:

MOVC A,@A+PC

RET  //这条语句一字节,所以执行上句之前 A 要加 1

DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H

END

如果感到满意,你就跺跺脚,踩------纳!!!!!

你的程序有问题,开中断不能在中断函数里面开,这就好像把钥匙放进保险柜一样,永远都无法打开保险柜了。

你把开中断的程序放到main函数里面就可以执行中断了。另外不能在中断函数的一开始就关中断(即:把EX0=0;挪到最后一个大括号前面)

以上就是关于仿真软件中如何用74LS148扩展中断全部的内容,包括:仿真软件中如何用74LS148扩展中断、proteusstm32仿真无法进入定时器中断、(keli和Protus仿真软件)单片机中断实验程序代码,小部分有错误,求修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10088391.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存