采用汇编语言与C语言两种方式,在Edsim51虚拟开发板上点亮一个Led灯
1.用win+R键打开运行窗口,再输入cmd打开控制台,进入到D盘目录,用 mkdir 命令创建一个实验 目录 led_test,创建或copy 下列C代码文件如:
#include<mcs51/8051.h>
void main()
{
while(1){
P1=0b11111110;
}
}
然后用sdcc --std-sdcc89 led1.c命令编译
注意:上面包含头文件 mcs51 目录下的 8051.h ,里面定义了各个寄存器的宏定义,比如 P1 、 TCON
等,不同公司的芯片其寄存器的地址可能不一样, edSim51 仿真的芯片采用的就是 mcs51 的8051芯
片。
另一个注意的地方是 main 函数是没有返回值的。
第三个注意的地方是程序里为了表示 P1 口的各个位( bit )的值,使用了 0b11111110 这样的二进制字面
量,这是非标准的 sdcc 扩展,为此,需要在编译的时候指定 --std-sdccxx 编译选项,这里 xx 需要按需
要替换为 89 、 99 、 11 、 2x 以适应不同标准,下面是一个参考命令:sdcc --std-sdcc89 led1.c
如果编译成功的话,可以在当期目录下生成需要 led1.* 的文件,其中包括 ihx 文件: led1.ihx ,然后
需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令如下:
sdcc --std-sdcc89 led1.c
成功的话可以得到 led1.hex 执行程序,然后我们就可以用 edSim51 仿真器中的 load 按钮加载 hex 进行仿真 run。
如果编译成功的话,可以在当期目录下生成需要 led1.* 的文件,其中包括 ihx 文件: led1.ihx ,然后需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令如下:
packihx led1.ihx > led1.hex
2.使用EdSim51进行仿真
直接双击打开edsim51di.jar文件
3.采用汇编语言点亮LED灯
点击nwe,输入以下代码:
MOV 90H, #0xFE
点击save按钮,然后run
4.采用C语言点亮LED灯
EdSim51中点击Load,将led1.hex文件打开,将更新频次增加到10000
5.让Led灯周期性闪烁,过程与上相似
汇编代码如下:
ORG 10 ;起始地址
START:SETB P1.0 ;端口置1
LCALL DELAY ;调用延时函数
CLR P1.0 ;端口置0
LCALL DELAY ;调用函数
AJMP START ;跳转到START
DELAY: MOV R7,#250 ;延时函数
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET ;返回主函数
END ;指令结束
c语言代码如下:
#include<mcs51/8051.h>
void delay(int i)
{
while (i--);
}
void main()
{
while (1) {
P1 = 0b11111110;
delay(50000);
P1 = 0b11111111;
delay(50000);
}
}
在Edsim51,把汇编语言点亮Led1灯的代码,手工翻译转换为机器指令
Edsim51 编译生成的机器码指令为:
CODE MNEMONIC HEX VALUE
-------------------------------------
0000 MOV A, #FEH 74 FE
0002 MOV P1, A F5
在Proteus中画出一个与Edsim51虚拟电路原理基本相同的电路,用Proteus仿真完成Led灯的点亮和闪烁
将上述的.hex文件加载到Proteus中
结果如下:
Proteus+keil
keil源码:
#include<reg52.h>
void main ()
{
while (1) {
P1 = 0xFE;
}
}
效果图:
总结
基于SDCC和Edsim51的代码仿真可以帮助我调试和验证单片机程序的功能,对于我们来说是一个很好的学习工具。