关于keil5和Protues8联合仿真问题,如何解决?

keil5和Protues8联合仿真的时候在主函数里运行在调用外部函数时打断点不停下,直接就跳转到外部函数内了,每个函数都一样,问人结果他让我重装系统
这是仿真一开始

img

这是点击了全速跑一次之后直接到了主函数

img


之后再点一次全速就跑到外部函数了,那个断点啥用没有

img

这个是代码,

#include<regx52.h>

#define u8 unsigned char
#define u16 unsigned int
u8 code weixuan[]={1,2,4,8,16,32,64,128};
                  //0    1    2     3   4    5    6    7    8    9    a     b    c    d    e    f 
u8 code duanxuan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
u8 chushi[8]={0,0,0,0,0,0,0,0};
u8 gewei=0,shiwei=0,baiwei=0,qianwei=0,wanwei=0,shiwan=0;

void delayms(u8 t)
{
            u8 k;
            u8 j;
              for(k=0;k<t;k++)
                for(j=0;j<124;j++);
}

void XianShi()
{
    u8 i;
    
    chushi[7]=duanxuan[gewei];
    chushi[6]=duanxuan[shiwei];
    chushi[4]=duanxuan[baiwei];
    chushi[3]=duanxuan[qianwei];
    chushi[2]=duanxuan[wanwei];
    chushi[0]=duanxuan[shiwan];
    for(i=0;i<8;i++)
    {
        P2=weixuan[i];
        delayms(2);
        P3=chushi[i];
        delayms(2);
    }
}

void TimerInit()
{
    TL0=0Xb0;    
    ET0=1;        
    EA=1;        
    TR0=1;        
}

