找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 804|回复: 9
打印 上一主题 下一主题
收起左侧

一个Proteus仿真模拟单片机中断的问题,请指教

[复制链接]
跳转到指定楼层
楼主
protues线路图如下:


keil5代码如下:
#include <reg52.h>

sbit k3=P3^2;
#define led P2

void Delay100ms(unsigned int ms)        //@12.000MHz
{
        unsigned char data i, j;
        while(ms>0)
        {
                i = 195;
                j = 138;
                do
                {
                        while (--j);
                } while (--i);
                ms--;
        }
}

void Init_interrupt()
{
        IT0=1;
        EX0=1;
        EA=1;
}

void main()
{
        Init_interrupt();
        while(1);
}

void k3_led() interrupt 0
{
        Delay100ms(1);
        if(k3==0)
        {
                led=!led;
                Delay100ms(1);
        }
}


仿真报错如下


如果把led用位定义,操作单个led灯是正常.这是什么BUG?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2023-10-11 20:15 | 只看该作者
led=!led; 改成 led=~led;
回复

使用道具 举报

板凳
ID:1093723 发表于 2023-10-11 20:26 | 只看该作者
在使用Proteus进行STM32单片机仿真时,某些情况下会发现中断无反应的现象,即中断未能正常触发或中断触发后程序无法正常运行。这种问题可能会对开发过程造成严重影响,所以我们需要找出问题的原因并解决它。  首先,我们需要确认中断向量表是否正确。在STM32中,中断向量表存储在存储器的前面一段,它是中断服务程序的入口地址。如果中断向量表设定错误,将会导致中断无法正常触发。在Proteus仿真中,可以使用Debug功能验证向量表的位置和地址是否正确。  其次,检查中断服务程序是否正确编写。中断服务程序一般由ISR函数(中断服务函数)和IRQ函数(中断请求函数)两部分组成。中断请求函数将中断请求标志位清零并跳转到中断服务函数,ISR函数处理中断请求并返回原程序。如果这两部分出现了错误,就会导致中断无反应。在Proteus仿真中,可以使用Debug功能逐行调试中断服务程序,查看程序执行情况是否正确。  第三,检查中断优先级设置是否正确。在STM32中,不同的中断优先级可能会产生中断嵌套,如果嵌套深度过大,将会导致CPU处理中断的效率降低。因此,我们需要根据实际应用需要,合理设置中断优先级,以避免出现中断嵌套的情况。在Proteus仿真中,可以使用NVIC Registers查看中断控制器中的优先级设置是否正确。  最后,检查硬件连接是否正确。在STM32中,一些外设和中断引脚通过外部中断连接,如果硬件连接出现问题将会导致中断无法正常触发。因此,我们需要仔细检查外设和中断引脚的连接是否正确。在Proteus仿真中,可以使用Schematic Editor查看连接是否正确。  总之,在Proteus仿真中,出现中断无反应的问题需要通过多种方法进行排查和解决。我们需要仔细检查中断向量表、中断服务程序、中断优先级设置和硬件连接等方面,以确保仿真能够正常进行,避免延误项目进度。
回复

使用道具 举报

地板
ID:152785 发表于 2023-10-11 21:04 | 只看该作者
xuyaqi 发表于 2023-10-11 20:15
led=!led; 改成 led=~led;

试了,同样报错,下到板子上,和仿真效果一样
回复

使用道具 举报

5#
ID:18307 发表于 2023-10-12 10:04 | 只看该作者
v115488 发表于 2023-10-11 21:04
试了,同样报错,下到板子上,和仿真效果一样

在初始化里加上  INT0 = 1;
在中断里把if比较去掉试一下
因为K3为低电平时 就进中断了
要不把2个延时都去掉,中断里只保留1句LED取反 试一下看进不进中断
回复

使用道具 举报

6#
ID:94031 发表于 2023-10-12 10:11 | 只看该作者
v115488 发表于 2023-10-11 21:04
试了,同样报错,下到板子上,和仿真效果一样

中断里不要用延时,我把中断屏蔽后功能是正常的,
回复

使用道具 举报

7#
ID:94031 发表于 2023-10-12 10:21 | 只看该作者
v115488 发表于 2023-10-11 21:04
试了,同样报错,下到板子上,和仿真效果一样

改了后的效果。 效果.zip (4.72 MB, 下载次数: 0)
回复

使用道具 举报

8#
ID:94031 发表于 2023-10-12 16:34 | 只看该作者
xuyaqi 发表于 2023-10-12 10:21
改了后的效果。


回复

使用道具 举报

9#
ID:152785 发表于 2023-10-12 21:51 | 只看该作者

首先感谢您的回复,跟您添麻烦了,问题已解决
过程是这样的:
今天把代码反复改了又改,仿真的时候按一下k3,CPU总是飚的70%,然后和昨天一样报错,自动终止仿真.
屏蔽掉中断,代码都精简到只有按键和翻转了,还是飚70%.
我才意识到可能是Protues这边出问题了.
你仿真正常
然后我就对比我们两个的线路,发现你用的是单个电阻,我用的是排阻,果断拆除排阻,问题完美解决,再次感谢

讨论:
排阻不是单电阻的集合体吗,Protues出BUG了?
回复

使用道具 举报

10#
ID:108361 发表于 2023-10-26 18:37 | 只看该作者
v115488 发表于 2023-10-12 21:51
首先感谢您的回复,跟您添麻烦了,问题已解决
过程是这样的:
今天把代码反复改了又改,仿真的时候按一下k3 ...

不要过于相信proteus,要相信物理定律
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表