基于SDCC和Edsim51的代码仿真

本文介绍了如何使用SDCC编译器和Edsim51仿真软件进行8051单片机的程序开发。详细讲述了如何用汇编和C语言在Edsim51上点亮LED灯,以及如何手动转换汇编代码为机器指令并与编译器生成的机器码对比。此外,文章还分享了作者的嵌入式开发经验及学习资源。

一、SDCC和Edsim51介绍

1.SDCC

SDCC(Small Device C Compiler),它是一款专门为小型微控制器设计的免费开源C语言编译器。SDCC主要用于支持8051架构及其他一些嵌入式系统的软件开发。主要用于嵌入式系统的软件开发。它专注于为小型微控制器(如Intel 8051系列、Maxim 80DS390、Zilog Z80、Motorola 68HC08等)生成高效的目标代码。SDCC包含一系列工具,包括预处理器、编译器、汇编器、链接器以及优化器,并且提供了一个名为SDCDB的源代码级调试工具。

2.Edsim51

Edsim51(Education Simulation 8051)是一款基于8051单片机的仿真软件。它提供了一个可视化的界面,可以模拟和调试8051单片机的程序。通过Edsim51,用户可以编写、调试和运行8051单片机的汇编语言程序,以及观察程序在单片机上的执行过程。该软件还提供了丰富的仿真功能,如单步执行、断点设置、寄存器监视等,方便用户进行程序调试和性能优化。

二、在Edsim51虚拟开发板上点亮一个Led灯

1.汇编语言点亮

注意,在仿真运行之前,Edsim51的Update Frequency (刷新频率)要加大到10000或更高。

汇编语言比较简单,因为LED0 接在P1.0端口上,8051中P1.0的地址固定为 90H,因此,对这个地址(指针)对应的寄存器写入立即数 0(低电平),就可以是 LED0电路导通,亮灯。

(1)代码如下

MOV 90H, #0xFE
或者
MOV 0x90,#0xFE
或者
MOV 0x90,#254

(2)代码解释
MOV 90H, #0xFE为例
MOV”为操作码
90H ,#0xFE”为操作数
90H”为内存地址(H是16进制后缀,而51单片机中P1口的字节(内存)地址为90H,位地址为90H~97H。);
#0xFE”为立即数

这段代码的意思是将立即数0xFE(十六进制数,二进制即为1111 1110)的值赋给51单片机的P1端口。即P1.0为低电平,其他的7个为高电平。

(3)实验图
在这里插入图片描述

观察到P1.0端口的LED灯被低电平点亮。

2.C语言点亮

说明:Edsim51自身只能编译汇编语言,C语言程序需要借助其他C编译器(比如SDCC for 8051或 Keil for
8051)转换为汇编和二进制执行程序(.hex)才能仿真运行
(1)代码如下

#include<mcs51/8051.h>
void main()
{
  while(1){
    P1=0b11111110;
  }
}

(2)操作步骤(注意跟上哥的节奏!)

①在SDCC的bin目录下,新建一个文本文档,将代码写入。
在这里插入图片描述
②在bin里另存该文本文档后缀为.c
在这里插入图片描述
③打开命令提示符框进行如图操作在这里插入图片描述
在这里插入图片描述

④为后续Edsim51和Proteus生成.hex文件,需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令如下

packihx led1.ihx > led1.hex

在这里插入图片描述

输入dir,观察到已生成.hex文件。

再在bin里看一下,led1.hex生成了
在这里插入图片描述
(3)Edsim51结果验证
在这里插入图片描述
将在 update freq 改为 50000,依次点击New,Load。加载生成的.hex文件。

点击Run,结果如下图所示
在这里插入图片描述

LED灯被点亮!!!(白色表示灭,最右边的红色表示 LED 0 灯亮),在右边可以看到 P1 口的状态( 0 或 1 )。

3.尝试让Led灯周期性闪烁

(1)代码如下

LOOP:SETB 90H ;led0置1
	  LCALL DELAY ;调用延时函数
	  CLR 90H    ;led0置0
	  LCALL DELAY 
	  AJMP LOOP  ;跳转到LOOP
	
DELAY: MOV R7,#250 ;延时函数
D1:	   MOV R6,#250
D2:    DJNZ R6,D2
	   DJNZ R7,D1
	   RET  ;返回主函数
	   END ;指令结束


(2)实验图
请添加图片描述

三、在Edsim51,把汇编语言点亮Led1灯的代码,手工翻译转换为机器指令,与Edsim51 编译生成的机器码指令进行对比

汇编代码

MOV 90H, #0xFE

手工翻译
根据8051指令集大全手册查到
在这里插入图片描述
MOV 对应的OpCode(操作码、机器码)为75。
90H 对应的OpCode为90。
0xFE 对应的OpCode为FE。

Edsim51 编译生成
在这里插入图片描述
**MOV 对应的OpCode为75。
90H 对应的OpCode为90。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数嵌入式工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

img

img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!! (备注:嵌入式)

img

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

mg src=“https://i-blog.csdnimg.cn/blog_migrate/0ccccd71be47982c4b2cd5563138dedc.jpeg” alt=“img” style=“zoom: 67%;” />

最后

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!

更多资料点击此处获qu!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值