void Timer() interrupt 1
{
    u8 m=0;
  
    TH0 =(65536-50000)/256;
    TL0 =(65536-50000)%256;
        m++;
        if(m==20);
            {
                m=0;
                gewei++;
                if(gewei==15);
                {
                gewei=0;
                shiwei++;
                    if(shiwei==15)
                    {
                        shiwei=0;
                        baiwei++;
                        if(baiwei==15)
                        {
                            baiwei=0;
                            qianwei++;
                            if(qianwei==15)
                            {
                                qianwei=0;
                                wanwei++;
                                if(wanwei==15)
                                {
                                    wanwei=0;
                                    shiwan++;
                                    if(shiwan==15)
                                    {
                                        shiwan=0;
                                        wanwei=0;
                                        qianwei=0;
                                        baiwei=0;
                                        shiwei=0;
                                        gewei=0;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        void main()
        {            
      TimerInit();            
            while(1)
            {
                delayms(2);
                XianShi();
                delayms(2);
            }
        }

在主函数中调用外部函数时打断点不停下,直接跳转到外部函数内,原因是在主函数中调用外部函数时,主函数和外部函数之间的代码没有被正确地链接在一起
解题思路:确保主函数和外部函数之间的代码在同一个程序文件中,并且在主函数中调用外部函数时,使用“调用”语句将主函数和外部函数链接在一起

不要在中断中加断点,中断服务函数中的断点可能会造成系统运行失败或故障。

你好,使用keil5的纯软件仿真有些问题,很少用仿真,要仿真也要有个硬件进行仿真,纯软件仿真容易出各种乱七八糟的事情好像

STM32+Keil 5+proteus 8 编程、仿真方法汇总

可以借鉴下
https://blog.csdn.net/baibai_CSDN/article/details/108837311

可能是由于Keil5和Proteus8联合仿真时出现了一些问题,可尝试以下方法:

  1. 确认是否正确配置了联合仿真环境。在使用Keil5和Proteus8进行联合仿真时,需要确保已正确配置了联合仿真环境,包括安装了对应的仿真器、设置仿真器的通信参数、设置Proteus的外围器件等。如果配置不正确,可能会导致断点无法正常工作。
  2. 确认Keil5的版本是否匹配。在使用Keil5和Proteus8联合仿真的时候,需要确认Keil5的版本是否与Proteus8版本匹配。如果版本不匹配,可能会导致某些功能无法正常使用。
  3. 清除Keil5的缓存并重新编译。在编译程序代码之前,可以尝试清除Keil5的缓存,并重新编译一次代码。若缓存中存在错误的调试信息,会导致断点无法正常工作。
  4. 确认是否启用了优化选项。在Keil5进行编译时,若启用了优化选项,会优化程序代码并对函数进行内联等操作,可能会导致调试信息出现异常,影响断点的使用。可以尝试关闭优化选项后重新编译进行排查,并在需要调试的函数上加上__attribute__ ((noinline))属性,防止被优化。

如果以上方法都不能解决问题,重装系统是最后的解决方案

  • 这篇博客: 基于protues仿真设计一款乒乓球游戏机中的 电路部分器件及个数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 电路部分器件个数
    球台驱动电路
    74LS194
    2
    计分电路
    74LS160
    4
    74LS48
    4
    74LS04
    2
    74LS32
    16
    74LS08
    4
    控制电路
    74LS74
    2
    74LS00
    2
    74LS32
    1
    74LS08
    2
      两个七段共阴数码管,五个开关,若干导线。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在Keil5和Proteus8联合仿真时,如果在主函数里调用外部函数时打断点不停下,一般是由于两个软件版本不匹配或者仿真设置有问题引起的。可以尝试以下几种方法来解决这个问题:

  1. 检查Keil5和Proteus8是否是最新版本,并且确认它们是兼容的版本。可以去官网或者相关论坛确认最新的版本信息和兼容性。

  2. 检查仿真设置是否正确。需要在Proteus8中设置仿真选项,在Keil5中设置串口调试选项。

  3. 尝试在Keil5中设置“Software Only”选项。在菜单栏中选择“Options”-“Debug”-“Use”-“Use Simulator”,然后勾选上“Software Only”选项。

如果以上方法都不能解决问题,建议重新搭建环境,即重新安装Keil5和Proteus8,然后按照官方文档或者相关教程来进行设置和调试。

以下是修正后的代码:

#include<regx52.h>

#define u8 unsigned char
#define u16 unsigned int

u8 code weixuan[] = {1, 2, 4, 8, 16, 32, 64, 128}; 
u8 code duanxuan[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};

u8 chushi[8] = {0, 0, 0, 0, 0, 0, 0, 0};
u8 gewei = 0, shiwei = 0, baiwei = 0, qianwei = 0, wanwei = 0, shiwan = 0;

void delayms(u8 t) {
    u8 k;
    u8 j;
    for(k = 0; k < t; k++) {
        for(j = 0; j < 124; j++);
    }
}

void display() {
    u8 i;
    
    chushi[7] = duanxuan[gewei];
    chushi[6] = duanxuan[shiwei];
    chushi[4] = duanxuan[baiwei];
    chushi[3] = duanxuan[qianwei];
    chushi[2] = duanxuan[wanwei];
    chushi[0] = duanxuan[shiwan];
    
    for(i = 0; i < 8; i++) {
        P2 = weixuan[i];
        delayms(2);
        P3 = chushi[i];
        delayms(2);
    }
}

void timerinit() {
    TMOD = 0x01;
    TH0 = (65536 - 50000) / 256;    
    TL0 = (65536 - 50000) % 256;
    ET0 = 1;
    EA = 1;
    TR0 = 1;
}

void timer() interrupt 1 {
    u8 m = 0;
  
    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    m++;
    
    if(m == 20) {
        m = 0;
        gewei++;
        
        if(gewei == 15) {
            gewei = 0;
            shiwei++;
            
            if(shiwei == 15) {
                shiwei = 0;
                baiwei++;
                
                if(baiwei == 15) {
                    baiwei = 0;
                    qianwei++;
                    
                    if(qianwei == 15) {
                        qianwei = 0;
                        wanwei++;
                        
                        if(wanwei == 15) {
                            wanwei = 0;
                            shiwan++;
                            
                            if(shiwan == 15) {
                                shiwan = 0;
                                wanwei = 0;
                                qianwei = 0;
                                baiwei = 0;
                                shiwei = 0;
                                gewei = 0;
                            }
                        }
                    }
                }
            }
        }
    }
}

void main() {
    timerinit();
    
    while(1) {
        display();
    }
}

如果我的回答解决了您的问题,请采纳!

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

Keil MDK和Proteus是常用的ARM开发工具,可以实现仿真调试ARM单片机程序。将这两个工具联合使用可以实现更加真实的仿真效果。

但是,在联合使用Keil MDK和Proteus进行仿真调试时,可能会遇到一些问题,主要有:

  1. 编译设置不正确,无法生成Proteus可识别的.hex文件。
    解决:在Keil MDK的项目设置中,勾选"Create HEX File"选项,生成.hex文件。
  2. Proteus无法识别Keil MDK生成的.hex文件。
    解决:需要在Proteus中安装Keil MDK的仿真器插件,并选择使用Keil MDK仿真器。
  3. 仿真调试无法单步执行,无法设置断点。
    解决:这是因为Keil MDK未设计为与第三方仿真工具联合调试,无法实现高级调试功能。这时只能通过Keil MDK的调试功能进行单步执行和断点调试,然后将代码下载至Proteus进行功能模拟验证。
  4. 观察不到变量和外设状态更新。
    解决:这也是因为第3点无法实现高级联合调试导致的。只能在Keil MDK下进行变量和状态的观察。
  5. 编译/仿真出现各种异常错误。

解决:这通常是软件版本、设置参数等不兼容导致的问题:

  • 更新Keil MDK和Proteus到最新兼容版本。
  • careful检查编译设置、仿真参数等,确保设置正确和兼容。
  • 搜索关键词"keil proteus co-simulation problem"等,看是否存在已知相关问题和解决方案。

除此之外,可以参考Keil官方文档中关于和第三方仿真工具联合使用的说明,帮助解决相关问题。