单片机指令虚拟程序终于完成了

2020-01-27 11:23发布

本帖最后由 wgui 于 2013-8-30 00:24 编辑

之前写了两次都到一半时因为不太了解51结构而结束,这是第三次定,终于写完成了,本人是业余上来的,看了代码不要喷。
我使用的是:STC12C5A60S2:24M晶体。串口调试使用的是BRT计数器.4800波特率。其它芯片没有BRT的就要改了T1。
因为刚完成,并没有增加什么方便测试的功能,下面录制了一个简单的下载过程视频。因没摄像头,只能录制屏幕了,有兴趣的话,可以试试。
因为指令是从STC的文档上看的。发现了文档有不少错误,之前也发过帖子,就是因为在做这个程序。只是个虚拟运行51指令的程序而已,由于算术运算指令介绍的不是很详细,所以内部状态不一定正确,计算指令不知能否正确计算。所以有空的话可以帮测试一下。其它指令应该没有什么错误,文档都比介绍较详细了。我虚拟了一下程序,没有什么问题。
现在只能是完成指令运行,并没有实际动作完成。IO只能控制输出[P0~P4],没有IO输入检测,因为还没想到用什么方式更新虚拟寄存器与实际寄存器同步。不建议改P3输出,因为P3口有下载程序控制,使用的是中断方式,如果改为输出低电平会拼命自动重启下载。现在没有虚拟中断控制系统,目前只能运行512Byte大小的ROM程序因为目前使用内部扩展的RAM作为虚拟ROM.也可以烧定到内部EEPROM第一扇区就可以默认运行了,断电都还在,其它芯片EEPROM不同的地方就要改一下了。
附件中的主程序是虚拟机程序,测试程序是用于运行虚拟机上的,因为我想通过指令形式将程序运行到STM32上。通过命令接口方式控制设备,不要更改太多程序。下面附件的虚拟测试程序是通过定义一个SFR寄存器作为命令之间的接口工作,功能是通过串口发送数据并回应发送的数据,使用主程序默认的4800波特率。不过这样好像没有什么运行效率。现在代码是求成功,暂不为效率想。
所有代码不使用位定义,为以后放到STM32上,位操作都使用移位操作了。
附件中的虚拟测试程序中只有串口测试和LED测试。用while测试LED的输出电平翻转有1.7KHZ,裸机有2M左右,效率哈哈。。。以后有空再完善其它功能。
虚拟51指令下载方式有两种:
用kei编译51测试程序,生成hex,因为hex还有其它东西,所以自己要想方法转成bin。我用isp最新版打开EEPROM方式复制机码到串口窗口通过串口热下载到RAM运行。
第一种是ISP下载时同时将虚拟程序写到内部EEPROM第一扇区,上电就由虚拟机运行了。
第二种是启动虚拟机后,看电路图上的按键,按虚拟程序下载按键[LED亮]就可以下载指令到当前RAM中,再按一次就可以运行了,断电后就没有了。
讲得不是很细,可能不明怎么用。。。其实我也不知道自己在说什么,嘿嘿。。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。