找回密码
 立即注册

QQ登录

只需一步,快速开始

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

任何STC单片机都可硬件仿真 在片调试

[复制链接]
跳转到指定楼层
楼主
网上看到资料,任何STC单片机都可硬件仿真。移植到普中开发板,用STC90C516实验通过。版权归原作者。初学者用来理解程序运行过程,深入点可以调试程序,不用反复烧录程序,很好用。

任何一片 STC单片机(如低速 STC89C52,高速 STC12C5A60S2)都支持在片仿真调试,也称为在系统调试,这种调试方式必须在每个需要调试的程序中增加 16行固定不变的代码,并且必须加入 KEIL中自带的两个系统文件,先看下面这个最简单的完整程序吧。
例 2-2:在片调试,让接在 P1.0引脚 LED闪烁发光(工程名:ISD51_Debug.uv2)
#include "stc12c5a.h"  //STC12C5A60S2单片机寄存器定义头文件
#include "ISD51.h"      //系统调试专用
#define _DEBUG     //系统调试专用,调试完成后,发布程序时,只需将该行注释掉即可。
                    //若不注释掉本行,单片机上电后不会自动执行用户程序,只能通过调试环境启动。
sbit P10=P1^0;      
void delay(unsigned long cnt)   
{
  while(cnt>0) cnt--;
}
void main(void)
{
  #ifdef _DEBUG       //系统调试专用
   SCON = 0x50;    //系统调试专用(0101 0000,8位可变波特率,无奇偶校验)
      TMOD = 0x20;   //系统调试专用(定时器工作在方式 2)
      TH1 = 0xfd;     //系统调试专用(11.059MHz晶振,波特率 9600)
      TL1 = 0xfd;     //系统调试专用(11.059MHz晶振,波特率 9600)
      TR1 = 1;        //系统调试专用
      ISDinit();      //系统调试专用
      ISDwait();      //系统调试专用
  #endif              //系统调试专用
  ES=1;               //系统调试专用
  EA=1;               //系统调试专用
  while(1)                           //主程序循环
  {
   #ifdef _DEBUG   //系统调试专用(此行一定不能写在前行“{”后,否则编译出错)
          ISDcheck(); //系统调试专用
   #endif          //系统调试专用
   delay(6);
   P10=~P10;
  }
}   
按正常方式建立工程和 C文件,并将 C文件加入工程,将这个程序代码复制到 C文件中,把 keil安装
目录下\C51\ISD51目录下的 ISD51.A51、ISD51.H两个文件复制到当前工程文件夹中,并把 ISD51.A51添
加到 Source Group组中(与添加 C源程序文件方法相同)。
设置工程,
在Output选项卡选中“Create HEX File”,在Debug选项卡右半块选择“Keil ISD51 In-System
Debugger”, 去掉 Run to main 的选择,点 Settings按钮,设置串口号和波特率,注意,由于上面代码中初始化串口时波特率设的 9600,对应电路板晶振频率是11.059MHz,所以这里的通信波特率只能设为9600,否则进入不了调试界面。
试状态前需要重新下载程序或重新给单片机系统上电,或者通过芯片 9脚外部复位按键复位单片机,否则可能无法进入调试状态。(提示连接错误)
特别提示:单步调试或程序中设有断点,整个程序执行速度特别缓慢(比实际运行速度慢 100 倍左右),由于这个原因,对于常见的通信程序,比如有时间限制的 18B20程序,实际程序下载到单片机后运行可能完全正常,而单步或断点调试却得不到正确的结果,对于这种情况的调试,可在通信程序开始时关闭串口中断(ES=0;),通信程序结束时打开串口中断(ES=1;),这样就不影响程序速度,另外全速运行时也是不会影响程序速度的。
如果 STC的其它中断函数拥有的中断优先级别比 ISD51 更高或者相同,要实现断点或程序单步就不行了,默认状态下, ISD51 中断函数使用的中断优先等级为 0级(0低级中断,1高级中断),所以默认状态下是不能调试带有中断函数的程序。
目前 STC 最新的单片机型号 STC15F2K60S2  可用 IAP15F2K61S2 仿真芯片进行仿真,IAP15F2K61S2仿真芯片也只能仿真 STC15F2K60S2 单片机,此仿真芯片使用方法详见 STC 官方提供的 ISP 下载软件。使用此仿真芯片优点是不需要在代码中增加额外代码,不需要将 HEX 文件下载进入单片机,对程序执行速度也没什么影响,不足之处任然要占用串口(P3.0、P3.1),若在代码中有操作串口(P3.0、P3.1)的命令,将会中断程序的调试过程,如下图所示。
另外 STC15 系列单片机引脚排列与 STC12 系列不兼容,连电源供电引脚都不一样,不过还好,两种单片机互换不会因电源引脚不同烧坏单片机,只是不能正常工作而已。   
2.3.3 各种仿真方法对比
使用 P89V51RD2仿真芯片优点是价格便宜,操作简便,运行速度快,可仿真汇编语言和 C语言编写的代码,最适用于仿标准 8051内核的单片机,如AT89C51,AT89C52等。
STC单片机的在片调试功能不但可仿真标准 8051的各个功能,还能仿 STC新增的其它功能,如 AD转换、PWM等,缺点是要在每一个需要调试的程序中增加额外的专门用于调试的代码,并且需要占用定时器 0,如果用户程序中含有软件延时程序,程序一旦进入延时程序就运行相当缓慢(比实际硬件运行速度慢 100倍),如果代码中的其它中断函数拥有的中断优先级别相比 ISD51 相同或者更高,要实现断点或程序单步就不能了。在仿真复杂程序时,运行不稳定而经常死机,仿真SPI通信程序或 AD转换程序时可能执行了一条对相
应寄存器的操作命令后在 Watch窗口中根本看不到寄存器内容的变化,当然,出现这种类似的不可思议的问题时首先需要检查KEIL的优化级别是否为0,若不为0首先把优化级别改为0,另外可将光标定位在Watch窗口中变量值的位置,敲回车键刷新一下显示看看数值是否有变化。也可单击工具栏“Toolbox”按钮如下
图所示:
单击后出现了屏幕刷新的小窗口和按钮,单击按钮就可刷新数据。
从以上介绍可以看出,P89V51RD2芯片使用方便,主要用于仿传统 51单片机,ISD51适用于任何一款STC单片机,使用麻烦,稳定性较差,IAP15F2K61S2 价格低廉(10 元以下),使用方便,专用于 STC15F2K60S2单片机仿真,3种仿真方式都必须占用标准串口,对串口通信部分无法仿真,实际串口通信中就得特别留意波特率是否正确,计算机输出字节数据时有时会多输出无关的字节,比如用串口助手或自己编写代码发送 3字节数据,在有效的 3字节前有可能产生一个无效字节,导致通信错误,单片机程序应加入帧头识别,只有第一字节为有效帧头才开始正式接收数据,这在以后章节(单总线 18B20 通信)会有完整实例。有了硬件仿真,千万别忘了软件仿真,一般的程序调试都应先使用软件仿真,软件仿真有助于加强程序的理解,软件仿真正常后下载到单片机观察运行结果,如果有问题再次通过软件仿真分析原因,最后才考虑硬件仿真。
普中开发板STC90c516RD测试通过。

以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
OK-任何STC单片机都可硬件仿真-sim.7z (1.1 MB, 下载次数: 11)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1042619 发表于 2022-11-22 11:58 | 只看该作者
感谢楼主精彩分享,51黑因您而精彩!
  %1.9 的 STC8H8K64U-45MHz-TSSOP20, 能用自带的硬件USB下载,硬件USB仿真,没有理由再外接 %2以上的 CH340了,还不能仿真。
    楼主用的老的STC89C52只支持串口烧录,不支持硬件USB烧录,可以去厂家申请一个开天斧试试STC8H8K64U 的震撼资源,打开认知新世界

1.jpg.jpg (175.21 KB, 下载次数: 53)

1.jpg.jpg

2.JPG.jpg (192.22 KB, 下载次数: 66)

2.JPG.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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