文章目录
一、SDCC和Edsim51介绍
1.SDCC
SDCC是一款免费开源的编译器,它支持标准(ANSI C89 / ISO C90,ISO C99,ISO C11 /ISO C17)C编译。SDCC是由Sandeep Dutta为8位单片机设计的编译器,支持MCS51(8051,8052,8031,8032等)、STM8、PIC、DS80C390,HC08,Z80等十几种架构的单片机的编译。SDCC还是一款跨平台的编译器,支持windows、linux和Mac OS,同一个代码工程可以在不同平台编译和调试。
2.Edsim51
EdSim51(Education Simulation 8051)是一个用于学习和模拟 8051 微控制器的教育软件。它提供了一个仿真环境,允许用户编写、编辑、调试和运行 8051 微控制器的汇编语言程序。 EdSim51 提供了一个实时的仿真环境,可以模拟 8051 微控制器的运行情况。用户可以在仿真环境中编写程序并立即查看其执行结果,而无需实际的硬件设备。EdSim51 包含了一个功能丰富的编辑器和调试器,使用户可以方便地编写、编辑和调试汇编语言程序。调试器可以帮助用户定位和修复程序中的错误。 EdSim51 支持多种8051微控制器的指令集,包括标准的 8051 指令集以及一些扩展指令集。这使得用户可以在仿真环境中尝试不同的指令集,并了解它们之间的区别和优劣。
二、Edsim51虚拟开发板上点亮一个Led灯
1.C语言实现点亮一个LED灯
C语言点灯代码如下:
#include<mcs51/8051.h>
void main()
{
while(1){
P1=0b11111110;
}
}
在SDCC目录的bin文件下创建led.c文件,在命令终端输入指令进行编译:
用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件:
打开Edsim51,将生成的led1.hex文件加载到软件中,点击运行:
观察到P1.0端口为高电平,LED灯点亮
2.汇编语言实现点亮一个LED灯
ORG 0000H
MOV P1 ,#0FEH
END
将程序写入软件,观察LED灯点亮情况:
3.汇编语言点亮Led1灯的代码翻译转换为机器指令
首先,MOV 指令的操作码为 MOV A, immediate,其中 A 是累加器,immediate 是立即数。
P1是目标寄存器,即端口0的寄存器。
#0FEH 是立即数,代表要写入端口0的值,其中 0xFE 的二进制表示为 11111110,我们假设 LED1 连接在 P0 的最低有效位,因此我们想要的是 00000001,即将 P0 的第一位设置为高电平以点亮 LED1。
因此,需要将 MOV P0, #0FEH 转换为对应的机器指令。
首先,MOV 指令的操作码是 MOV A, immediate,即 74H。
立即数 0xFE 转换为十六进制为 FEH。
因此,MOV P0, #0FEH 汇编指令对应的机器指令是:
MOV A, #FEH
MOV P1, A
其中,第一条指令 MOV A, #FEH 的机器指令表示为 74 FE,第二条指令 MOV P0, A 的机器指令表示为 F5。
所以,将上述汇编语言点亮 LED1 的代码手工翻译为机器指令后是:
CODE MNEMONIC HEX VALUE
-------------------------------------
0000 MOV A, #FEH 74 FE
0002 MOV P1, A F5
三、Proteus完成Led灯的点亮和闪烁
1.采用Proteus+SDCC 的C程序编程
将上文生成的led.hex文件加载到Proteus中,观察结果:
2.采用Proteus+Keil C51 的C程序编程
观察结果:
3.采用Proteus 内置汇编语言编译的方式
在Proteus的内置汇编语言中输入汇编代码:
编译,观察结果:
四、总结
本次实验进一步熟悉了LED点灯实验,熟练应用了SDCC编译,Edsim51仿真软件,Proteus画电路图;通过汇编语言与C语言分别在Edsim51软件与Proteus中成功点亮了LED灯,培养了硬件设计与硬件编程的能力。